场景
若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出:
若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出_若依导出前端获得到后端的execl流之后怎么操作-CSDN博客
上面讲的是Excel的导出,如果是需要根据word文档的模板,比如根据数据库中数据或者其它数据源循环
根据模板填充数据,可填充文字、图片、表格、图表等数据。
poi-tl
poi-tl(poi template language)是Word模板引擎,使用Word模板和数据创建很棒的Word文档。
poi-tl是一款采用Apache License 2.0开源协议的开源产品
poi-tl的github地址:
GitHub - Sayi/poi-tl: Generate awesome word(docx) with template
poi-tl技术文档地址:
Poi-tl Documentation
为什么使用poi-tl

poi-tl模板引擎功能
| Word模板引擎功能 | 描述 | 
|---|---|
|   文本  |   将标签渲染为文本  | 
|   图片  |   将标签渲染为图片  | 
|   表格  |   将标签渲染为表格  | 
|   列表  |   将标签渲染为列表  | 
|   图表  |   条形图(3D条形图)、柱形图(3D柱形图)、面积图(3D面积图)、折线图(3D折线图)、雷达图、饼图(3D饼图)、散点图等图表渲染  | 
|   If Condition判断  |   根据条件隐藏或者显示某些文档内容(包括文本、段落、图片、表格、列表、图表等)  | 
|   Foreach Loop循环  |   根据集合循环某些文档内容(包括文本、段落、图片、表格、列表、图表等)  | 
|   Loop表格行  |   循环复制渲染表格的某一行  | 
|   Loop表格列  |   循环复制渲染表格的某一列  | 
|   Loop有序列表  |   支持有序列表的循环,同时支持多级列表  | 
|   Highlight代码高亮  |   word中代码块高亮展示,支持26种语言和上百种着色样式  | 
|   Markdown  |   将Markdown渲染为word文档  | 
|   Word批注  |   完整的批注功能,创建批注、修改批注等  | 
|   Word附件  |   Word中插入附件  | 
|   SDT内容控件  |   内容控件内标签支持  | 
|   Textbox文本框  |   文本框内标签支持  | 
|   图片替换  |   将原有图片替换成另一张图片  | 
|   书签、锚点、超链接  |   支持设置书签,文档内锚点和超链接功能  | 
|   Expression Language  |   完全支持SpringEL表达式,可以扩展更多的表达式:OGNL, MVEL…  | 
|   样式  |   模板即样式,同时代码也可以设置样式  | 
|   模板嵌套  |   模板包含子模板,子模板再包含子模板  | 
|   合并  |   Word合并Merge,也可以在指定位置进行合并  | 
|   用户自定义函数(插件)  |   插件化设计,在文档任何位置执行函数  | 
注:
博客:
霸道流氓气质-CSDN博客
实现
1、快速开始
注意这里poi-tl与poi的对应关系
当前poi-tl的最新版本为1.12.2,需要对应poi的版本5.2.2+

如果poi不是用的该版本,则找对应版本的对应关系。

比如这里使用的poi版本为
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.1.2</version>
            </dependency> 
则需要引入对应的poi-tl的版本为1.8.2
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.8.2</version>
        </dependency> 
相应的文档地址
Poi-tl Documentation
2、新建模板文件,以docx后缀结尾
并在模板文件中需要显示内容的位置,添加标签
{{title}}
文本标签测试
新建渲染方法
    public static void render(Map<String, Object> map){
        XWPFTemplate template = XWPFTemplate.compile("D://test//temp.docx").render(map);
        try {
            FileOutputStream out = new FileOutputStream("D://test//output.docx");
            template.write(out);
            out.flush();
            out.close();
            template.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    } 
其中temp.docx是模板文件,oupput.docx是输出的文件
调用渲染方法
        render(new HashMap<String, Object>(){{
            put("title", "Hi, poi-tl Word模板引擎");
        }}); 
运行结果

3、文本标签复杂属性
数据模型
String :文本
TextRenderData :有样式的文本
HyperLinkTextRenderData :超链接文本
Object :调用 toString() 方法转化为文本
示例代码
        HashMap<String, Object> data = new HashMap<>();
        data.put("name", "Sayi");
        data.put("start_time", "2019-08-04");
        data.put("author", new TextRenderData("000000", "Sayi"));
        data.put("author2", new TextRenderData("霸道的程序猿",
                StyleBuilder.newBuilder()
                        .buildColor("00FF00")//颜色
                        .buildStrike()//删除线
                        .buildBold()//粗体
                        .buildItalic()//斜体
                        .buildUnderLine()//下划线
                        .buildFontFamily("微软雅黑")//字体
                        .buildFontSize(12)//字号
                        .build()
        ));
        // 超链接
        data.put("link", new HyperLinkTextRenderData("website", "卅一"));
        // 锚点
        data.put("anchor", new HyperLinkTextRenderData("anchortxt", "anchor:appendix1"));
        render(data);
 
运行效果

4、图片标签
图片标签以@开始:{{@var}}
示例代码
        HashMap<String, Object> data = new HashMap<>();
        // 本地图片
        data.put("local", new PictureRenderData(80, 100, "D://test//test.png"));
        // 图片流
        try {
            data.put("localbyte", new PictureRenderData(80, 100, ".png", new FileInputStream("D://test//test.png")));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // 网络图片(注意网络耗时对系统可能的性能影响)
        data.put("urlpicture", new PictureRenderData(50, 50, ".png", BytePictureUtils.getUrlBufferedImage("http://deepoove.com/images/icecream.png")));
        // java 图片
        try {
            BufferedImage image = ImageIO.read(new File("D://test//test.png"));
            data.put("bufferimage", new PictureRenderData(80, 100, ".png", image));
        } catch (IOException e) {
            e.printStackTrace();
        }
        render(data);
 
运行结果

5、表格标签
表格标签以#开始:{{#var}}
示例代码
        HashMap<String, Object> data = new HashMap<>();
        RowRenderData header = RowRenderData.build(new TextRenderData("000000", "姓名"), new TextRenderData("000000", "学历"));
        RowRenderData row0 = RowRenderData.build("张三", "研究生");
        RowRenderData row1 = RowRenderData.build("李四", "博士");
        data.put("table", new MiniTableRenderData(header, Arrays.asList(row0, row1)));
        render(data); 
运行结果

6、图表标签-饼状图
模板文件中插入图表-饼状图

右击饼图,查看可选文字-输入
{{pieChart}}

编写测试代码
        HashMap<String, Object> data = new HashMap<>();
        ChartSingleSeriesRenderData pie = new ChartSingleSeriesRenderData();
        pie.setChartTitle("ChartTitle");
        pie.setCategories(new String[] { "俄罗斯", "加拿大", "美国", "中国" });
        pie.setSeriesData(new SeriesRenderData("countries", new Integer[] { 17098242, 9984670, 9826675, 9596961 }));
        data.put("pieChart", pie);
        render(data); 
运行结果

其它图表使用参考官网。
7、pot-tl还有更多的功能、模板、示例代码可参考官网




















