当前位置: 首页 > news >正文

Java使用模板导出word、pdf

使用deepoove根据模板导出word文档,包括文本、表格、图表、图片,使用WordConvertPdf可将word文档转换为pdf导出

模板样例:

导出结果:

一、引入相关依赖
        <!--        工具类--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency><!--        poi--><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.11.1</version></dependency><!--        word转pdf--><dependency><groupId>WordConvertPdf</groupId><artifactId>WordConvertPdf</artifactId><version>1.0</version></dependency>
二、创建导出数据实体类
@AllArgsConstructor
@NoArgsConstructor
@Data
@ApiModel(value = "ExportVO", description = "导出VO")
public class ExportVO {@ApiModelProperty(value = "标题")private String title;@ApiModelProperty(value = "名称")private String name;@ApiModelProperty(value = "数量")private Integer num;@ApiModelProperty(value = "集合数据")private List<ExportListVO> list;@ApiModelProperty(value = "表格")private List<ExportListVO> table;@ApiModelProperty(value = "柱状图")private ChartMultiSeriesRenderData barChart;@ApiModelProperty(value = "饼图")private ChartSingleSeriesRenderData pieChart;@ApiModelProperty(value = "折线图")private ChartMultiSeriesRenderData lineChart;@ApiModelProperty(value = "图片")private PictureRenderData img;}
@AllArgsConstructor
@NoArgsConstructor
@Data
@ApiModel(value = "ExportListVO", description = "导出集合VO")
public class ExportListVO {@ApiModelProperty(value = "类型")private String type;@ApiModelProperty(value = "数量")private Integer num;}

