From de95ab5c8bbf8ac02628e3c9ded7bf9b9a3bf3fe Mon Sep 17 00:00:00 2001 From: huangwenhao <1092798160@qq.com> Date: Wed, 26 Mar 2025 14:48:59 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E2=9C=A8=20[2025-03-26]=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=AD=97=E4=BD=93=E6=A0=B7=E5=BC=8F=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=8A=9F=E8=83=BD:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 ParameterBean 中添加 fontBean 字段以支持字体样式 - 修改 OneCell 和 OneRow 类,支持创建带有字体样式的单元格 - 更新 RunReplaceUtils 类,实现对 XWPFRun 样式的设置 - 在 Text 类中添加支持字体样式的 putValue 方法 --- pom.xml | 2 ++ .../utils/operationUtils/RunReplaceUtils.java | 16 ++++++++++++++++ .../wordOut/wordBean/ParameterBean.java | 11 +++++++++++ .../wordOut/wordBean/tableBean/OneCell.java | 5 +++++ .../wordOut/wordBean/tableBean/OneRow.java | 8 ++++++++ .../wordOut/wordBean/textBean/Text.java | 9 +++++++++ src/test/java/com/test/wordOutput.java | 9 ++++++--- 7 files changed, 57 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 939338c..5b603d6 100644 --- a/pom.xml +++ b/pom.xml @@ -81,6 +81,8 @@ com.aspose.words aspose-words 19.5 + ${project.basedir}/lib/aspose-words-19.5.jar + system diff --git a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/operationUtils/RunReplaceUtils.java b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/operationUtils/RunReplaceUtils.java index 0f55636..d7230f0 100644 --- a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/operationUtils/RunReplaceUtils.java +++ b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/operationUtils/RunReplaceUtils.java @@ -2,6 +2,7 @@ package com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.utils.operationUti import com.xiaominge.utils.IdUtils; import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.utils.WordTemplateKeyEnum; +import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.FontBean; import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.ParameterBean; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -15,6 +16,7 @@ import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObject; import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTAnchor; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDrawing; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr; import org.springframework.beans.BeanUtils; @@ -423,6 +425,10 @@ public class RunReplaceUtils { insertNewRun.setText(parameterBean.getValue().toString()); return 0; } + FontBean fontBean = parameterBean.getFontBean(); + if (fontBean != null) { + setXWPFRunStyle(insertNewRun, fontBean); + } //下换线寻找切割 AtomicBoolean isSet = new AtomicBoolean(false); List parameterBeans_underLine = parseValue(parameterBean, WordValueEnum.UnderLineStart, WordValueEnum.UnderLineEnd, (old, New) -> { @@ -609,4 +615,14 @@ public class RunReplaceUtils { return anchor; } + private static void setXWPFRunStyle(XWPFRun xwpfRun, FontBean fontBean) { + xwpfRun.setFontSize(fontBean.getFontSize()); + CTRPr rpr = xwpfRun.getCTR().isSetRPr() ? xwpfRun.getCTR().getRPr() : xwpfRun.getCTR().addNewRPr(); + CTFonts fonts = + rpr.sizeOfRFontsArray() != 0 ? rpr.getRFontsArray(rpr.getRFontsArray().length - 1) : rpr.addNewRFonts(); + fonts.setAscii(fontBean.getFontName()); + fonts.setEastAsia(fontBean.getFontName()); + fonts.setHAnsi(fontBean.getFontName()); + } + } diff --git a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/ParameterBean.java b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/ParameterBean.java index ad2ae39..d1d4f1d 100644 --- a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/ParameterBean.java +++ b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/ParameterBean.java @@ -91,6 +91,11 @@ public class ParameterBean { */ private boolean nextIsNewPage; + /** + * 字体样式 + */ + private FontBean fontBean; + public ParameterBean(String key, Object value) { this.key = key; this.value = value; @@ -102,6 +107,12 @@ public class ParameterBean { this.nextIsNewPage = nextIsNewPage; } + public ParameterBean(String key, Object value, FontBean fontBean) { + this.key = key; + this.value = value; + this.fontBean = fontBean; + } + /** * @param key 图片的key diff --git a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/tableBean/OneCell.java b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/tableBean/OneCell.java index 656cccd..8e1854b 100644 --- a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/tableBean/OneCell.java +++ b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/tableBean/OneCell.java @@ -1,5 +1,6 @@ package com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.tableBean; +import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.FontBean; import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.ParameterBean; import lombok.Getter; import lombok.Setter; @@ -31,6 +32,10 @@ public class OneCell extends ParameterBean { super(key, imageType, imageInputStream, width, height, leftOffset, topOffset, false); } + public OneCell(String key, Object value, FontBean fontBean) { + super(key, value, fontBean); + } + /** * 合并行 和列 diff --git a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/tableBean/OneRow.java b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/tableBean/OneRow.java index b8a7c31..efd3e4e 100644 --- a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/tableBean/OneRow.java +++ b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/tableBean/OneRow.java @@ -1,5 +1,7 @@ package com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.tableBean; +import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.FontBean; + import java.io.InputStream; import java.util.ArrayList; import java.util.List; @@ -48,6 +50,12 @@ public class OneRow { return cell; } + public OneCell createCell(String cellKey, Object cellValue, FontBean fontBean) { + OneCell cell = new OneCell(cellKey, cellValue, fontBean); + this.cells.add(cell); + return cell; + } + public OneCell createOneCell(String key, String imageType, InputStream imageInputStream, int width, int height) { OneCell cell = new OneCell(key, imageType, imageInputStream, width, height); this.cells.add(cell); diff --git a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/textBean/Text.java b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/textBean/Text.java index a2031b2..51c9b01 100644 --- a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/textBean/Text.java +++ b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/textBean/Text.java @@ -1,5 +1,6 @@ package com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.textBean; +import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.FontBean; import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.ParameterBean; import java.io.InputStream; @@ -17,6 +18,9 @@ public class Text { private List texts; + private FontBean fontBean; + + //构造 public Text() { this.texts = new ArrayList<>(); @@ -70,6 +74,11 @@ public class Text { return this; } + public Text putValue(String key, Object value, FontBean fontBean) { + this.texts.add(new ParameterBean(key, value, fontBean)); + return this; + } + public Text putImage(String key, String imageType, InputStream imageInputStream, int width, int height) { this.texts.add(new ParameterBean(key, imageType, imageInputStream, width, height)); diff --git a/src/test/java/com/test/wordOutput.java b/src/test/java/com/test/wordOutput.java index f3fb2b0..a05d6d7 100644 --- a/src/test/java/com/test/wordOutput.java +++ b/src/test/java/com/test/wordOutput.java @@ -2,6 +2,7 @@ package com.test; import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.utils.WordTemplateUtils; import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.utils.operationUtils.WordValueEnum; +import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.FontBean; import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.WordInfo; import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.tableBean.*; import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.textBean.OneFor; @@ -27,7 +28,8 @@ public class wordOutput { //直接渲染文字 Text text = wordInfo.createText(); text.putValue("name", "张三"); - text.putValue("sex", "男"); + FontBean fontBean = new FontBean("方正小标宋_GBK", 22); + text.putValue("sex", "男", fontBean); //渲染图片 text.putImage( @@ -112,14 +114,15 @@ public class wordOutput { } table_4_oneRow.createCell("name", "表格4合并单元格名字" + i); - table_4_oneRow.createCell("number", "测试下换线"+WordValueEnum.UnderLineStart.getValue()+"表格4合并单元格编号" + WordValueEnum.UnderLineEnd.getValue() + i); + table_4_oneRow.createCell("number", "测试下换线" + WordValueEnum.UnderLineStart.getValue() + "表格4合并单元格编号" + + WordValueEnum.UnderLineEnd.getValue() + i, fontBean); } //加载模板 WordTemplateUtils wordTemplateUtils = new WordTemplateUtils(this.getClass().getResourceAsStream("/wordOutput/template.docx")); //变量替换 wordTemplateUtils.replaceDocument(wordInfo); - FileOutputStream fileOutputStream = new FileOutputStream("D:\\桌面\\aa123.docx"); + FileOutputStream fileOutputStream = new FileOutputStream(System.getProperty("user.dir") + "\\aa123.docx"); //进行输出 wordTemplateUtils.write(fileOutputStream); } -- Gitee From 95c021916251d634e747141e35e1ba42d1ae6701 Mon Sep 17 00:00:00 2001 From: huangwenhao <1092798160@qq.com> Date: Mon, 31 Mar 2025 11:25:32 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E2=9C=A8=20[2025-03-31]=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=A1=A8=E6=A0=BC=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=B9=B6=E6=B7=BB=E5=8A=A0=E5=88=86=E9=A1=B5=E7=AC=A6:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 OneTable 类中添加 isBr 字段,用于控制表格后是否自动回车 - 修改 TableBeans 类中的 CreateOneTable 方法,支持设置 isBr 参数 - 更新 WordTableUtils 类中的 addTableInDocFooter 方法,根据 isBr 决定是否添加回车换行- 在 WordRunUtils 类中优化段落处理逻辑,避免重复创建空段落 - 在 WordTemplateUtils 类中添加分页符处理逻辑,支持页面强制换行 --- .../wordOut/utils/WordRunUtils.java | 7 ++- .../wordOut/utils/WordTableUtils.java | 58 ++++++++++++------ .../wordOut/utils/WordTemplateUtils.java | 28 +++++++-- .../wordOut/wordBean/tableBean/OneTable.java | 24 +++++++- .../wordBean/tableBean/TableBeans.java | 16 ++++- ...\350\256\260\345\275\225\350\241\250.docx" | Bin 0 -> 25212 bytes src/test/java/com/test/wordOutput.java | 23 +++++++ 7 files changed, 125 insertions(+), 31 deletions(-) create mode 100644 "src/main/resources/wordOutput/\350\256\260\345\275\225\350\241\250-\346\265\201\345\212\250\347\233\221\350\200\203\345\221\230\343\200\201\347\275\221\347\273\234\347\233\221\350\200\203\345\221\230\350\256\260\345\275\225\350\241\250.docx" diff --git a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordRunUtils.java b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordRunUtils.java index 82d4b76..ebff749 100644 --- a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordRunUtils.java +++ b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordRunUtils.java @@ -9,7 +9,6 @@ import org.apache.poi.xwpf.usermodel.*; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; /** * @program: data_centre_java @@ -103,8 +102,12 @@ public class WordRunUtils { */ public void addParagraphInDocFooter(XWPFParagraph templateParagraph, Text text) { + String newLine = templateParagraph.getText(); + if ("\n".equals(newLine)) { + return; + } - //创建段落对象 + //创建段落对象 XWPFParagraph createParagraph = document.createParagraph(); // 设置段落样式 createParagraph.getCTP().setPPr(templateParagraph.getCTP().getPPr()); diff --git a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordTableUtils.java b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordTableUtils.java index 5b646e2..a93e11e 100644 --- a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordTableUtils.java +++ b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordTableUtils.java @@ -7,6 +7,7 @@ import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.tableBean. import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.tableBean.OneTable; import org.apache.poi.xwpf.usermodel.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblGrid; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge; import java.util.*; @@ -34,25 +35,26 @@ public class WordTableUtils { * @param oneTable 一个表格 * @param flag (0为静态表格,1为表格整体循环,2为表格内部行循环,3为表格不循环仅简单替换标签即可) */ - public void addTableInDocFooter(XWPFTable templateTable, - OneTable oneTable, int flag) { + public void addTableInDocFooter(XWPFTable templateTable, OneTable oneTable, int flag, boolean isBr) { if (flag == 1) {// 表格整体循环 for (OneRow row : oneTable.getRows()) { List templateTableRows = templateTable.getRows();// 获取模板表格所有行 - XWPFTable newCreateTable = createTable();// 创建新表格,默认一行一列 + XWPFTable newCreateTable = createTable(templateTable);// 创建新表格,默认一行一列 for (int i = 1; i < templateTableRows.size(); i++) { XWPFTableRow newCreateRow = newCreateTable.createRow(); //创建一行 CopyTableRow(newCreateRow, templateTableRows.get(i));// 复制模板行文本和样式到新行 包含列 } newCreateTable.removeRow(0);// 移除多出来的第一行 - document.createParagraph();// 添加回车换行 + if (isBr) { + document.createParagraph();// 添加回车换行 + } replaceTable(newCreateTable, row.getCells());//替换标签 } } else if (flag == 2) { // 表格表格内部行循环 - XWPFTable newCreateTable = createTable();// 创建新表格, 默认一行一列 + XWPFTable newCreateTable = createTable(templateTable);// 创建新表格, 默认一行一列 List TempTableRows = templateTable.getRows();// 获取模板表格所有行 int tagRowsIndex = 0;// 标签行indexs @@ -114,19 +116,23 @@ public class WordTableUtils { replaceTableRow(newCreateRow, oneTable.getTableEndRow().getCells()); // 处理不循环标签的替换 表格尾部的行 如果有信息可以替换 } newCreateTable.removeRow(0);// 移除多出来的第一行 - document.createParagraph();// 添加回车换行 + if (isBr) { + document.createParagraph();// 添加回车换行 + } } else if (flag == 3) { //表格不循环 仅简单替换标签 List templateTableRows = templateTable.getRows();// 获取模板表格所有行 - XWPFTable newCreateTable = createTable();// 创建新表格,默认一行一列 + XWPFTable newCreateTable = createTable(templateTable);// 创建新表格,默认一行一列 for (int i = 1; i < templateTableRows.size(); i++) { //从1 开始 第一行是标志 -->不要 XWPFTableRow newCreateRow = newCreateTable.createRow(); CopyTableRow(newCreateRow, templateTableRows.get(i));// 复制模板行文本和样式到新行 } newCreateTable.removeRow(0);// 移除多出来的第一行 - document.createParagraph();// 添加回车换行 + if (isBr) { + document.createParagraph();// 添加回车换行 + } List cells = new ArrayList<>(); if (oneTable.getTableTitleRow().getCells() != null) { @@ -139,13 +145,15 @@ public class WordTableUtils { } else if (flag == 0) { List templateTableRows = templateTable.getRows();// 获取模板表格所有行 - XWPFTable newCreateTable = createTable();// 创建新表格,默认一行一列 + XWPFTable newCreateTable = createTable(templateTable);// 创建新表格,默认一行一列 for (int i = 1; i < templateTableRows.size(); i++) { //从1 开始 第一行是标志 -->不要 XWPFTableRow newCreateRow = newCreateTable.createRow(); CopyTableRow(newCreateRow, templateTableRows.get(i));// 复制模板行文本和样式到新行 } newCreateTable.removeRow(0);// 移除多出来的第一行 - document.createParagraph();// 添加回车换行 + if (isBr) { + document.createParagraph();// 添加回车换行 + } } } @@ -157,7 +165,7 @@ public class WordTableUtils { * @param target 待修改格式的XWPFTableRow * @param source 模板XWPFTableRow */ - private void CopyTableRow(XWPFTableRow target, XWPFTableRow source) { + public void CopyTableRow(XWPFTableRow target, XWPFTableRow source) { int tempRowCellsize = source.getTableCells().size();// 模板行的列数 for (int i = 0; i < tempRowCellsize - 1; i++) { @@ -292,13 +300,25 @@ public class WordTableUtils { /** * 创建表格 */ - public XWPFTable createTable() { - XWPFTable table = document.createTable(); - // 校验一下grid是否为空,如果为空就创建。转pdf的时候如果为空会报空指针 - CTTblGrid grid = table.getCTTbl().getTblGrid(); - if (grid == null) { - table.getCTTbl().addNewTblGrid(); - } - return table; + public XWPFTable createTable(XWPFTable templateTbl) { + // XWPFTable table = document.createTable(); + // // 校验一下grid是否为空,如果为空就创建。转pdf的时候如果为空会报空指针 + // CTTblGrid grid = table.getCTTbl().getTblGrid(); + // if (grid == null) { + // table.getCTTbl().addNewTblGrid(); + // } + // return table; + XWPFTable table = document.createTable(); + // 复制模板表格的属性 + CTTblPr tblPr = templateTbl.getCTTbl().getTblPr(); + if (tblPr != null) { + table.getCTTbl().setTblPr((CTTblPr) tblPr.copy()); + } + // 校验一下grid是否为空,如果为空就创建。转pdf的时候如果为空会报空指针 + CTTblGrid grid = table.getCTTbl().getTblGrid(); + if (grid == null) { + table.getCTTbl().addNewTblGrid(); + } + return table; } } diff --git a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordTemplateUtils.java b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordTemplateUtils.java index a5061b7..d0325a7 100644 --- a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordTemplateUtils.java +++ b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordTemplateUtils.java @@ -6,8 +6,10 @@ import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.tableBean. import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.textBean.Text; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.apache.poi.wp.usermodel.Paragraph; import org.apache.poi.xwpf.usermodel.*; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBr; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBrType; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; @@ -15,7 +17,6 @@ import java.io.*; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; /** * @program: data_centre_java @@ -155,18 +156,21 @@ public class WordTemplateUtils { switch (oneTable.getTableType()) { case for_table: //log.info("循环生成表格"); - wordTableUtils.addTableInDocFooter(table, tableBeans.getOneTable(templateTableName), 1); + wordTableUtils.addTableInDocFooter(table, tableBeans.getOneTable(templateTableName), 1, + oneTable.isBr()); break; case for_Row: //log.info("循环生成表格内部的行"); - wordTableUtils.addTableInDocFooter(table, tableBeans.getOneTable(templateTableName), 2); + wordTableUtils.addTableInDocFooter(table, tableBeans.getOneTable(templateTableName), 2, + oneTable.isBr()); break; case replace_value: //log.info("简单替换标签"); - wordTableUtils.addTableInDocFooter(table, tableBeans.getOneTable(templateTableName), 3); + wordTableUtils.addTableInDocFooter(table, tableBeans.getOneTable(templateTableName), 3, + oneTable.isBr()); break; case No_todo: - wordTableUtils.addTableInDocFooter(table, null, 0); + wordTableUtils.addTableInDocFooter(table, null, 0, oneTable.isBr()); break; default: log.info("表格处理方法错误"); @@ -185,6 +189,18 @@ public class WordTemplateUtils { if (ph != null) { //自己封装 段落循环 List runs = ph.getRuns(); + for (XWPFRun run : runs) { + CTR ctr = run.getCTR(); + if (ctr.sizeOfBrArray() > 0) { + for (CTBr br : ctr.getBrArray()) { + if (br.getType() == STBrType.PAGE) { + //创建段落对象 + XWPFParagraph createParagraph = document.createParagraph(); + createParagraph.createRun().addBreak(BreakType.PAGE); + } + } + } + } StringBuffer value = new StringBuffer(); for (int i1 = 0; i1 < runs.size(); i1++) { String wordText = runs.get(i1).getText(0); diff --git a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/tableBean/OneTable.java b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/tableBean/OneTable.java index 2a98ae2..fef3491 100644 --- a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/tableBean/OneTable.java +++ b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/tableBean/OneTable.java @@ -26,8 +26,11 @@ public class OneTable { //表格尾行 private final OneRow tableEndRow; - //构造 - public OneTable(String tableKey, TableType tableType) { + //表格后是否自动回车 + private boolean isBr = true; + + //构造 + public OneTable(String tableKey, TableType tableType) { this.tableType = tableType; this.tableKey = tableKey; this.rows = new ArrayList<>(); @@ -35,6 +38,23 @@ public class OneTable { this.tableEndRow = new OneRow(); } + public OneTable(String tableKey, TableType tableType, boolean isBr) { + this.tableType = tableType; + this.tableKey = tableKey; + this.rows = new ArrayList<>(); + this.tableTitleRow = new OneRow(); + this.tableEndRow = new OneRow(); + this.isBr = isBr; + } + + public boolean isBr() { + return isBr; + } + + public void setBr(boolean br) { + isBr = br; + } + //清空方法 public void clear() { diff --git a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/tableBean/TableBeans.java b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/tableBean/TableBeans.java index 04c1bb3..adae6eb 100644 --- a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/tableBean/TableBeans.java +++ b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/wordBean/tableBean/TableBeans.java @@ -29,18 +29,30 @@ public class TableBeans { * @param tableType 表格的替换值类型 * @return 获取一个表格对象 */ - public OneTable CreateOneTable(String oneTableKey, TableType tableType) { + public OneTable CreateOneTable(String oneTableKey, TableType tableType, boolean isBr) { if (StringUtils.isBlank(oneTableKey)) { throw new NullPointerException("表格key 不能为空"); } if (tables.containsKey(oneTableKey)) { throw ParameterRuntimeException.throwException("表格的key 已经存在"); } - OneTable oneTable = new OneTable(oneTableKey, tableType); + OneTable oneTable = new OneTable(oneTableKey, tableType, isBr); this.tables.put(oneTableKey, oneTable); return oneTable; } + public OneTable CreateOneTable(String oneTableKey, TableType tableType) { + if (StringUtils.isBlank(oneTableKey)) { + throw new NullPointerException("表格key 不能为空"); + } + if (tables.containsKey(oneTableKey)) { + throw ParameterRuntimeException.throwException("表格的key 已经存在"); + } + OneTable oneTable = new OneTable(oneTableKey, tableType); + this.tables.put(oneTableKey, oneTable); + return oneTable; + } + //放入一个表格 public void addOneTable(OneTable oneTable) { if (StringUtils.isBlank(oneTable.getTableKey())) { diff --git "a/src/main/resources/wordOutput/\350\256\260\345\275\225\350\241\250-\346\265\201\345\212\250\347\233\221\350\200\203\345\221\230\343\200\201\347\275\221\347\273\234\347\233\221\350\200\203\345\221\230\350\256\260\345\275\225\350\241\250.docx" "b/src/main/resources/wordOutput/\350\256\260\345\275\225\350\241\250-\346\265\201\345\212\250\347\233\221\350\200\203\345\221\230\343\200\201\347\275\221\347\273\234\347\233\221\350\200\203\345\221\230\350\256\260\345\275\225\350\241\250.docx" new file mode 100644 index 0000000000000000000000000000000000000000..f9898de12b560e8eff9016eed94091c90d4d9621 GIT binary patch literal 25212 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 literal 0 HcmV?d00001 diff --git a/src/test/java/com/test/wordOutput.java b/src/test/java/com/test/wordOutput.java index a05d6d7..8dbd8e2 100644 --- a/src/test/java/com/test/wordOutput.java +++ b/src/test/java/com/test/wordOutput.java @@ -126,4 +126,27 @@ public class wordOutput { //进行输出 wordTemplateUtils.write(fileOutputStream); } + + @Test + void testTable() throws Exception { + WordInfo wordInfo = new WordInfo(); + Text text = wordInfo.getText(); + text.putValue("school", "重庆二外"); + + TableBeans tableBean = wordInfo.createTableBean(); + tableBean.CreateOneTable("table_1", TableType.No_todo, false); + tableBean.CreateOneTable("table_2", TableType.No_todo, false); + tableBean.CreateOneTable("table_3", TableType.No_todo, false); + tableBean.CreateOneTable("table_4", TableType.No_todo, false); + + + WordTemplateUtils wordTemplateUtils = new WordTemplateUtils( + this.getClass().getResourceAsStream("/wordOutput/记录表-流动监考员、网络监考员记录表.docx")); + // 变量替换 + wordTemplateUtils.replaceDocument(wordInfo); + + FileOutputStream fileOutputStream = new FileOutputStream(System.getProperty("user.dir") + "\\321.docx"); + //进行输出 + wordTemplateUtils.write(fileOutputStream); + } } -- Gitee From 3d7558906b7d54b799aabc82942a36cb381e13b5 Mon Sep 17 00:00:00 2001 From: huangwenhao <1092798160@qq.com> Date: Thu, 10 Apr 2025 11:47:32 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20[2025-04-10]=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20word=20=E5=AF=BC=E5=87=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 注释掉 ExcelToHTMLTest 中的测试代码 - 修改 RunReplaceUtils 中的异常处理逻辑,改为记录错误日志 - 在 wordOutput测试类中添加 import 语句 - 优化 WordTemplateUtils 中的循环逻辑,增加错误日志记录 --- .../wordOut/utils/WordTemplateUtils.java | 30 +++++++++++++++---- .../utils/operationUtils/RunReplaceUtils.java | 7 +++-- src/test/java/com/test/ExcelToHTMLTest.java | 13 ++++---- src/test/java/com/test/wordOutput.java | 1 + 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordTemplateUtils.java b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordTemplateUtils.java index d0325a7..6d71840 100644 --- a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordTemplateUtils.java +++ b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordTemplateUtils.java @@ -3,7 +3,9 @@ package com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.utils; import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.WordInfo; import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.tableBean.OneTable; import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.tableBean.TableBeans; +import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.textBean.OneFor; import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.textBean.Text; +import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.textBean.TextFroReaders; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.poi.xwpf.usermodel.*; @@ -241,12 +243,28 @@ public class WordTemplateUtils { String forEachKey = valuetemp.substring(valuetemp.indexOf(WordTemplateKeyEnum.textForKeyPrefixValue.getKeyCode()), valuetemp.indexOf(WordTemplateKeyEnum.keyEnd.getKeyCode())).replace(WordTemplateKeyEnum.textForKeyPrefixValue.getKeyCode(), ""); - oneForTextList = wordInfo.getTextFroReaders().getOneForTextList(forEachKey).getOneForTextList(); - - if (oneForTextList == null) { - throw new RuntimeException("缺少元数据" + valuetemp); - } - } else {//都不是就是渲染的数据 + // oneForTextList = wordInfo.getTextFroReaders().getOneForTextList(forEachKey).getOneForTextList(); + // + // if (oneForTextList == null) { + // throw new RuntimeException("缺少元数据" + valuetemp); + // } + + TextFroReaders textFroReaders = wordInfo.getTextFroReaders(); + if (textFroReaders == null) { + log.error("未创建" + WordTemplateKeyEnum.textForStart.getKeyCode()); + oneForTextList = new ArrayList<>(); + continue; + } + OneFor oneFor = textFroReaders.getOneForTextList(forEachKey); + if (oneFor == null) { + log.error("未设置" + WordTemplateKeyEnum.textForStart.getKeyCode()); + oneForTextList = new ArrayList<>(); + continue; + } + oneForTextList = oneFor.getOneForTextList(); + + + } else {//都不是就是渲染的数据 addList.add(phtemp); } } else { diff --git a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/operationUtils/RunReplaceUtils.java b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/operationUtils/RunReplaceUtils.java index d7230f0..bf9aa1a 100644 --- a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/operationUtils/RunReplaceUtils.java +++ b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/operationUtils/RunReplaceUtils.java @@ -383,11 +383,12 @@ public class RunReplaceUtils { } else { // todo 根据自己项目自己定义 如果模版里面设置了变了 导出的数据中没有 可以抛出异常 也可以默认替换为空格 if (!key.startsWith(WordTemplateKeyEnum.imageKeyPerfix.getKeyCode())) { - throw new RuntimeException("数据源中没有发现key=[" + key + "],的数据"); //抛出异常 + // throw new RuntimeException("数据源中没有发现key=[" + key + "],的数据"); //抛出异常 } - // returnValue = ""; -// return new ParameterBean(key, ""); //默认替换为空格 + log.error("数据源中没有发现key=[" + key + "],的数据"); + + return new ParameterBean(key, ""); //默认替换为空格 } } diff --git a/src/test/java/com/test/ExcelToHTMLTest.java b/src/test/java/com/test/ExcelToHTMLTest.java index 473b39c..d8450e5 100644 --- a/src/test/java/com/test/ExcelToHTMLTest.java +++ b/src/test/java/com/test/ExcelToHTMLTest.java @@ -1,20 +1,17 @@ package com.test; -import com.xiaominge.utils.excleUtils.ExcelToHtml.ExcelToHtmlUtil; import org.junit.jupiter.api.Test; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; public class ExcelToHTMLTest { @Test public void run() throws IOException { - FileInputStream fileInputStream = new FileInputStream("D:\\桌面\\test1.xlsx"); - FileOutputStream fileOutputStream = new FileOutputStream("D:\\桌面\\test1.html"); - - boolean isWithStyle = true; - ExcelToHtmlUtil.excelToHtml(fileInputStream, isWithStyle, fileOutputStream); + // FileInputStream fileInputStream = new FileInputStream("D:\\桌面\\test1.xlsx"); + // FileOutputStream fileOutputStream = new FileOutputStream("D:\\桌面\\test1.html"); + // + // boolean isWithStyle = true; + // ExcelToHtmlUtil.excelToHtml(fileInputStream, isWithStyle, fileOutputStream); } } diff --git a/src/test/java/com/test/wordOutput.java b/src/test/java/com/test/wordOutput.java index 8dbd8e2..54df01f 100644 --- a/src/test/java/com/test/wordOutput.java +++ b/src/test/java/com/test/wordOutput.java @@ -11,6 +11,7 @@ import com.xiaominge.utils.wordUtils.wordOutputUtils.wordOut.wordBean.textBean.T import org.junit.jupiter.api.Test; import java.io.FileOutputStream; +import java.io.IOException; /** * @program: poi-utils -- Gitee From e68a432c7f34d22d53753ee4db8eaa9baf0741d8 Mon Sep 17 00:00:00 2001 From: huangwenhao <1092798160@qq.com> Date: Fri, 18 Apr 2025 15:07:22 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20[2025-04-18]=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20WordTemplateUtils=20=E7=B1=BB=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化了段落处理逻辑,提高了代码的可读性和维护性 - 在处理文本循环时增加了索引递增,修复了潜在的无限循环问题 --- .../wordOutputUtils/wordOut/utils/WordTemplateUtils.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordTemplateUtils.java b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordTemplateUtils.java index 6d71840..c6bd61f 100644 --- a/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordTemplateUtils.java +++ b/src/main/java/com/xiaominge/utils/wordUtils/wordOutputUtils/wordOut/utils/WordTemplateUtils.java @@ -186,7 +186,8 @@ public class WordTemplateUtils { } else if (BodyElementType.PARAGRAPH.equals(body.getElementType())) { // 处理段落 //log.info("获取到段落"); //获取处理的段落信息 - XWPFParagraph ph = body.getBody().getParagraphArray(curP); + IBody body1 = body.getBody(); + XWPFParagraph ph = body1.getParagraphArray(curP); if (ph != null) { //自己封装 段落循环 @@ -253,12 +254,14 @@ public class WordTemplateUtils { if (textFroReaders == null) { log.error("未创建" + WordTemplateKeyEnum.textForStart.getKeyCode()); oneForTextList = new ArrayList<>(); + i++; continue; } OneFor oneFor = textFroReaders.getOneForTextList(forEachKey); if (oneFor == null) { log.error("未设置" + WordTemplateKeyEnum.textForStart.getKeyCode()); oneForTextList = new ArrayList<>(); + i++; continue; } oneForTextList = oneFor.getOneForTextList(); -- Gitee