1.导入依赖
环境
依赖
Apache的POI、FreeMarker和XDocreport xchart
fr.opensagres.xdocreport
fr.opensagres.xdocreport.core
2.0.2
fr.opensagres.xdocreport
fr.opensagres.xdocreport.document
2.0.2
fr.opensagres.xdocreport
fr.opensagres.xdocreport.template
2.0.2
fr.opensagres.xdocreport
fr.opensagres.xdocreport.document.docx
2.0.2
fr.opensagres.xdocreport
fr.opensagres.xdocreport.template.freemarker
2.0.2
org.freemarker
freemarker
2.3.23
commons-io
commons-io
2.5
org.projectlombok
lombok
1.18.22
org.springframework.boot
spring-boot-starter-web
2.2.9.RELEASE
org.knowm.xchart
xchart
3.5.4
2.Word模板
先创建一个模板,模板如下,word模板只能是docx文件,doc文件不支持,会报错。
3.java代码
模板放到resousces目录下
对应word表格中的字段
package com.example.demo.pojo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Pojo {
private int january;
private int february;
private int march;
private int april;
private int may;
private int june;
private int july;
private int august;
private int september;
private int october;
private int total;
}
@RestController
@RequestMapping(value = "/local-inout", produces = {"application/json;charset=UTF-8"})
public class TestController {
private static final Logger logger = LoggerFactory.getLogger(TestController.class);
@RequestMapping
@ResponseBody
public void exportWord(HttpServletResponse response) throws IOException, XDocReportException {
try {
//获取本地目录的word模板
InputStream mbwj = this.getClass().getResourceAsStream("/模板.docx");
//注册xdocreport实例并加载FreeMarker模板引擎
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(mbwj, TemplateEngineKind.Freemarker);
//创建xdocreport上下文对象
IContext context = report.createContext();
Pojo pojo = Pojo.builder()
.january(1)
.february(2)
.march(3)
.april(4)
.may(5)
.june(6)
.july(7)
.august(8)
.september(9)
.october(10)
.total(11)
.build();
//将需要替换的数据数据添加到上下文中
//其中key为word模板中的域名,value是需要替换的值
context.put("pojo", pojo);
context.put("auth", "青蛙");
context.put("date", "2022年11月17日");
//创建字段元数据,需要表格才加下面这两行,否则不用
FieldsMetadata fm = report.createFieldsMetadata();
//Word模板中的表格数据对应的集合类型
fm.load("pojo", Pojo.class, true);
//处理word文档并输出
String fileName = "统计.docx";
//浏览器下载
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名
report.process(context, response.getOutputStream());
} catch (IOException e) {
logger.error("读取Word模板异常", e);
} catch (XDocReportException e) {
logger.error("word模板生成失败", e);
}
}
}
结果:
4.导出饼状图加上表格
再创建一个模板 随便找一张图片贴到word文档中
Java代码:
@RestController
@RequestMapping(value = "/local-inout", produces = {"application/json;charset=UTF-8"})
public class TestController {
private static final Logger logger = LoggerFactory.getLogger(TestController.class);
@RequestMapping
@ResponseBody
public void exportWord(HttpServletResponse response) throws IOException, XDocReportException {
try {
//获取本地目录的word模板
InputStream mbwj = this.getClass().getResourceAsStream("/模板.docx");
//注册xdocreport实例并加载FreeMarker模板引擎
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(mbwj, TemplateEngineKind.Freemarker);
//创建xdocreport上下文对象
IContext context = report.createContext();
Pojo pojo = Pojo.builder()
.january(1)
.february(2)
.march(3)
.april(4)
.may(5)
.june(6)
.july(7)
.august(8)
.september(9)
.october(10)
.total(11)
.build();
//将需要替换的数据数据添加到上下文中
//其中key为word模板中的域名,value是需要替换的值
context.put("pojo", pojo);
context.put("auth", "青蛙");
context.put("date", "2022年11月17日");
//创建字段元数据,需要表格才加下面这两行,否则不用
FieldsMetadata fm = report.createFieldsMetadata();
//Word模板中的表格数据对应的集合类型
fm.load("pojo", Pojo.class, true);
//元数据中加入图片
fm.addFieldAsImage("chart");
PieChart chart = new PieChartBuilder().width(800).height(620)
.title("饼图").build();
//给饼图设置对应的值
chart.addSeries("1月", 1);
chart.addSeries("2月", 2);
chart.addSeries("3月", 3);
chart.addSeries("4月", 4);
chart.addSeries("5月", 5);
//生成饼图
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BitmapEncoder.saveBitmap(chart, baos, BitmapEncoder.BitmapFormat.JPG);
//把饼图添加到上下文对象
context.put("chart", new ByteArrayImageProvider(baos.toByteArray()));
//处理word文档并输出
String fileName = "统计.docx";
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名
report.process(context, response.getOutputStream());
} catch (IOException e) {
logger.error("读取Word模板异常", e);
} catch (XDocReportException e) {
logger.error("word模板生成失败", e);
}
}
}
结果:
5.图片加表格
用上面饼状图加表格的模板就可以
代码
@RequestMapping("/chart1")
@ResponseBody
/**
* 图片
*/
public void exportWordPag(@RequestParam("file") MultipartFile file, HttpServletResponse response) throws IOException, XDocReportException {
//获取Word模板,模板存放路径在项目的resources目录下
InputStream ins = this.getClass().getResourceAsStream("/模板.docx");
//注册xdocreport实例并加载FreeMarker模板引擎
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(ins,
TemplateEngineKind.Freemarker);
//创建xdocreport上下文对象
IContext context = report.createContext();
FieldsMetadata fm = report.createFieldsMetadata();
//元数据中加入图片
fm.addFieldAsImage("chart");
Pojo pojo = Pojo.builder()
.january(1)
.february(2)
.march(3)
.april(4)
.may(5)
.june(6)
.july(7)
.august(8)
.september(9)
.october(10)
.total(11)
.build();
//将需要替换的数据数据添加到上下文中
//其中key为word模板中的域名,value是需要替换的值
context.put("pojo", pojo);
context.put("auth", "青蛙");
context.put("date", "2022年11月17日");
//Word模板中的表格数据对应的集合类型
fm.load("pojo", Pojo.class, true);
//获取图片
InputStream inputStream = file.getInputStream();
// InputStream img1 = this.getClass().getResourceAsStream("/11.jpg");
//把图片添加到上下文对象
context.put("chart", inputStream);
String fileName = "统计.docx";
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名
report.process(context, response.getOutputStream());
}
结果: