java poi-tl word模板填充

java poi-tl word模板填充



前言

word填充基于com.deepoove 的 poi-tl


一、引入maven库

注意:版本对应 poi-tl 版本 1.9.0 对应 apache poi 版本 4.1.2

代码如下(示例):

       <!--word模板数据解析-->
       <dependency>
           <groupId>com.deepoove</groupId>
           <artifactId>poi-tl</artifactId>
           <version>1.9.0</version>
       </dependency>

二、读入数据

采用${key}的形式进行填充!默认是{{key}}的格式
原word模板:
模板图
效果图:
效果图

三、示例代码

代码如下(示例):

    public static void main(String[] args) throws Exception{
        resolveTemp();
    }

    public static File resolveTemp() throws Exception {
        String path = System.getProperty("user.dir") + "/file";
        Map<String, Object> datas = new HashMap<>();
        datas.put("dept", "采购部");
        datas.put("name", "张三");
        LocalDate date = LocalDate.now();
        datas.put("year", date.getYear());
        datas.put("month", date.getMonthValue());
        datas.put("day", date.getDayOfMonth());
        List<Map<String, Object>> itemList = new ArrayList<>();
        Map<String, Object> itemMap = new HashMap<>();
        itemMap.put("goods", "笔记本电脑");
        itemMap.put("num", "2");
        itemMap.put("cost", "10000");
        itemMap.put("remark", "按需采购");
        itemList.add(itemMap);
        itemMap = new HashMap<>();
        itemMap.put("goods", "台式电脑");
        itemMap.put("num", "1");
        itemMap.put("cost", "8000");
        itemMap.put("remark", "按需采购");
        itemList.add(itemMap);
        datas.put("item", itemList);
        datas.put("total", "18000.00");

        //读取图片
        File file = new File(path + "/1.png");
        BufferedImage bi = ImageIO.read(file);
        int width = bi.getWidth();
        //源图高度
        int height = bi.getHeight();
        datas.put("image", new PictureRenderData(width, height, PictureType.PNG, new FileInputStream(file)));
        System.out.println("datas = " + datas);

        HackLoopTableRenderPolicy hackLoopTableRenderPolicy = new HackLoopTableRenderPolicy();
        Configure config = Configure.builder()
                .buildGramer("${", "}")//此处可以变更原模板{{}}
                .bind("item", hackLoopTableRenderPolicy)//标记表格参数
                .build();

        String sourceFile = path + "/template/采购单.docx";
        String docNow = LocalDateTimeUtils.formatDate(date, "yyyy年MM月dd日");
        String targetFile = path + "/order/采购单" + docNow + ".docx";
        XWPFTemplate template = XWPFTemplate.compile(new FileInputStream(sourceFile), config).render(datas);
        File wordFile = new File(targetFile);
        File parentFile = wordFile.getParentFile();
        if (!parentFile.exists()) {
            parentFile.mkdirs();
        }
        FileOutputStream out = new FileOutputStream(wordFile);
        template.write(out);
        out.flush();
        out.close();
        template.close();
        return wordFile;
    }

总结

以上就是今天要讲的内容,本文仅仅简单介绍了poi-tl的使用,喜欢就点个赞吧!

当使用Poi-tl库根据Word模板填充内容生成Word文档时,可以使用Poi-tl提供的模板语法来处理空值。以下是一个示例代码: ```java import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFRun; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apache.poi.xwpf.usermodel.TextAlignment; import fr.opensagres.poi.xwpf.converter.pdf.PdfConverter; import fr.opensagres.poi.xwpf.converter.pdf.PdfOptions; import org.apache.poi.util.Units; import org.apache.poi.xwpf.usermodel.Document; import org.apache.poi.xwpf.usermodel.HeaderFooterType; import org.apache.poi.xwpf.usermodel.IBodyElement; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableRow; import org.apache.poi.xwpf.usermodel.XWPFTableCell; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class WordTemplateFiller { public static void main(String[] args) { try { // 加载Word模板文件 FileInputStream templateStream = new FileInputStream("template.docx"); XWPFDocument document = new XWPFDocument(templateStream); // 填充内容 Map<String, Object> placeholders = new HashMap<>(); placeholders.put("name", "John Doe"); placeholders.put("age", "30"); placeholders.put("address", ""); replacePlaceholders(document, placeholders); // 保存填充后的文档 FileOutputStream outputStream = new FileOutputStream("filled_template.docx"); document.write(outputStream); outputStream.close(); System.out.println("Word文档生成成功!"); } catch (IOException e) { e.printStackTrace(); } } private static void replacePlaceholders(XWPFDocument document, Map<String, Object> placeholders) { for (XWPFParagraph paragraph : document.getParagraphs()) { for (XWPFRun run : paragraph.getRuns()) { String text = run.getText(0); if (text != null) { for (Map.Entry<String, Object> entry : placeholders.entrySet()) { String placeholder = "${" + entry.getKey() + "}"; if (text.contains(placeholder)) { Object value = entry.getValue(); if (value != null && !value.toString().isEmpty()) { text = text.replace(placeholder, value.toString()); } else { text = text.replace(placeholder, ""); // 替换为空字符串 } run.setText(text, 0); } } } } } } } ``` 在上述代码中,我们首先加载Word模板文件,然后定义了一个`placeholders`的映射,其中包含了要替换的占位符和对应的值。接下来,我们调用`replacePlaceholders`方法来替换文档中的占位符。 在`replacePlaceholders`方法中,我们遍历文档中的每个段落和文本运行,通过检查文本内容中是否包含占位符来确定是否需要替换。如果找到了匹配的占位符,则根据占位符对应的值来进行替换。如果值不为空且非空字符串,则将占位符替换为对应的值;如果值为空或空字符串,则将占位符替换为空字符串。 请注意,上述代码中使用的占位符格式为`${placeholder}`,你可以根据实际情况修改为其他格式。 以上是一个基本示例,你可以根据自己的需求进行修改和扩展。同时,需要确保在项目中添加了Poi-tl的依赖库。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值