三、业务代码

 /*** 文档导出** @param fileType 导出文件类型:1-docx,2-pdf* @param response 响应流*/@Overridepublic void exportFile(Integer fileType, HttpServletResponse response) throws IOException {//模板地址,存放在resources目录下String filePath = "templates/word/test.docx";//使用poi-tl进行模板处理ConfigureBuilder builder = Configure.builder();builder.useSpringEL(true);//执行循环策略LoopRowTableRenderPolicy strategy = new LoopRowTableRenderPolicy();//绑定集合对象builder.bind("list", strategy);builder.bind("table", strategy);//获取模板文件流InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);assert inputStream != null;//组装数据ExportVO data = this.createData();XWPFTemplate render = XWPFTemplate.compile(inputStream, builder.build()).render(data);// 设置强制下载不打开response.setContentType("application/force-download");response.addHeader("Access-Control-Expose-Headers", " Content-Disposition");if (fileType.equals(1)) {//如果需要导出为wordresponse.addHeader("Content-Disposition", "attachment; fileName=" + new String(("导出模板.docx").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));render.write(response.getOutputStream());} else if (fileType.equals(2)) {//如果需要导出为pdfresponse.addHeader("Content-Disposition", "attachment; fileName=" + new String(("导出模板.pdf").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));BufferedOutputStream outputStream = new BufferedOutputStream(response.getOutputStream());//设置临时文件的地址String tempPath = UUID.randomUUID() + ".docx";//根据模板生成临时文件render.writeToFile(tempPath);//将docx流转换为pdf流FileInputStream fileInputStream = new FileInputStream(tempPath);WordConvertPdf.getPdfStreamByWordStream(fileInputStream, outputStream);outputStream.flush();outputStream.close();fileInputStream.close();//删除临时文件File tempFile = new File(tempPath);Files.delete(tempFile.toPath());log.debug("删除临时word文件:{}", tempPath);}}

 需要注意的时,文档中需要循环的数必须绑定biulder

四、组装数据,createData方法
  private ExportVO createData() {ExportVO data = new ExportVO();//普通文本data.setTitle("食品统计");data.setName("蔬菜统计");data.setNum(60);//集合数据List<ExportListVO> list = new ArrayList<>();list.add(new ExportListVO("黄瓜", 10));list.add(new ExportListVO("茄子", 20));list.add(new ExportListVO("番茄", 30));//添加循环文本数据data.setList(list);//添加表格数据data.setTable(list);//添加柱状图数据ChartMultiSeriesRenderData barChart = new ChartMultiSeriesRenderData();barChart.setChartTitle("蔬菜统计柱状图");barChart.setCategories(list.stream().map(ExportListVO::getType).toArray(String[]::new));List<SeriesRenderData> barChartSeriesData = new ArrayList<>();barChartSeriesData.add(new SeriesRenderData("箱", list.stream().map(ExportListVO::getNum).toArray(Integer[]::new)));barChart.setSeriesDatas(barChartSeriesData);data.setBarChart(barChart);//添加饼图数据ChartSingleSeriesRenderData pieChart = new ChartSingleSeriesRenderData();pieChart.setChartTitle("蔬菜统计饼图");pieChart.setCategories(list.stream().map(ExportListVO::getType).toArray(String[]::new));pieChart.setSeriesData(new SeriesRenderData("箱", list.stream().map(ExportListVO::getNum).toArray(Integer[]::new)));data.setPieChart(pieChart);//添加折现图ChartMultiSeriesRenderData lineChart = new ChartMultiSeriesRenderData();lineChart.setChartTitle("蔬菜统计折线图");lineChart.setCategories(list.stream().map(ExportListVO::getType).toArray(String[]::new));List<SeriesRenderData> lineChartSeriesData = new ArrayList<>();lineChartSeriesData.add(new SeriesRenderData("箱", list.stream().map(ExportListVO::getNum).toArray(Integer[]::new)));lineChart.setSeriesDatas(lineChartSeriesData);data.setLineChart(lineChart);//添加图片PictureRenderData img = new PictureRenderData(800, 200, "D:\\files\\img\\test.jpg");data.setImg(img);return data;}
五、模板说明
1.这里面由{{}}包裹的内容对应ExportVO 实体中的属性名称

2.这里的list对应ExportVO实体中的list属性,循环list写入文本,并判断是否是最后一条数据,最后一条数据由.句号结尾

3.table对应ExportVO实体中table属性,type和num对应集合实体类ExportListVO中的type和num

4.模板中右键柱状图,查看可选文字,修改替换文字为ExportVO实体中柱状图属性名称{{barChart}}

5.模板中右键饼图,查看可选文字,修改替换文字为ExportVO实体中饼图属性名称{{pieChart}}

6.模板中右键折线图,查看可选文字,修改替换文字为ExportVO实体中折线图属性名称{{lineChart}}

7.模板中右键图片,查看可选文字,修改替换文字为ExportVO实体中图片属性名称{{img}}

http://www.lryc.cn/news/187821.html

相关文章:

  • 速通Redis基础(二):掌握Redis的哈希类型和命令
  • WebDAV之π-Disk派盘 + 书藏家
  • 香港Web3.0生态现状
  • LLMs之BELLE:源码解读(sft_train.py文件)
  • 【UE5 Cesium】17-Cesium for Unreal 建立飞行跟踪器(2)
  • 【ElasticSearch】基于 Java 客户端 RestClient 实现对 ElasticSearch 索引库、文档的增删改查操作,以及文档的批量导入
  • 【Node.js】stream 流模块
  • 【LeetCode】——链式二叉树经典OJ题详解
  • 代码注释对于程序员重要吗?
  • OpenHamony开发笔记一:在HarmonyOS虚拟机上运行openharmony工程
  • C++程序员入门需要怎么学?(InsCode AI 创作助手)
  • Intel 高性能库之IPP信号处理简介及下载(版本5.1,含32位和64位及注册)
  • 【C++】运算符重载案例 - 字符串类 ② ( 重载 等号 = 运算符 | 重载 数组下标 [] 操作符 | 完整代码示例 )
  • Vue脚手架开发流程
  • 从零开始学习线性回归:理论、实践与PyTorch实现
  • [LeetCode]链式二叉树相关题目(c语言实现)
  • 集成学习
  • 算法练习11——买卖股票的最佳时机 II
  • linux——多线程,线程控制
  • Oracle 简介与 Docker Compose部署
  • mp4音视频分离技术
  • JVM 参数
  • 黑马点评-07缓存击穿问题(热点key失效)及解决方案,互斥锁和设置逻辑过期时间
  • 信息系统项目管理师第四版学习笔记——项目进度管理
  • 指挥棒:C++ 与运算符
  • HTTPS建立连接的过程
  • Python接口自动化搭建过程,含request请求封装!
  • Vue3 编译原理
  • spring boot整合Minio
  • Hadoop----Azkaban的使用与一些报错问题的解决