poi-tl模板替换

官方文档 http://deepoove.com/poi-tl/#_why_poi_tl

区块对和表格行循环

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.0.0</version>
</dependency>
<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.10.0</version>
</dependency>
public static void main(String[] args) throws IOException {
    // 替换变量map
    Map<String, Object> map = Maps.newHashMap();
    ArrayList<User> wtr = new ArrayList<>();
    User use1 = User.builder().name("张三").idCard("1111111111").build();
    User use2 = User.builder().name("李四").idCard("2222222222").build();
    wtr.add(use1);
    wtr.add(use2);

    ArrayList<User> str = new ArrayList<>();
    User use3 = User.builder().name("王五").idCard("1111111111").build();
    str.add(use3);

    //表格行循环
    ArrayList<User> people = new ArrayList<>();
    User use4 = User.builder().name("王五").age(20).sex("男").birthday("2022-07-29").idCard("1111111111").build();
    people.add(use4);

    //所有变量需要放到map中,key为模板中的变量
    map.put("wtr", wtr);
    map.put("str", str);
    map.put("领证人姓名","赵六");
    map.put("people",people);

    //要替换文件
    InputStream templateFileInputStream = new FileInputStream("C:\\Users\\test\\Desktop\\test.docx");
    //表格行循环
    LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();

    Configure configure = Configure.builder()
            .bind("people", policy)
            .build();
    XWPFTemplate template = XWPFTemplate.compile(templateFileInputStream, configure).render(map);
    String docxTemp = "C:\\Users\\test\\Desktop\\测试" + ".docx";
    FileOutputStream out = new FileOutputStream(docxTemp);
    template.write(out);
    out.flush();
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

区块对和spring表达式结合使用

在这里插入图片描述

在这里插入图片描述

假设现在我需要用顿号将人的名字隔开

例如 张三、李四、王五

模板变量设置 {{?proposer}}{{name}}、{{/proposer}}

    public static void test() throws Exception {
        Map<String, Object> map = Maps.newHashMap();
        List<KerProposerReplaceVO> list = new ArrayList<>();
        list.add(KerProposerReplaceVO.builder().name("张三").build());
        list.add(KerProposerReplaceVO.builder().name("李四").build());
        list.add(KerProposerReplaceVO.builder().name("王五").build());
        map.put("proposer", list);
        map.put("总人数", 3);
        //要替换文件
        InputStream templateFileInputStream = new FileInputStream("C:\\Users\\zhl\\Desktop\\test2.docx");
        Configure configure = Configure.builder().useSpringEL(true).build();

        XWPFTemplate template = XWPFTemplate.compile(templateFileInputStream, configure).render(map);
        String docxTemp = "C:\\Users\\zhl\\Desktop\\test23523" + ".docx";
        FileOutputStream out = new FileOutputStream(docxTemp);
        template.write(out);
        out.flush();
        IoUtil.close(out);
    }

替换效果 张三、李四、王五、

结尾多了一个顿号

修改模板变量设置 {{?proposer}}{{name}}{{_has_next ? ‘、’ : ‘’}}{{/proposer}}

替换效果 张三、李四、王五

特别注意: 如果模板中有标签名是中文 {{总人数}},首先需要修改代码,将useSpringEL(ture) 改为 useSpringEL(false),否则报错

Cannot render docx template, please check the Exception

Caused by: java.lang.IllegalStateException: Cannot handle (24635)

在这里插入图片描述

修改后替换结果,少了总人数

在这里插入图片描述

需要修改模板变量 {{[‘总人数’]}} 使用 [‘’] 将中文包在中间

修改后替换结果,少了总人数

需要修改模板变量 {{[‘总人数’]}} 使用 [‘’] 将中文包在中间,单引号最好在文本编辑器中打好后复制进docx,否者就变成前面文字显示那样了,正确如下图
在这里插入图片描述

在这里插入图片描述

好的,我可以回答你的问题。poi-tlPOI模板引擎,可以方便地对Word、Excel、PowerPoint等文档进行动态操作。如果你需要使用poi-tl动态替换Word模板文件中的表格或段落,可以参考以下步骤: 1. 创建Word模板文件,使用POI打开并读取文件。 2. 为需要动态替换的文本添加标识符,例如“${name}”、“${score}”等。 3. 使用poi-tl模板引擎,根据模板文件生成新的Word文档对象。 4. 在新的Word文档对象中查找需要替换的标识符,并替换成新的内容。 5. 保存替换后的Word文档文件。 下面是一个简单的Java代码示例,演示如何使用poi-tl动态替换Word模板文件中的表格或段落: ```java import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Map; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableRow; import org.apache.poi.xwpf.usermodel.XWPFTableCell; import com.deepoove.poi.XWPFTemplate; public class WordTemplate { public static void main(String[] args) throws Exception { // 加载Word模板文件 FileInputStream fis = new FileInputStream("template.docx"); XWPFDocument doc = new XWPFDocument(fis); // 创建数据模型,存储需要替换的数据 Map<String, Object> data = new HashMap<>(); data.put("name", "张三"); data.put("score", "90"); // 使用poi-tl模板引擎,根据模板文件生成新的Word文档对象 XWPFTemplate template = XWPFTemplate.compile("template.docx").render(data); // 遍历所有段落 for (XWPFParagraph para : template.getXWPFDocument().getParagraphs()) { String text = para.getText(); if (text.contains("${name}")) { // 替换文本 text = text.replace("${name}", "张三"); para.removeRun(0); para.createRun().setText(text); } } // 遍历所有表格 for (XWPFTable table : template.getXWPFDocument().getTables()) { for (XWPFTableRow row : table.getRows()) { for (XWPFTableCell cell : row.getTableCells()) { String text = cell.getText(); if (text.contains("${score}")) { // 替换文本 text = text.replace("${score}", "90"); cell.removeParagraph(0); cell.setText(text); } } } } // 保存替换后的文件 FileOutputStream fos = new FileOutputStream("output.docx"); template.write(fos); template.close(); fis.close(); fos.close(); } } ``` 在上述代码中,我们使用了XWPFDocument、XWPFParagraph、XWPFRun、XWPFTable、XWPFTableRow和XWPFTableCell对象来操作Word文档。同时,我们使用了poi-tl模板引擎,根据模板文件生成新的Word文档对象,并使用Map对象存储需要替换的数据。在代码中,我们使用了“${name}”和“${score}”作为替换文本的标识符,你可以根据实际需要修改这些标识符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值