From 3a73d3d0a07b170074c2716f072e6156f2ff1641 Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 25 Aug 2024 19:31:42 +0800 Subject: [PATCH] add fill template --- .../poi/excel/writer/ExcelWriteConfig.java | 2 +- .../poi/excel/writer/TemplateWriterTest.java | 55 ++++++++++++------ hutool-poi/src/test/resources/template.xlsx | Bin 8975 -> 9034 bytes .../test/resources/templateWithFooter.xlsx | Bin 0 -> 9139 bytes 4 files changed, 38 insertions(+), 19 deletions(-) create mode 100644 hutool-poi/src/test/resources/templateWithFooter.xlsx diff --git a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/writer/ExcelWriteConfig.java b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/writer/ExcelWriteConfig.java index c5fa173af..c5c52fa34 100644 --- a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/writer/ExcelWriteConfig.java +++ b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/writer/ExcelWriteConfig.java @@ -45,7 +45,7 @@ public class ExcelWriteConfig extends ExcelConfig { * 是否强制插入行
* 如果为{@code true},则写入行以下的已存在行下移,{@code false}则利用填充已有行,不存在再创建行 */ - protected boolean insertRow; + protected boolean insertRow = true; /** * 标题顺序比较器 */ diff --git a/hutool-poi/src/test/java/org/dromara/hutool/poi/excel/writer/TemplateWriterTest.java b/hutool-poi/src/test/java/org/dromara/hutool/poi/excel/writer/TemplateWriterTest.java index 6abfcb124..f924a22cd 100644 --- a/hutool-poi/src/test/java/org/dromara/hutool/poi/excel/writer/TemplateWriterTest.java +++ b/hutool-poi/src/test/java/org/dromara/hutool/poi/excel/writer/TemplateWriterTest.java @@ -9,21 +9,15 @@ import java.util.Map; public class TemplateWriterTest { - @Test - void insertTest() { - final ExcelWriter writer = ExcelUtil.getWriter("d:/test/template.xlsx"); - writer.getConfig().setInsertRow(true); - writer.setCurrentRow(3); - writer.getSheet().shiftRows(4, 4, 10); - - writer.flush(FileUtil.file("d:/test/templateInsertResult.xlsx"), true); - writer.close(); - } + private static final String targetDir = "d:/test/templateWriter/"; + /** + * 正常数据填充 + */ @Test - void writeRowTest() { - final ExcelWriter writer = ExcelUtil.getWriter("d:/test/template.xlsx"); - writer.getConfig().setInsertRow(true); + void writeTest() { + final ExcelWriter writer = ExcelUtil.getWriter("template.xlsx"); + writer.getConfig().setInsertRow(false); // 单个替换的变量 writer.fillOnce(MapUtil @@ -35,14 +29,17 @@ public class TemplateWriterTest { writer.writeRow(createRow(), false); } - writer.flush(FileUtil.file("d:/test/templateResult.xlsx"), true); + writer.flush(FileUtil.file(targetDir + "templateResult.xlsx"), true); writer.close(); } + /** + * 带有页脚的数据填充,通过插入方式完成,页脚下移 + */ @Test - void writeRowWithFooterTest() { - final ExcelWriter writer = ExcelUtil.getWriter("d:/test/templateWithFooter.xlsx"); - writer.getConfig().setInsertRow(true); + void writeWithFooterTest() { + final ExcelWriter writer = ExcelUtil.getWriter("templateWithFooter.xlsx"); + //writer.getConfig().setInsertRow(true); // 单个替换的变量 writer.fillOnce(MapUtil @@ -54,7 +51,29 @@ public class TemplateWriterTest { writer.writeRow(createRow(), false); } - writer.flush(FileUtil.file("d:/test/templateWithFooterResult.xlsx"), true); + writer.flush(FileUtil.file(targetDir + "templateWithFooterResult.xlsx"), true); + writer.close(); + } + + /** + * 错位数据,即变量不在一行上 + */ + @Test + void writeNoneOneLineTest() { + final ExcelWriter writer = ExcelUtil.getWriter(targetDir + "templateWithFooterNoneOneLine.xlsx"); + //writer.getConfig().setInsertRow(true); + + // 单个替换的变量 + writer.fillOnce(MapUtil + .builder("date", (Object)"2024-01-01") + .build()); + + // 列表替换 + for (int i = 0; i < 10; i++) { + writer.writeRow(createRow(), false); + } + + writer.flush(FileUtil.file(targetDir + "templateWithFooterResult.xlsx"), true); writer.close(); } diff --git a/hutool-poi/src/test/resources/template.xlsx b/hutool-poi/src/test/resources/template.xlsx index 357afbdd1d0f74077067949066f6ae9ea093ee4d..4dfaf60be2567823da8053f5f6f628cf07ea17ec 100644 GIT binary patch delta 2849 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 R03bttfe=qlO7ZjG{{Uh*)>i-k literal 0 HcmV?d00001