Java使用poi-tl1.9.1生成Word文档的几个小技巧

这篇具有很好参考价值的文章主要介绍了Java使用poi-tl1.9.1生成Word文档的几个小技巧。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、poi-tl简介

1、什么是poi-tl

2、常见的word生成对比

3、poi-tl功能点

二、poi-tl文档生成

1、模板准备

2、目标参数填充

3、生成效果

 三、可能会遇到的问题

1、混合图表生成报错

2、图表参数设置技巧

 总结


前言

        也许在您的工作当中会碰到如下的一些场景,比如您需要组织一个活动,主办方需要对每个报名参加的单位进行报名通知书的生成。也许您会说,参加活动的不多,可以采取人工的方式进行信息填写,然后再发送给报名人员就好。如果仅是几个人或者几十个人还好,如果是几百人,您还会选择这种方式么?

        针对这种批量动态个性化的word生成需求,有没有什么技术可以进行辅助生成呢?一定是有的,在Java的世界中,实现这种需求有好几种实现方案,本文推荐一种简单快捷的实现方式,基于开源的poi-tl的实现机制。本文将简单介绍poi-tl的相关知识,通过一个实际的案例实践,充分介绍如何利用poi-tl进行目标文档的生成,同时分享几个不同的office版本如何进行图表生成的解决方案。如果刚好您也在进行相关技术选型,本文可以作为使用参考。

一、poi-tl简介

1、什么是poi-tl

        poi-tl(poi template language)是Word模板引擎,使用Word模板和数据创建很棒的Word文档。poi-tl是一款采用Apache License 2.0开源协议的开源产品,poi-tl github地址。

Java使用poi-tl1.9.1生成Word文档的几个小技巧,java,poi-tl生成文档,java word批量生成

 2、常见的word生成对比

方案 移植性 功能性 易用性

Poi-tl

Java跨平台

Word模板引擎,基于Apache POI,提供更友好的API

低代码,准备文档模板和数据即可

Apache POI

Java跨平台

Apache项目,封装了常见的文档操作,也可以操作底层XML结构

文档不全,这里有一个教程:Apache POI Word快速入门

Freemarker

XML跨平台

仅支持文本,很大的局限性

不推荐,XML结构的代码几乎无法维护

OpenOffice

部署OpenOffice,移植性较差

-

需要了解OpenOffice的API

HTML浏览器导出

依赖浏览器的实现,移植性较差

HTML不能很好的兼容Word的格式,样式糟糕

-

Jacob、winlib

Windows平台

-

复杂,完全不推荐使用

3、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,也可以在指定位置进行合并

 用户自定义函数(插件)

插件化设计,在文档任何位置执行函数

二、poi-tl文档生成

        通常来说,我们会先制作好一个标准的参考模板,让后将需要替换的数据替换到目标参数中,完成相应参数的替换,所以刚开始先来准备一分word模板。

1、模板准备

        在电脑的任意盘符,这里以D盘为例,创建一个文件输入.docx的word文档,打开文档编辑

Java使用poi-tl1.9.1生成Word文档的几个小技巧,java,poi-tl生成文档,java word批量生成

        在这个模板中定义了文本标签以及图片的定义。这里注意的是,{{}}这对标准参数符必须是英文状态下输入,之前有朋友就是没注意中英文,导致程序没有按照预期出来。同时注意图片的引用符在参数名称前面加上英文@符号。

Java使用poi-tl1.9.1生成Word文档的几个小技巧,java,poi-tl生成文档,java word批量生成

         在模板中加入一些图表信息,丰富素材,这里需要设置。我个人电脑上的图表参数设置如下(尤其注意不同的office版本,对应的编辑处理方法不一致):

Java使用poi-tl1.9.1生成Word文档的几个小技巧,java,poi-tl生成文档,java word批量生成

 2、目标参数填充

        首先在工程中进行pom.xml引入

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.yelang</groupId>
	<artifactId>poi-demo2</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<dependencies>
		<dependency>
			<groupId>com.deepoove</groupId>
			<artifactId>poi-tl</artifactId>
			<version>1.9.1</version>
		</dependency>
	</dependencies>
</project>

        参数填充:这里为了演示方便,直接构造演示数据,真实项目中可以使从数据库或者其它接口获取相应的数据来进行参数的设置。

package com.yelang.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.ChartMultiSeriesRenderData;
import com.deepoove.poi.data.Charts;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.PictureType;
import com.deepoove.poi.data.Pictures;
import com.deepoove.poi.data.SeriesRenderData;

public class TestMain2 {
	
