zoukankan      html  css  js  c++  java
  • 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 模板 获取调试

  • 相关阅读:
    111
    python 错误宝典
    Node.js Web开发:Connect
    Node.js 中的重要API:HTTP
    Node.js 中的重要API:TCP
    Node.js 中的重要API:命令行工具以及FS API 首个Node应用
    Node.js 中的JS
    Node.js 阻塞式IO与非阻塞式IO与错误处理
    Learning Vue.js 2
    A1046——入门模拟 Shortest Distance
  • 原文地址:https://www.cnblogs.com/zszxz/p/14600392.html
Copyright © 2011-2022 走看看