文章目录
前言
本文主要介绍XDocReport使用的模板引擎freemarker通过java后台导出word文档操作。例如导出这种word文档:
一、XDocReport是什么?
XDocReport是进行对文档进行操作的一种java API(一种java对外接口),具体可以自行在github上找XDocReport的源码。在其README.md里有详细的XDocReport介绍和使用。
二、使用步骤
1.制作word文档模板
2.word文档关键字动态替换
一般导出的word文档都有固定的模板,但是里面的关键字可以动态替换的。例如:上图文档主要分两部分,第一部分是数字和文字,第二部分是表格。模板中的部分文字和数字、表格中的内容使我们要通过java后台代码动态替换的。
替换模板的内容需要2步操作:
1.打开word文档模板,选中要替换的内容,例如模板的“统计时间”,快捷键 Ctrl + F9 插入空域,插入空域后的例子:
2.编辑域,右键选中编辑域,编辑域时类别选择“邮件合并”,域名选择 "MergeField",然后编辑域名属性,属性域名${startTime}要和后台定义的字段对应。
3.编辑模板表格内容:表格的内容用java后台来理解可以解析为对象的集合,所以后台要定义一个实体类,实体类属性需包含表格列域名。模板中commodity是后台Commodity类对象,spmc为Commodity类的一个属性。编辑完总效果
4.将word模板复制到项目的resource的目录下:
3.引入XDocReport、apache、freemarker相关依赖
<!--word导出相关依赖-->
<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>
4.java后台代码示例:
1.创建实体类
import lombok.Data;
@Data
public class Commodity {
/**
* 商品名称
*/
private String spmc;
/**
* 销售量
*/
private String xsl;
/**
* 销售盈利
*/
private String xsyl;
}
2.创建下载文件controller类
package com.tellhow.ddzh.controller;
import com.tellhow.ddzh.vo.Commodity;
import com.tellhow.ddzh.vo.Goods;
import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;
import fr.opensagres.xdocreport.template.formatter.FieldsMetadata;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
/**
* word下载
*
*/
@Controller
@RequestMapping(value = "/wordDownload")
public class WordDownloadTest {
@RequestMapping(value = "/load")
public void generateWord(HttpServletResponse response) throws IOException, XDocReportException {
//获取Word模板,模板存放路径在项目的resources目录下,转换成流操作
InputStream mbwj = this.getClass().getResourceAsStream("/模板.docx");
//注册xdocreport实例并加载FreeMarker模板引擎
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(mbwj,TemplateEngineKind.Freemarker);
//创建xdocreport上下文对象
IContext context = report.createContext();
//创建要替换的文本变量,变量名需对应
context.put("startTime", "2021-10-10");
context.put("lastTime", "2022-01-01");
List<Commodity> commodityList = new ArrayList<>();
Commodity commodity1 = new Commodity();
commodity1.setSpmc("手机");
commodity1.setXsl("800");
commodity1.setXsyl("600");
Commodity commodity2 = new Commodity();
commodity2.setSpmc("羽绒服");
commodity2.setXsl("206");
commodity2.setXsyl("66");
commodityList.add(commodity1);
commodityList.add(commodity2);
//与模板表格的commodity对应
context.put("commodity", commodityList);
//创建字段元数据
FieldsMetadata fm = report.createFieldsMetadata();
//Word模板中的表格数据对应的集合类型
fm.load("goods", Goods.class, true);
// //输出到本地目录
// FileOutputStream out = new FileOutputStream(new File("D://商品分析统计.docx"));
// report.process(context, out);
//浏览器端下载
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
String fileName = "商品分析统计.docx";
response.setHeader("Content-Disposition", "attachment;filename="
.concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
report.process(context, response.getOutputStream());
}
}
总结
例如:以上就是今天要讲的内容,后续加上导出图片和EXCEL的内容。
也可参考:Freemarker word导出教程 Freemarker word导出教程_@元气满满的博客-CSDN博客_freemarker导出word文档