	public static void main(String[] args) throws IOException {
		Map<String, Object> map = new HashMap<String,Object>();
        map.put("score", "28");
        map.put("title", "测试任务");
        map.put("type", "上半年综合测评");
        map.put("status", "已完成");
        map.put("time", "2023-07-18");
        
        map.put("locpicture", new PictureRenderData(400, 300, "D:/image.jpg"));
        
        map.put("urlImg", Pictures.ofUrl("https://p1.itc.cn/images01/20230418/5d13ab4a86c04a8dac668bf4129e1f0c.png", PictureType.PNG).size(400, 300).create());
        
        ChartMultiSeriesRenderData sbqk = Charts
                .ofMultiSeries("十六市区县情况", new String[] { "济南","青岛","烟台","威海"})
                .addSeries("上报情况", new Double[] { 15.0,20.6,42.6,90.1})
                .addSeries("查出情况", new Double[] { 12.0,15.3,28.6,80.1})
                .create();
 
        map.put("sbqk", sbqk);
 
        ChartMultiSeriesRenderData sjzlpm = Charts
                .ofMultiSeries("医院综合排名", new String[] { "山东大学齐鲁医院","山东省泰山医院","山东省第二人民医院","山东省第三医院"})
                .addSeries("数据质量排名", new Double[] { 70.5,40.6,22.7,85.4})
                .addSeries("价格质量排名", new Double[] { 80.5,75.6,72.7,85.4})
                .create();
 
        map.put("sjzlpm", sjzlpm);
 
        ChartMultiSeriesRenderData qst = Charts
                .ofMultiSeries("任务趋势", new String[] { "06-10","06-11","06-12","06-13","06-14","06-15"})
                .addSeries("微信端", new Double[] { 70.5,40.6,22.7,85.4,700.0,40.8})
                .addSeries("PC端", new Double[] { 80.5,50.6,62.7,45.4,200.0,140.8})
                .addSeries("小程序端", new Double[] { 120.5,520.6,362.7,405.4,300.0,340.8})
                .create();
        
        map.put("qst", qst);
        
        //柱状图、折线图共存
        List<SeriesRenderData> seriesRenderData = new ArrayList<SeriesRenderData>(3);
        SeriesRenderData series1 = new SeriesRenderData("GDP", new Double[] {70.5,40.6,22.7,85.4,700.0,40.8});
        series1.setComboType(SeriesRenderData.ComboType.BAR);
        seriesRenderData.add(series1);
        
        SeriesRenderData series2 = new SeriesRenderData("人口", new Double[] {80.5,50.6,62.7,45.4,200.0,140.8});
        series2.setComboType(SeriesRenderData.ComboType.BAR);
        seriesRenderData.add(series2);
        
        SeriesRenderData series3 = new SeriesRenderData("指数", new Double[] {0.6,0.6,0.7,0.4,0.7,0.8});
        series3.setComboType(SeriesRenderData.ComboType.LINE);
        seriesRenderData.add(series3);
        
        ChartMultiSeriesRenderData hntb = Charts
                .ofMultiSeries("某省社会排名", new String[] { "城市1","城市2","城市3","城市4","城市5","城市6"})
                .create();
        hntb.setSeriesDatas(seriesRenderData);
        
        map.put("hntb", hntb);
 
        File file = new File("D:/文件输入.docx");
        XWPFTemplate template = XWPFTemplate.compile(file).render(map);
 
        FileOutputStream out = new FileOutputStream(new File("D:\\文件输出.docx"));
        template.write(out);
        out.flush();
        out.close();
        template.close();
        System.out.println("完成");
	}
}

3、生成效果

        将以上代码运行后,可以在D盘目录中看到以下的输出结果。

Java使用poi-tl1.9.1生成Word文档的几个小技巧,java,poi-tl生成文档,java word批量生成

Java使用poi-tl1.9.1生成Word文档的几个小技巧,java,poi-tl生成文档,java word批量生成

 三、可能会遇到的问题

1、混合图表生成报错

        如果在代码运行过程中遇到以下异常:

