From 1bbac1a2af0a774962e3f2398ceb1efb531da161 Mon Sep 17 00:00:00 2001 From: 许鹏程 <1821349743@qq.com> Date: 星期四, 29 六月 2023 13:59:28 +0800 Subject: [PATCH] poi、easyexcel、poi-tl升级 ,合并空调中的报表、数据源模块 --- src/main/java/com/product/print/util/DynamicTableRenderPolicy.java | 227 ++++++++++++++++++++++++++++++++++++++++++++++++++------ src/main/java/com/product/print/config/CmnCode.java | 6 + 2 files changed, 204 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/product/print/config/CmnCode.java b/src/main/java/com/product/print/config/CmnCode.java index 978871c..6d901df 100644 --- a/src/main/java/com/product/print/config/CmnCode.java +++ b/src/main/java/com/product/print/config/CmnCode.java @@ -28,8 +28,10 @@ REPLACE_TEMPLATE_CONTENT_ERROR("鏇挎崲妯℃澘鍐呭閿欒", 13), //杞崲pdf閿欒 CONVERT_PDF_ERROR("杞崲pdf閿欒", 14), - //鏍间腑娌℃湁鎵惧埌缁撴潫鏍囪瘑{{$~end~}} - NOT_FIND_END_FLAG("鏍间腑娌℃湁鎵惧埌缁撴潫鏍囪瘑{{$~end~}}", 15), + //琛ㄦ牸涓病鏈夋壘鍒拌捣濮嬩笅鏍� + NOT_FIND_START_FLAG("琛ㄦ牸涓病鏈夋壘鍒拌捣濮嬩笅鏍�", 15), + //瀛愯〃鏍间腑娌℃湁鎵惧埌瀵瑰簲鐨勫瓧娈� + NOT_FIND_CHILD_TABLE_FIELD("瀛愯〃鏍间腑娌℃湁鎵惧埌瀵瑰簲鐨勫瓧娈�", 16), ; private String text; diff --git a/src/main/java/com/product/print/util/DynamicTableRenderPolicy.java b/src/main/java/com/product/print/util/DynamicTableRenderPolicy.java index 9590e86..a8179d1 100644 --- a/src/main/java/com/product/print/util/DynamicTableRenderPolicy.java +++ b/src/main/java/com/product/print/util/DynamicTableRenderPolicy.java @@ -7,8 +7,12 @@ import com.product.common.lang.StringUtils; import com.product.core.exception.BaseException; import com.product.print.config.CmnCode; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.xwpf.usermodel.*; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -58,53 +62,102 @@ List<Map<String, Object>> subTableData = (List<Map<String, Object>>) data; List<XWPFTableRow> rows = xwpfTable.getRows(); //璇诲彇rows涓殑鍐呭 - //鑾峰彇鏈�鍚庝竴琛� - XWPFTableRow xwpfTableRow = rows.get(rows.size() - 1); String tableExpression = "{{" + this.replaceKey + "}}"; //鑾峰彇琛ㄦ牸璧峰琛屽拰缁撴潫琛� int startRowIndex = -1; - int endRowIndex = -1; rows: for (int i = 0; i < rows.size(); i++) { XWPFTableRow row = rows.get(i); for (int j = 0; j < row.getTableCells().size(); j++) { - if (startRowIndex > -1 && endRowIndex > -1) { - break rows; - } XWPFTableCell cell = row.getTableCells().get(j); String text = cell.getText(); if (tableExpression.equals(text)) { startRowIndex = i; - } - if ("{{$~end~}}".equals(text)) { - endRowIndex = i; + break rows; } } } - //琛ㄦ牸璧峰琛屼笉鍦ㄧ涓�琛屼笖娌℃湁鎵惧埌缁撴潫鏍囪 - if (startRowIndex > 0 && endRowIndex == -1) { - throw new BaseException(CmnCode.NOT_FIND_END_FLAG); + if (startRowIndex == -1) { + throw new BaseException(CmnCode.NOT_FIND_START_FLAG); } - if (startRowIndex == 0 && endRowIndex > 0) { - //鍒犻櫎缁撴潫鏍囪鎵�鍦ㄨ - xwpfTable.removeRow(endRowIndex); + //鍦ㄨ〃鏍间腑鏌ユ壘瀛愯〃瀛楁浠{$寮�澶磢}浠}缁撳熬鐨勫唴瀹� + String regex = "\\{\\{\\$[a-zA-Z0-9_]+\\}\\}"; + Pattern pattern = Pattern.compile(regex); + //瀛楁鎵�鍦ㄨ + XWPFTableRow fieldRow = null; + for (int i = startRowIndex; i < rows.size(); i++) { + XWPFTableRow row = rows.get(i); + for (int j = 0; j < row.getTableCells().size(); j++) { + XWPFTableCell cell = row.getTableCells().get(j); + String text = cell.getText(); + Matcher matcher = pattern.matcher(text); + if (matcher.find()) { + fieldRow = row; + i = rows.size(); + break; + } + } + } + if (fieldRow == null) { + throw new BaseException(CmnCode.NOT_FIND_CHILD_TABLE_FIELD); } //璇诲彇鏈�鍚庤姣忎釜鍗曞厓鏍肩殑鍊硷紝璋冪敤getReplaceKey鏂规硶鑾峰彇琛ㄨ揪寮忎腑鐨勫�� - String[] fieldNames = new String[xwpfTableRow.getTableCells().size()]; -// for (int i = 0; i < xwpfTableRow.getTableCells().size(); i++) { -// XWPFTableCell cell = xwpfTableRow.getTableCells().get(i); -// String text = cell.getText(); -// String replaceKey = getReplaceKey(text); -// //鑾峰彇琛ㄨ揪寮忎腑鐨勫�� -// if (StringUtils.isEmpty(replaceKey)) { -// //璁剧疆鍗曞厓鏍间负绌哄�� -// replaceKey = ""; -// } -// fieldNames[i] = replaceKey; -// } + String[] fieldNames = new String[fieldRow.getTableCells().size()]; + for (int i = 0; i < fieldRow.getTableCells().size(); i++) { + XWPFTableCell cell = fieldRow.getTableCells().get(i); + String text = cell.getText(); + String replaceKey = getReplaceKey(text); + //鑾峰彇琛ㄨ揪寮忎腑鐨勫�� + if (StringUtils.isEmpty(replaceKey)) { + //璁剧疆鍗曞厓鏍间负绌哄�� + replaceKey = ""; + } + fieldNames[i] = replaceKey; + } + //鑾峰彇fieldRow鎵�鍦ㄧ殑涓嬫爣 + int fieldRowIndex = xwpfTable.getRows().indexOf(fieldRow); + + for (int i = 0; i < subTableData.size(); i++) { + Map<String, Object> map = subTableData.get(i); + //鍒涘缓涓�琛屽湪fieldRowIndex涓嬮潰 + XWPFTableRow row = xwpfTable.insertNewTableRow(fieldRowIndex + 1 + i); + copyTableRow(row, fieldRow); + //璁剧疆row鐨勫睘鎬т笌fieldRow涓�鑷� + row.setHeight(fieldRow.getHeight()); + //閬嶅巻瀛楁姣忎釜瀛楁鍒涘缓涓�涓崟鍏冩牸 + for (int j = 0; j < fieldNames.length; j++) { + //褰撳墠鍗曞厓鏍� + XWPFTableCell cell; + //鍒ゆ柇row涓j涓崟鍏冩牸鏄惁瀛樺湪 + if (row.getTableCells().size() > j) { + cell = row.getTableCells().get(j); + //娓呯┖鍗曞厓鏍煎唴瀹� + cell.removeParagraph(0); + } else { + cell = row.createCell(); + } + //璁剧疆鍗曞厓鏍肩殑鍊间粠map涓彇鍑� + //鍒ゆ柇鏄惁鏄簭鍙峰垪 + if (indexKey.equals(fieldNames[j])) { + cell.setText(String.valueOf(i + 1)); + continue; + } + Object value = map.get(fieldNames[j]); + if (value == null) { + value = ""; + } + //璁剧疆鍗曞厓鏍肩殑鍊� + cell.setText(value.toString()); + } + } + //鍒犻櫎璧峰琛� + xwpfTable.removeRow(startRowIndex); + //鍒犻櫎fieldRow + xwpfTable.removeRow(fieldRowIndex - 1); + // //璇诲彇瀹屾瘯鍚庡垹闄ゆ渶鍚庝竴琛� // xwpfTable.removeRow(rows.size() - 1); //鑾峰彇鎵�鏈夌殑琛屽垽鏂崟鍏冩牸鏄惁鏈夊�兼病鏈夊氨鍒犻櫎璇ヨ @@ -174,4 +227,124 @@ } return null; } + + /** + * 澶嶅埗琛岋紝浠巗ource鍒皌arget + * + * @param target + * @param source + */ + public void copyTableRow(XWPFTableRow target, XWPFTableRow source) { + // 澶嶅埗鏍峰紡 + if (source.getCtRow() != null) { + target.getCtRow().setTrPr(source.getCtRow().getTrPr()); + } + // 澶嶅埗鍗曞厓鏍� + for (int i = 0; i < source.getTableCells().size(); i++) { + XWPFTableCell cell1 = target.getCell(i); + XWPFTableCell cell2 = source.getCell(i); + if (cell1 == null) { + cell1 = target.addNewTableCell(); + } + copyTableCell(cell1, cell2); + } + } + + /** + * 澶嶅埗鍗曞厓鏍硷紝浠巗ource鍒皌arget + * + * @param target + * @param source + */ + public void copyTableCell(XWPFTableCell target, XWPFTableCell source) { + // 鍒楀睘鎬� + if (source.getCTTc() != null) { + target.getCTTc().setTcPr(source.getCTTc().getTcPr()); + } + // 鍒犻櫎娈佃惤 + for (int pos = 0; pos < target.getParagraphs().size(); pos++) { + target.removeParagraph(pos); + } + // 娣诲姞娈佃惤 + for (XWPFParagraph sp : source.getParagraphs()) { + XWPFParagraph targetP = target.addParagraph(); + copyParagraph(targetP, sp); + } + } + + /** + * 澶嶅埗鍥剧墖鍒皌arget + * + * @param target + * @param picture + * @throws IOException + * @throws InvalidFormatException + */ + public void copyPicture(XWPFRun target, XWPFPicture picture) throws IOException, InvalidFormatException { + + String filename = picture.getPictureData().getFileName(); + InputStream pictureData = new ByteArrayInputStream(picture + .getPictureData().getData()); + int pictureType = picture.getPictureData().getPictureType(); + int width = (int) picture.getCTPicture().getSpPr().getXfrm().getExt() + .getCx(); + + int height = (int) picture.getCTPicture().getSpPr().getXfrm().getExt() + .getCy(); + + // target.addBreak(); + target.addPicture(pictureData, pictureType, filename, width, height); + // target.addBreak(BreakType.PAGE); + } + + /** + * 澶嶅埗娈佃惤锛屼粠source鍒皌arget + * + * @param target + * @param source + */ + public void copyParagraph(XWPFParagraph target, XWPFParagraph source) { + + // 璁剧疆娈佃惤鏍峰紡 + target.getCTP().setPPr(source.getCTP().getPPr()); + + // 绉婚櫎鎵�鏈夌殑run + for (int pos = target.getRuns().size() - 1; pos >= 0; pos--) { + target.removeRun(pos); + } + + // copy 鏂扮殑run + for (XWPFRun s : source.getRuns()) { + XWPFRun targetrun = target.createRun(); + copyRun(targetrun, s); + } + + + } + + /** + * 澶嶅埗RUN锛屼粠source鍒皌arget + * + * @param target + * @param source + */ + public void copyRun(XWPFRun target, XWPFRun source) { + // 璁剧疆run灞炴�� + target.getCTR().setRPr(source.getCTR().getRPr()); + // 璁剧疆鏂囨湰 + target.setText(source.text()); + // 澶勭悊鍥剧墖 + List<XWPFPicture> pictures = source.getEmbeddedPictures(); + + for (XWPFPicture picture : pictures) { + try { + copyPicture(target, picture); + } catch (InvalidFormatException e) { + logger.error("copyRun", e); + } catch (IOException e) { + logger.error("copyRun", e); + } + } + } + } -- Gitblit v1.9.2