word模板生成利器poi-tl

介绍

大家好,我是知识追寻者,今天给大家介绍一款word模板生成理器;
工作中经常会遇到这种情况,将后台的数据填充到word模板,然后生渲染模板生成新的word提供下载;比如学生成绩单,单位合同,报销费用等!如果能够掌控一款合适的java生成word模板的工具,将极大的提高我们的开发效率!

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

为什么选择 poi-tl

内容支持

引擎功能 描述
文本 将标签渲染为文本
图片 将标签渲染为图片
表格 将标签渲染为表格
列表 将标签渲染为列表
图表 条形图(3D条形图)、柱形图(3D柱形图)、面积图(3D面积图)、折线图(3D折线图)、雷达图、饼图(3D饼图)等图表渲染
If Condition判断 隐藏或者显示某些文档内容(包括文本、段落、图片、表格、列表、图表等)
Foreach Loop循环 循环某些文档内容(包括文本、段落、图片、表格、列表、图表等)
Loop表格行 循环渲染表格的某一行
Loop表格列 循环渲染表格的某一列
Loop有序列表 支持有序列表的循环,同时支持多级列表
图片替换 将原有图片替换成另一张图片
书签、锚点、超链接 支持设置书签,文档内锚点和超链接功能
强大的表达式 完全支持SpringEL表达式,可以扩展更多的表达式:OGNL, MVEL…
标签定制 支持自定义标签前后缀
文本框 文本框内标签支持
样式 模板即样式,同时代码也可以设置样式
模板嵌套 模板包含子模板,子模板再包含子模板
合并 Word合并Merge,也可以在指定位置进行合并
用户自定义函数(插件) 在文档任何位置执行函数

核心代码

核心代码,将数据填充入模板生成新的word;

 private static Logger logger = LoggerFactory.getLogger(TemplateController.class);


   /**
    * @author lsc
    * @param templatePath word模板文件路径
    * @param fileDir      生成的文件存放地址
    * @param fileName     生成的文件名
    * @param paramMap     参数集合
    * @return 返回word生成的路径
    */
    public static String createWord(String templatePath, String fileDir, String fileName, Map<String, Object> paramMap) {
        Assert.notNull(templatePath, "word模板文件路径不能为空");
        Assert.notNull(fileDir, "生成的文件存放地址不能为空");
        Assert.notNull(fileName, "生成的文件名不能为空");
        File dir = new File(fileDir);
        if (!dir.exists()) {
            logger.info("目录不存在,创建文件夹{}!", fileDir);
            dir.mkdirs();
        }
        String filePath = fileDir +"\\"+ fileName;
        // 读取模板渲染参数
        XWPFTemplate template = XWPFTemplate.compile(templatePath).render(paramMap);
        try {
            // 将模板参数写入路径
            template.writeToFile(filePath);
            template.close();
        } catch (Exception e) {
            logger.error("生成word异常{}", e.getMessage());
            e.printStackTrace();
        }
        return filePath;
    }

渲染字符串

模板 {{value}}

渲染代码

public static void main(String[] args) {
        Map<String, Object> params = new HashMap<>();
        // 渲染文本

        params.put("dep","知识研发中心");
        params.put("apply_man","知识追寻者");
        params.put("project","搭建个人网站 https://zszxz.com/index 费用");
        params.put("money","19998");
        params.put("count","8");
        params.put("year","2020");
        params.put("month","02");
        params.put("day","8");
		
    	// 模板路径
        String templatePath = "C:/mydata/generator/demo/template.docx";
        // 生成word的路径
        String fileDir = "C:/mydata/generator/demo";
        // 生成word的文件
        String fileName = "zszxz.docx";

        String wordPath = createWord(templatePath, fileDir, fileName, params);
        System.out.println("生成文档路径:" + wordPath);
    }

生成示例

渲染表格

表格模板 {{#table0}}

渲染代码

public static void main(String[] args) {
        Map<String, Object> params = new HashMap<>();

        params.pables.of(new String[][] {
                        new String[] { "19998", "8" ,"apply_man","搭建个人网站 https://zszxz.com/index 费用"},
                        new String[] { "19998", "8" ,"apply_man","搭建个人网站 https://zszxz.com/index 费用"},
                }).border(TableStyle.BorderStyle.DEFAULT).create
        String templatePath = "C:/mydata/generator/demo/template.docx";
        // 生成word的路径
        String fileDir = "C:/mydata/generator/demo";
        // 生成word的文件
        String fileName = "zszxz.docx";

        String wordPath = createWord(templatePath, fileDir, fileName, params);
        System.out.println("生成文档路径:" + wordPath);
    }

渲染结果

循环渲染

此类渲染的表格存在一些问题不能根据我们定义的模板循环渲染,比如费用报销明细里面多条记录,此时就需要使用到表格循环;

模板

实体类

/**
 * @author lsc
 * <p> </p>
 */
public class Money {

    private String apply_man;

    private String project;

    private String money;

    private String count;
    // 省略set get
}    

核心代码

public static void main(String[] args) throws IOException {
        HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
        Money money1 = new Money();
        money1.setApply_man("知识追寻者");
        money1.setProject("搭建个人网站 https://zszxz.com/index 费用");
        money1.setCount("8");
        money1.setMoney("19988");
        Money money2 = new Money();
        money2.setApply_man("知识追寻者");
        money2.setProject("参加晚会费用");
        money2.setCount("8");
        money2.setMoney("98000");
        List<Money> moneys = new ArrayList<>();
        moneys.add(money1);
        moneys.add(money2);
        // 插件绑定
        Configure config = Configure.builder()
                .bind("moneys", policy).build();
        String templatePath = "C:/mydata/generator/demo/template.docx";
        XWPFTemplate template = XWPFTemplate.compile(templatePath, config).render(
                new HashMap<String, Object>() {{
                    put("moneys", moneys);
                }}
        );
        String filePath = "C:/mydata/generator/demo/zszxz.docx";
        template.writeToFile(filePath);
        template.close();
    }

生成结果

渲染列表

模板 {{*list}}

渲染代码

public static void main(String[] args) {
        Map<String, Object> params = new HashMap<>();

        params.put("list", Numberings.create("Plug-in grammar",
                "Supports word text, pictures, table...",
                "Not just templates"));

        String templatePath = "C:/mydata/generator/demo/template.docx";
        // 生成word的路径
        String fileDir = "C:/mydata/generator/demo";
        // 生成word的文件
        String fileName = "zszxz.docx";

        String wordPath = createWord(templatePath, fileDir, fileName, params);
        System.out.println("生成文档路径:" + wordPath);
    }

渲染结果

最后

需要 本套教程 word模板 关注公众号:知识追寻者 回复 template 模板 获取调试

posted @ 2021-03-31 10:46  知识追寻者  阅读(2962)  评论(0编辑  收藏  举报