Exception in thread "main" com.deepoove.poi.exception.RenderException: Combo chart must set comboType field of series!
	at com.deepoove.poi.policy.reference.MultiSeriesChartTemplateRenderPolicy.validate(MultiSeriesChartTemplateRenderPolicy.java:122)
	at com.deepoove.poi.policy.reference.MultiSeriesChartTemplateRenderPolicy.doRender(MultiSeriesChartTemplateRenderPolicy.java:56)
	at com.deepoove.poi.policy.reference.MultiSeriesChartTemplateRenderPolicy.doRender(MultiSeriesChartTemplateRenderPolicy.java:48)
	at com.deepoove.poi.policy.reference.AbstractTemplateRenderPolicy.render(AbstractTemplateRenderPolicy.java:38)
	at com.deepoove.poi.render.processor.ElementProcessor.visit(ElementProcessor.java:70)
	at com.deepoove.poi.render.processor.ElementProcessor.visit(ElementProcessor.java:56)
	at com.deepoove.poi.template.ChartTemplate.accept(ChartTemplate.java:117)
	at com.deepoove.poi.render.processor.DocumentProcessor.visit(DocumentProcessor.java:104)
	at com.deepoove.poi.template.ChartTemplate.accept(ChartTemplate.java:117)
	at com.deepoove.poi.render.processor.DocumentProcessor.lambda$process$0(DocumentProcessor.java:58)
	at java.util.ArrayList.forEach(Unknown Source)
	at com.deepoove.poi.render.processor.DocumentProcessor.process(DocumentProcessor.java:58)
	at com.deepoove.poi.render.DefaultRender.renderTemplate(DefaultRender.java:82)
	at com.deepoove.poi.render.DefaultRender.render(DefaultRender.java:64)
	at com.deepoove.poi.XWPFTemplate.render(XWPFTemplate.java:127)
	at com.yelang.test.TestMain2.main(TestMain2.java:87)

        Combo chart must set comboType field of series!这个问题大概率是因为图表生成没有指定图表类型。只需要的代码中指定图表类型即可,错误参考代码如下:

ChartMultiSeriesRenderData hntb = Charts
                .ofMultiSeries("title", new String[] { "06-10","06-11","06-12","06-13","06-14","06-15"})
                .addSeries("系列1", new Double[] { 70.5,40.6,22.7,85.4,700.0,40.8})
                .addSeries("系列1", new Double[] { 80.5,50.6,62.7,45.4,200.0,140.8})
                .addSeries("系列1", new Double[] { 120.5,520.6,362.7,405.4,300.0,340.8})
                .create();

        正确参考代码,通过series3.setComboType(SeriesRenderData.ComboType.LINE)指定:

List<SeriesRenderData> seriesRenderData = new ArrayList<SeriesRenderData>(3);
        SeriesRenderData series1 = new SeriesRenderData("GDP", new Double[] {70.5,40.6,22.7,85.4,700.0,40.8});
        series1.setComboType(SeriesRenderData.ComboType.BAR);
        seriesRenderData.add(series1);
        
        SeriesRenderData series2 = new SeriesRenderData("人口", new Double[] {80.5,50.6,62.7,45.4,200.0,140.8});
        series2.setComboType(SeriesRenderData.ComboType.BAR);
        seriesRenderData.add(series2);
        
        SeriesRenderData series3 = new SeriesRenderData("指数", new Double[] {0.6,0.6,0.7,0.4,0.7,0.8});
        series3.setComboType(SeriesRenderData.ComboType.LINE);
        seriesRenderData.add(series3);
        
        ChartMultiSeriesRenderData hntb = Charts
                .ofMultiSeries("某省社会排名", new String[] { "城市1","城市2","城市3","城市4","城市5","城市6"})
                .create();
        hntb.setSeriesDatas(seriesRenderData);

2、图表参数设置技巧

        不同版本的office,对于参数的替换设置界面不一样,尤其需要注意。这里提供两种环境的设置参考。第一种是office2021。

Java使用poi-tl1.9.1生成Word文档的几个小技巧,java,poi-tl生成文档,java word批量生成

 office2021的图表参数设置是鼠标点击图表右键,出现查看可选文字,在这里进行设置。

Java使用poi-tl1.9.1生成Word文档的几个小技巧,java,poi-tl生成文档,java word批量生成

 在以wps为例,本机安装版本为:wps11.1.0

Java使用poi-tl1.9.1生成Word文档的几个小技巧,java,poi-tl生成文档,java word批量生成

         双击图表空白区,在文字选项中的大小与属性一栏进行设置

Java使用poi-tl1.9.1生成Word文档的几个小技巧,java,poi-tl生成文档,java word批量生成

 总结

        以上就是本文的主要内容,本文将简单介绍poi-tl的相关知识,通过一个实际的案例实践,充分介绍如何利用poi-tl进行目标文档的生成,同时分享几个不同的office版本如何进行图表生成的解决方案。如果刚好您也在进行相关技术选型,本文可以作为使用参考。行文仓促,如有不当之处,欢迎批评指正。

