Cara menggunakan EasyExcel untuk menggabungkan sel dalam Java
1. Senario projek:
Pengenalan: Mengeksport borang pembayaran balik hendaklah menggantikan secara automatik yang sepadan mengikut templat excel yang ditentukan, dan kemudian menjana semula excel baharu. Dalam templat excel yang diberikan, beberapa medan telah digabungkan sel, seperti ditunjukkan di bawah.
2. Huraian Masalah
Memandangkan borang pembayaran balik mungkin mengandungi berbilang kandungan pembayaran balik, dapat dilihat apabila kandungan pembayaran balik melebihi pratetap nilai dalam templat, Apabila garis yang ditentukan ditentukan, garisan itu akan dibalut secara automatik, tetapi sel tidak akan digabungkan secara automatik mengikut gaya dalam templat apabila garisan dibalut, seperti yang ditunjukkan di bawah.
3. Analisis sebab:
Pertama sekali, anda boleh melihatnya secara intuitif apabila excel memasukkan data dan membalut baris secara automatik , garis putus Data tidak digabungkan secara automatik mengikut gaya baris sebelumnya.
Jadi saya terfikir untuk menggabungkan lajur ini secara manual menggunakan kod, dan kemudian menambahkan gaya sempadan untuk menyelesaikan masalah.
4. Penyelesaian:
Perlu diingat bahawa mengikut idea di atas, secara langsung menggabungkan sel dan kemudian menambah sempadan tidak dapat menyelesaikan masalah secara langsung.
Anda perlu mencipta setiap sel kosong di bahagian belakang dahulu, dan kemudian menggabungkannya bersama-sama untuk menyelesaikan masalah Kod untuk mencipta sel dijelaskan dalam kelas
CustomCellWriteHandler
di bawah.
Ini boleh dianggap sebagai perangkap yang mengambil masa sehari suntuk untuk dilalui. . .
public static void outExcelBalance(String modelFile, String newFile, Map<String, Object> map, List<FillDataExpense> fillData, HttpServletResponse response, String fileName){ //定义model模板中默认的行数 int firstRow = 7; //excel中表示第八行,即模板中默认的一条 int lastRow = 7; InputStream is = null; File file = new File(modelFile); File file1 = new File(newFile); //String file1Name = file1.getName(); BufferedInputStream bis = null; try { if (!file.exists()) { copyFileUsingJava7Files(file, file1); } //TODO 单元格样式 Set<Integer> rowsBorderSet= new HashSet<>(); CustomCellWriteHandler customCellWriteHandler = null; //TODO 单元格合并 List<CellRangeAddress> cellRangeAddresss = new ArrayList<>(); if (ListUtils.isNotNull(fillData)){ if (fillData.size() > 1){ //合并每条报销单的第3-10列 for (int i = 1; i < fillData.size(); i++) { firstRow++; lastRow++; cellRangeAddresss.add(new CellRangeAddress(firstRow, lastRow, 2, 9)); cellRangeAddresss.add(new CellRangeAddress(firstRow, lastRow, 10, 11)); rowsBorderSet.add(firstRow); } } } customCellWriteHandler = new CustomCellWriteHandler(rowsBorderSet); MyMergeStrategy myMergeStrategy = new MyMergeStrategy(cellRangeAddresss); ExcelWriter excelWriter = EasyExcel.write(newFile) //注册单元格式 .registerWriteHandler(customCellWriteHandler) //注册合并策略 .registerWriteHandler(myMergeStrategy) .withTemplate(modelFile).build(); WriteSheet writeSheet = EasyExcel.writerSheet().build(); FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); if (!ListUtil.listIsEmpty(fillData)){ excelWriter.fill(fillData, fillConfig, writeSheet); //excelWriter.fill(fillData, fillConfig, writeSheet); } excelWriter.fill(map, writeSheet); excelWriter.finish(); response.setHeader("content-type", "text/plain"); response.setHeader("content-type", "application/x-msdownload;"); response.setContentType("text/plain; charset=utf-8"); response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("utf-8"),"ISO8859-1")); byte[] buff = new byte[1024]; OutputStream os = null; os = response.getOutputStream(); bis = new BufferedInputStream(new FileInputStream(file1)); int i = bis.read(buff); while (i != -1) { os.write(buff, 0, buff.length); os.flush(); i = bis.read(buff); } } catch (Exception e){ LOGGER.error(e.getMessage()); } finally { if (bis != null) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } // 删除生成文件 /*if (file1.exists()) { file1.delete(); }*/ } }
Gabungan selMyMergeStrategy
Kod kelas:
public class MyMergeStrategy extends AbstractMergeStrategy { //合并坐标集合 private List<CellRangeAddress> cellRangeAddresss; //构造 public MyMergeStrategy(List<CellRangeAddress> cellRangeAddresss) { this.cellRangeAddresss = cellRangeAddresss; } @Override protected void merge(Sheet sheet, Cell cell, Head head, Integer integer) { if (ListUtils.isNotNull(cellRangeAddresss)) { if (cell.getRowIndex() == 7 ) { for (CellRangeAddress item : cellRangeAddresss) { sheet.addMergedRegionUnsafe(item); } } } } }
Gaya selCustomCellWriteHandler
Kod kelas:
public class CustomCellWriteHandler implements CellWriteHandler { private static final Logger LOGGER = LoggerFactory.getLogger(CustomCellWriteHandler.class); //标黄行宽集合 private Set<Integer> rowIndexs; //构造 public CustomCellWriteHandler(Set<Integer> rowIndexs) { this.rowIndexs = rowIndexs; } public CustomCellWriteHandler() { } @Override public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) { LOGGER.info("beforeCellCreate~~~~"); } @Override public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { LOGGER.info("afterCellCreate~~~~"); } @Override public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) { } @Override public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { //获取工作簿 // HSSFWorkbook wb = new HSSFWorkbook(); // //获取sheet // HSSFSheet sheet = wb.createSheet(); // HSSFRow row = sheet.createRow(); // HSSFCellStyle style = wb.createCellStyle(); // 这里可以对cell进行任何操作 if (CollectionUtils.isNotEmpty(rowIndexs)) { Workbook workbook = writeSheetHolder.getSheet().getWorkbook(); CellStyle cellStyle = workbook.createCellStyle(); Sheet sheet = writeSheetHolder.getSheet(); cellStyle.setAlignment(new HSSFWorkbook().createCellStyle().getAlignment()); cellStyle.setBorderBottom(BorderStyle.THIN); //下边框 cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); cellStyle.setBorderLeft(BorderStyle.THIN);//左边框 cellStyle.setBorderTop(BorderStyle.THIN);//上边框 cellStyle.setBorderRight(BorderStyle.THIN);//右边框 cellStyle.setWrapText(true);//自动换行 //字体 // Font cellFont = workbook.createFont(); // cellFont.setBold(true); // cellStyle.setFont(cellFont); // //标黄,要一起设置 // cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); //设置前景填充样式 // cellStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex());//前景填充色 if (rowIndexs.contains(cell.getRowIndex())) { Row row = null; //循环创建空白单元格 for (int i = 0; i < rowIndexs.size(); i++) { for (Integer rowIndex : rowIndexs){ //创建4-10列的空白格 row = sheet.getRow(rowIndex.intValue()); if (row == null){ row = sheet.createRow(rowIndex.intValue()); } for (int j = 3; j <= 9; j++) { //获取8行的cell列 cell = row.createCell(j); cell.setCellStyle(cellStyle); cell.setCellValue(" "); LOGGER.info("第{}行,第{}列创建空白格。", cell.getRowIndex(), j); } //创建12列的红白格 cell = row.createCell(11); cell.setCellStyle(cellStyle); cell.setCellValue(" "); LOGGER.info("第{}行,第11列创建空白格。", cell.getRowIndex()); //创建21列的空白格 cell = row.createCell(21); cell.setCellStyle(cellStyle); cell.setCellValue(" "); LOGGER.info("第{}行,第21列创建空白格。", cell.getRowIndex()); } } } } } }
5 🎜>1.
//创建单元格样式
CustomCellWriteHandler customCellWriteHandler = new CustomCellWriteHandler(参数按需给定);
2.
//单元格进行合并
List<CellRangeAddress> cellRangeAddresss = new ArrayList<>();
//例如:从firstRow行到lastRow行的2列到9列合并
cellRangeAddresss.add(new CellRangeAddress(firstRow, lastRow, 2, 9));
cellRangeAddresss.add(new CellRangeAddress(firstRow, lastRow, 10, 11));
MyMergeStrategy myMergeStrategy = new MyMergeStrategy(cellRangeAddresss);
3.
//注册以上两种策略
ExcelWriter excelWriter = EasyExcel.write(newFile)
//注册单元格式
.registerWriteHandler(customCellWriteHandler)
//注册合并策略
.registerWriteHandler(myMergeStrategy)
.withTemplate(modelFile).build();
Salin selepas log masukNota: Semasa saya mula membaiki, saya tidak menyangka bahawa setiap sel kosong pada masa hadapan perlu dicipta sebelum digabungkan. Saya selalu fikir ia adalah masalah alat, tetapi kemudian saya terus membaca penyelesaian dan melihat bahawa ia dikatakan bahawa sel kosong perlu dibuat terlebih dahulu dan kemudian digabungkan Akhirnya, ia diselesaikan dengan sempurna.
Mengenai bahagian kod, memandangkan ia adalah kod perniagaan, terdapat banyak perkara yang tidak perlu dicampurkan. 1. //创建单元格样式 CustomCellWriteHandler customCellWriteHandler = new CustomCellWriteHandler(参数按需给定); 2. //单元格进行合并 List<CellRangeAddress> cellRangeAddresss = new ArrayList<>(); //例如:从firstRow行到lastRow行的2列到9列合并 cellRangeAddresss.add(new CellRangeAddress(firstRow, lastRow, 2, 9)); cellRangeAddresss.add(new CellRangeAddress(firstRow, lastRow, 10, 11)); MyMergeStrategy myMergeStrategy = new MyMergeStrategy(cellRangeAddresss); 3. //注册以上两种策略 ExcelWriter excelWriter = EasyExcel.write(newFile) //注册单元格式 .registerWriteHandler(customCellWriteHandler) //注册合并策略 .registerWriteHandler(myMergeStrategy) .withTemplate(modelFile).build();
Atas ialah kandungan terperinci Cara menggunakan EasyExcel untuk menggabungkan sel dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4

Java ialah bahasa pengaturcaraan popular yang boleh dipelajari oleh pembangun pemula dan berpengalaman. Tutorial ini bermula dengan konsep asas dan diteruskan melalui topik lanjutan. Selepas memasang Kit Pembangunan Java, anda boleh berlatih pengaturcaraan dengan mencipta program "Hello, World!" Selepas anda memahami kod, gunakan gesaan arahan untuk menyusun dan menjalankan program, dan "Hello, World!" Pembelajaran Java memulakan perjalanan pengaturcaraan anda, dan apabila penguasaan anda semakin mendalam, anda boleh mencipta aplikasi yang lebih kompleks.
