• Java使用模板导出word、pdf


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

    模板样例:

    导出结果:

    一、引入相关依赖
    1. <dependency>
    2. <groupId>cn.hutoolgroupId>
    3. <artifactId>hutool-allartifactId>
    4. <version>5.8.16version>
    5. dependency>
    6. <dependency>
    7. <groupId>com.deepoovegroupId>
    8. <artifactId>poi-tlartifactId>
    9. <version>1.11.1version>
    10. dependency>
    11. <dependency>
    12. <groupId>WordConvertPdfgroupId>
    13. <artifactId>WordConvertPdfartifactId>
    14. <version>1.0version>
    15. dependency>
    二、创建导出数据实体类
    1. @AllArgsConstructor
    2. @NoArgsConstructor
    3. @Data
    4. @ApiModel(value = "ExportVO", description = "导出VO")
    5. public class ExportVO {
    6. @ApiModelProperty(value = "标题")
    7. private String title;
    8. @ApiModelProperty(value = "名称")
    9. private String name;
    10. @ApiModelProperty(value = "数量")
    11. private Integer num;
    12. @ApiModelProperty(value = "集合数据")
    13. private List list;
    14. @ApiModelProperty(value = "表格")
    15. private List table;
    16. @ApiModelProperty(value = "柱状图")
    17. private ChartMultiSeriesRenderData barChart;
    18. @ApiModelProperty(value = "饼图")
    19. private ChartSingleSeriesRenderData pieChart;
    20. @ApiModelProperty(value = "折线图")
    21. private ChartMultiSeriesRenderData lineChart;
    22. @ApiModelProperty(value = "图片")
    23. private PictureRenderData img;
    24. }
    1. @AllArgsConstructor
    2. @NoArgsConstructor
    3. @Data
    4. @ApiModel(value = "ExportListVO", description = "导出集合VO")
    5. public class ExportListVO {
    6. @ApiModelProperty(value = "类型")
    7. private String type;
    8. @ApiModelProperty(value = "数量")
    9. private Integer num;
    10. }

    三、业务代码

    1. /**
    2. * 文档导出
    3. *
    4. * @param fileType 导出文件类型:1-docx,2-pdf
    5. * @param response 响应流
    6. */
    7. @Override
    8. public void exportFile(Integer fileType, HttpServletResponse response) throws IOException {
    9. //模板地址,存放在resources目录下
    10. String filePath = "templates/word/test.docx";
    11. //使用poi-tl进行模板处理
    12. ConfigureBuilder builder = Configure.builder();
    13. builder.useSpringEL(true);
    14. //执行循环策略
    15. LoopRowTableRenderPolicy strategy = new LoopRowTableRenderPolicy();
    16. //绑定集合对象
    17. builder.bind("list", strategy);
    18. builder.bind("table", strategy);
    19. //获取模板文件流
    20. InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);
    21. assert inputStream != null;
    22. //组装数据
    23. ExportVO data = this.createData();
    24. XWPFTemplate render = XWPFTemplate.compile(inputStream, builder.build()).render(data);
    25. // 设置强制下载不打开
    26. response.setContentType("application/force-download");
    27. response.addHeader("Access-Control-Expose-Headers", " Content-Disposition");
    28. if (fileType.equals(1)) {
    29. //如果需要导出为word
    30. response.addHeader("Content-Disposition", "attachment; fileName=" + new String(("导出模板.docx").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
    31. render.write(response.getOutputStream());
    32. } else if (fileType.equals(2)) {
    33. //如果需要导出为pdf
    34. response.addHeader("Content-Disposition", "attachment; fileName=" + new String(("导出模板.pdf").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
    35. BufferedOutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
    36. //设置临时文件的地址
    37. String tempPath = UUID.randomUUID() + ".docx";
    38. //根据模板生成临时文件
    39. render.writeToFile(tempPath);
    40. //将docx流转换为pdf流
    41. FileInputStream fileInputStream = new FileInputStream(tempPath);
    42. WordConvertPdf.getPdfStreamByWordStream(fileInputStream, outputStream);
    43. outputStream.flush();
    44. outputStream.close();
    45. fileInputStream.close();
    46. //删除临时文件
    47. File tempFile = new File(tempPath);
    48. Files.delete(tempFile.toPath());
    49. log.debug("删除临时word文件:{}", tempPath);
    50. }
    51. }

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

    四、组装数据,createData方法
    1. private ExportVO createData() {
    2. ExportVO data = new ExportVO();
    3. //普通文本
    4. data.setTitle("食品统计");
    5. data.setName("蔬菜统计");
    6. data.setNum(60);
    7. //集合数据
    8. List list = new ArrayList<>();
    9. list.add(new ExportListVO("黄瓜", 10));
    10. list.add(new ExportListVO("茄子", 20));
    11. list.add(new ExportListVO("番茄", 30));
    12. //添加循环文本数据
    13. data.setList(list);
    14. //添加表格数据
    15. data.setTable(list);
    16. //添加柱状图数据
    17. ChartMultiSeriesRenderData barChart = new ChartMultiSeriesRenderData();
    18. barChart.setChartTitle("蔬菜统计柱状图");
    19. barChart.setCategories(list.stream().map(ExportListVO::getType).toArray(String[]::new));
    20. List barChartSeriesData = new ArrayList<>();
    21. barChartSeriesData.add(new SeriesRenderData("箱", list.stream().map(ExportListVO::getNum).toArray(Integer[]::new)));
    22. barChart.setSeriesDatas(barChartSeriesData);
    23. data.setBarChart(barChart);
    24. //添加饼图数据
    25. ChartSingleSeriesRenderData pieChart = new ChartSingleSeriesRenderData();
    26. pieChart.setChartTitle("蔬菜统计饼图");
    27. pieChart.setCategories(list.stream().map(ExportListVO::getType).toArray(String[]::new));
    28. pieChart.setSeriesData(new SeriesRenderData("箱", list.stream().map(ExportListVO::getNum).toArray(Integer[]::new)));
    29. data.setPieChart(pieChart);
    30. //添加折现图
    31. ChartMultiSeriesRenderData lineChart = new ChartMultiSeriesRenderData();
    32. lineChart.setChartTitle("蔬菜统计折线图");
    33. lineChart.setCategories(list.stream().map(ExportListVO::getType).toArray(String[]::new));
    34. List lineChartSeriesData = new ArrayList<>();
    35. lineChartSeriesData.add(new SeriesRenderData("箱", list.stream().map(ExportListVO::getNum).toArray(Integer[]::new)));
    36. lineChart.setSeriesDatas(lineChartSeriesData);
    37. data.setLineChart(lineChart);
    38. //添加图片
    39. PictureRenderData img = new PictureRenderData(800, 200, "D:\\files\\img\\test.jpg");
    40. data.setImg(img);
    41. return data;
    42. }
    五、模板说明
    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}}

  • 相关阅读:
    爱上开源之golang入门至实战-第二章语言基础-变量
    Neo4j入门教程2(看不懂评论区随便骂)
    淘女郎买家秀API接口
    例题合集传送门:2019年下半年1+X 证书 Web 前端开发初级理论考试题目原题+答案和实操题原题两套+答案
    软件测试2年,想去培训性能测试自动化测试,28岁了,要不要培训?
    南大通用数据库-Gbase-8a-学习-05-通过审计日志抓取Sql、Trace日志查看执行计划
    WPF“x:name”和“name”有什么区别
    二舅治好我的精神内耗,也让我火出了B站
    新能源汽车软件开发设计规范
    Win10无法连接打印机怎么办?不能使用打印机的解决方法
  • 原文地址:https://blog.csdn.net/txyllyyj/article/details/133675295