传送门:poi-tl 参考技术网站 poi-tl技术网站文章来源地址https://www.toymoban.com/news/detail-578856.html

到了这里,关于Java使用poi-tl1.9.1生成Word文档的几个小技巧的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 根据模板动态生成word(三)使用poi-tl生成word

    @ 目录 一、前言 1、什么是poi-tl 2、官方信息 2.1 源码仓库 2.2 中文文档 2.3 开源协议 3、poi-tl的优势 3.1 poi-tl和其他模板引擎的对比 3.2 poi-tl Word模板引擎支持的功能 二、基本的使用配置 1、引入依赖 1.1 Maven 1.2 Gradle 2、配置 2.1 新建配置 2.2 标签前后缀替换 2.3 加载模板 2.4 填充数

    2024年02月13日
    浏览(27)
  • 【Java】poi-tl 使用Word模板渲染动态表格

    poi-tl 是一个基于 Apache POI 和 FreeMarker 的 Java 模板引擎,可以用于动态生成 Word、Excel、PowerPoint 等文档。使用 poi-tl 可以方便地将数据填充到模板中,生成符合要求的文档。 poi-tl官方文档地址:http://deepoove.com/poi-tl/#_%E7%89%88%E6%9C%AC 先附上导出效果图: 这步建议手动创建,之前客服

    2024年01月21日
    浏览(33)
  • poi-tl导出word复杂表格(单元格合并,生成复杂表格)

    官方文档地址:http://deepoove.com/poi-tl/ 源码地址:https://github.com/Sayi/poi-tl poi-tl(poi template language)是Word模板引擎,使用Word模板和数据创建很棒的Word文档。 最近在做项目时候有一个关于导出Word的文件的需求,需要导出的word文件较大,并且格式比较复杂,使用poi-tl可以很好的

    2024年02月16日
    浏览(14)
  • java使用poi-tl导出word及转换PDF后的合并导出pdf

    为某单位开发的一款项目申报审批系统,用户需求在申报阶段填写的信息资料能够导出PDF。且项目申报的报告正文为用户上传,所以需要合并导出。 在项目初期阶段使用的是PDF的预设模板导出,因为以前使用过,比较熟悉。所以优先选择此方法,但项目测试阶段发现问题,因

    2024年02月06日
    浏览(50)
  • 使用poi-tl向word插入图片、文本、表格行循环

    工作中难免会向word中操作数据,本文主要介绍poi-tl的使用,先来看效果图 核心介绍: 标签 1、插入文本标签 : {{var}} 2、插入图片标签: {{@var}} 操作步骤: 1、引入依赖 2、Java核心代码 官方网址:http://deepoove.com/poi-tl/ 1、准备模版,定义好需要的标签 2、查询模版 3、获取需要填

    2024年02月05日
    浏览(49)
  • poi-tl的使用(动态表格的生成)

    注意apache.poi版本要对应 创建两个文件夹,一个是用来存储模板文件,另一个是用来存储生成的文件 准备一个word模板,命名为test.docx, 注意,{{}}是官方指定的格式,也可以自定义。 [ ] 是可替换的属性 可以是多个 代码 生成文件 参考: 使用最全 讲解最全

    2024年02月13日
    浏览(21)
  • POI-TL制作word

    本文相当于笔记,主要根据官方文档Poi-tl Documentation和poi-tl的使用(最全详解)_JavaSupeMan的博客-CSDN博客文章进行学习(上班够用) 两个实体类 下边测试类 word模板  生成结果:   如果想生成柱状图等,按照官网进行学习即可,以上两篇(官网,和博客学习够用)

    2024年02月10日
    浏览(19)
  • JAVA poi-tl 制作word模板 表格数据行循环 带有复选框勾选的表格

            java项目实际开发中经常会遇到制作word表单且表格数据行循环功能,甚至带有复选框勾选功能,本文简单介绍如何制作模板以及使用poi-tl生成word。 提示:以下是本篇文章正文内容,下面案例可供参考 如果只用到word那么需要导入的依赖如下(本案例只需要如下2个依

    2024年04月12日
    浏览(15)
  • POI-tl 知识整理:整理3 -> 动态生成表格

    (1)需要渲染的表格的模板 说明 : {{goods}}  是个标准的标签,将  {{goods}}  置于循环行的上一行,循环行设置要循环的标签和内容,注意此时的标签应该使用  []  ,以此来区别poi-tl的默认标签语法。同理, {{labors}}  也置于循环行的上一行。    (2)定义两个实体类  (

    2024年01月18日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包