笛里谁知壮士心,沙头空照征人骨。这篇文章主要讲述Java导出Word文档的实现相关的知识,希望能为你提供帮助。
前言在日常的开发工作中,我们时常会遇到导出Word文档报表的需求,比如公司的财务报表、医院的患者统计报表、电商平台的销售报表等等。
导出Word方式多种多样,通常有以下几种方式:
1. 使用第三方java工具类库Hutool的Word工具类,参考网址为??https://www.hutool.cn/docs/#/poi/Word生成-Word07Writer??;
2. 利用Apache POI和FreeMarker模板引擎;
3. 第三方报表工具。
上面的几种方式虽然可以实现Word文档的导出,但有以下缺点:
第一种方式操作简单,但也只能生成简单的Word文档,无法生成有表格的Word文档;
第二种方式可以生成复杂的Word文档,但是还要进行Word转xml,xml转ftl的双重转换,不适合内容经常变更的Word文档;
第三种方式有时候不适合对格式要求严格的文档。
那么,有没有既简单又高效的导出Word的方法呢?答案是肯定有的。接下来我就来介绍一种用Java语言实现的,通过XDocReport和FreeMarker模板引擎生成Word文档的方法。
准备环境开发语言:
Java7及以上的版本。
开发工具:
Eclipse/Idea。
第三方依赖库:
XDocReport、POI、Freemarker。
模板语言:
FreeMarker。
Word编辑器:
Microsoft 365或其他版本较高的Word编辑器。
示例Word模板
制作模板Word模板如上图,可以看到,结构比较简单,包括两个部分,第一部分是纯文字和数字,第二部分主要是表格。我们在实际的开发过程中生成的报表几乎都是动态生成的,所以模板中的数字和表格里的数据都要替换成我们后台的实际数据。
替换Word模板中的动态变量,我们需要掌握两个知识点:
1.Word文档中的Word域,word域是引导Word在文档中自动插入文字、图形、页码或其他信息的一组代码。在这里我们可以把
Word域理解成标识符,这个标识符表示Word文档中要被替换的内容;
2.FreeMarker模板下的变量表达式,比如用$city替换Word示例模板中的北京市。
【Java导出Word文档的实现】了解了以上两个概念后,我们就可以动手编辑Word模板了,步骤如下:
1. 首先在Word模板中选中要替换的文本,在这儿拿标题中的"北京市"为例,然后键盘使用 Ctrl + F9 组合键将其设置为域,此时文本会被""包围,接着鼠标右键选择【编辑域(E)...】:
2.
在弹出的对话框中,类别选择“邮件合并”,域名选择 "MergeField",域属性中的域名填入模版表达式$city,点击【确定】按钮:
3. 编辑后的效果如下:
4. 掌握替换文本的方法后,我们可以把Word模板第一部分需要替换的内容都替换成模板变量:
?
Word模板中表格数据的处理
表格中的数据实质上就是对集合的遍历。
表格数据的处理其实和上面对文本内容的处理是类似的,只不过要在Word模板中加上集合的变量,Java代码中也要有对集合进行特对的处理(这个在后面的代码展示部分会说)。
具体操作步骤如下:
1. 选定表格中要替换的文本,然后键盘使用 Ctrl + F9 组合键将其设置为域,接着鼠标右键选择【编辑域(E)...】:
2.
在弹出的对话框中,类别选择“邮件合并”,域名选择 "MergeField",域属性中的域名填入模版表达式$goods.num,点击【确定】按钮;
3. 重复步骤2,替换表格中的其他文本内容:
?
后台代码
添加依赖到pom.xml文件
<
dependency>
<
groupId>
org.apache.poi<
/groupId>
<
artifactId>
poi<
/artifactId>
<
version>
4.1.1<
/version>
<
/dependency>
<
dependency>
<
groupId>
org.apache.poi<
/groupId>
<
artifactId>
poi-ooxml<
/artifactId>
<
version>
4.1.1<
/version>
<
/dependency>
<
dependency>
<
groupId>
org.jxls<
/groupId>
<
artifactId>
jxls<
/artifactId>
<
version>
2.6.0<
/version>
<
exclusions>
<
exclusion>
<
groupId>
ch.qos.logback<
/groupId>
<
artifactId>
logback-core<
/artifactId>
<
/exclusion>
<
/exclusions>
<
/dependency>
<
dependency>
<
groupId>
org.jxls<
/groupId>
<
artifactId>
jxls-poi<
/artifactId>
<
version>
1.2.0<
/version>
<
/dependency>
<
dependency>
<
groupId>
fr.opensagres.xdocreport<
/groupId>
<
artifactId>
fr.opensagres.xdocreport.core<
/artifactId>
<
version>
2.0.2<
/version>
<
/dependency>
<
dependency>
<
groupId>
fr.opensagres.xdocreport<
/groupId>
<
artifactId>
fr.opensagres.xdocreport.document<
/artifactId>
<
version>
2.0.2<
/version>
<
/dependency>
<
dependency>
<
groupId>
fr.opensagres.xdocreport<
/groupId>
<
artifactId>
fr.opensagres.xdocreport.template<
/artifactId>
<
version>
2.0.2<
/version>
<
/dependency>
<
dependency>
<
groupId>
fr.opensagres.xdocreport<
/groupId>
<
artifactId>
fr.opensagres.xdocreport.document.docx<
/artifactId>
<
version>
2.0.2<
/version>
<
/dependency>
<
dependency>
<
groupId>
fr.opensagres.xdocreport<
/groupId>
<
artifactId>
fr.opensagres.xdocreport.template.freemarker<
/artifactId>
<
version>
2.0.2<
/version>
<
/dependency>
<
dependency>
<
groupId>
org.freemarker<
/groupId>
<
artifactId>
freemarker<
/artifactId>
<
version>
2.3.23<
/version>
<
/dependency>
<
dependency>
<
groupId>
commons-io<
/groupId>
<
artifactId>
commons-io<
/artifactId>
<
version>
2.5<
/version>
<
/dependency>
编写Java代码
package com.tzsj.test;
import java.io.File;
import
推荐阅读
- 通过Intune控制windows后台应用---Intune终结点管理(11)
- LAMP之Apache
- 实验使用apache构建虚拟主机
- Inside Java Newscast #1 深度解读
- 关于如何构建 Go 代码的思考
- 从画廊短代码中排除the_post_thumbnail
- 动态将图像添加到WordPress中的滑块
- 显示所有注册用户(不仅是作者)的简单公共用户配置文件
- 在WordPress页面上显示特定帖子