Heim> Java> javaLernprogramm> Hauptteil

So verwenden Sie EasyExcel zum Zusammenführen von Zellen in Java

王林
Freigeben: 2023-04-27 08:55:15
nach vorne
5386 Leute haben es durchsucht

1. Projektszenario:

Einführung: Beim Exportieren des Erstattungsformulars sollte automatisch das entsprechende Formular gemäß der angegebenen Excel-Vorlage ersetzt und anschließend ein neues Excel generiert werden. In der angegebenen Excel-Vorlage wurden einige Felder mit Zellen zusammengeführt, wie unten gezeigt.

So verwenden Sie EasyExcel zum Zusammenführen von Zellen in Java

2. Problembeschreibung

Da ein Erstattungsformular mehrere Erstattungsinhalte enthalten kann, können Sie sehen, wann Wenn die Linie die voreingestellte Linie in der Vorlage überschreitet, wird die Linie automatisch umbrochen, aber die Zellen werden nicht automatisch entsprechend dem Stil in der Vorlage zusammengeführt, wenn die Linie unterbrochen wird, wie unten gezeigt.

So verwenden Sie EasyExcel zum Zusammenführen von Zellen in Java

3. Ursachenanalyse:

Zunächst können Sie Excel intuitiv sehen für Daten Beim automatischen Einfügen und Umbrechen werden die umgebrochenen Daten nicht automatisch entsprechend dem Stil der vorherigen Zeile zusammengeführt.
Also habe ich darüber nachgedacht, diese Spalten mithilfe von Code manuell zusammenzuführen und dann Rahmenstile hinzuzufügen, um das Problem zu lösen.

4. Lösung:

  1. Es ist zu beachten, dass gemäß den oben genannten Ideen Zellen direkt zusammengeführt und dann hinzugefügt werden Grenzen lösen das Problem nicht direkt.

  2. Sie müssen zuerst jede leere Zelle auf der Rückseite erstellen und sie dann zusammenführen, um das Problem zu lösen. Der Code zum Erstellen der Zellen befindet sich unterCustomCellWriteHandler code> Beschreibung in der Klasse. CustomCellWriteHandler类中说明。

这也算是耗费一整天时间踩的坑。。。

public static void outExcelBalance(String modelFile, String newFile, Map map, List 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 rowsBorderSet= new HashSet<>(); CustomCellWriteHandler customCellWriteHandler = null; //TODO 单元格合并 List 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(); }*/ } }
Nach dem Login kopieren

单元格合并MyMergeStrategy类代码:

public class MyMergeStrategy extends AbstractMergeStrategy { //合并坐标集合 private List cellRangeAddresss; //构造 public MyMergeStrategy(List 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); } } } } }
Nach dem Login kopieren

单元格样式CustomCellWriteHandler

Dies kann als eine Grube betrachtet werden, deren Betreten einen ganzen Tag dauerte. . .

public class CustomCellWriteHandler implements CellWriteHandler { private static final Logger LOGGER = LoggerFactory.getLogger(CustomCellWriteHandler.class); //标黄行宽集合 private Set rowIndexs; //构造 public CustomCellWriteHandler(Set 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 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()); } } } } } }
Nach dem Login kopieren

ZellenzusammenführungMyMergeStrategyKlassencode:

1. //创建单元格样式 CustomCellWriteHandler customCellWriteHandler = new CustomCellWriteHandler(参数按需给定); 2. //单元格进行合并 List 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();
Nach dem Login kopieren

ZellenstilCustomCellWriteHandlerKlassencode:

rrreee# #5. Zusammenfassung

Kernschritte: ##rrreee##Hinweis: Als ich mit der Reparatur begann, dachte ich nicht, dass in Zukunft jede leere Zelle erstellt werden muss zuerst herauskommen, bevor die Zusammenführung durchgeführt werden kann. Ich dachte immer, es sei ein Werkzeugproblem, aber dann las ich die Lösungen weiter und sah, dass es hieß, dass zuerst leere Zellen erstellt und dann zusammengeführt werden müssten. Letztendlich war es perfekt gelöst. #### In Bezug auf den Codeteil sind viele unnötige Dinge eingemischt, da es sich um Geschäftscode handelt. ##

Das obige ist der detaillierte Inhalt vonSo verwenden Sie EasyExcel zum Zusammenführen von Zellen in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!