当前位置:   article > 正文

JAVA语言poi-tl 基于Apache POI的Word模板引擎动态生成word_poitl

poitl
一、需求(实现功能)

需求:根据word模板,动态填充模板内容,生成新的word。
实现:获取数据库数据,根据word模板填充内容,生成新的word文档
应用场景:笔者的应用场景是生成客户合同,根据用户提交的具体合同内容,填充进合同模板内,生成新的word即填充了内容的完整合同。

二、使用技术
1、poi-tl

poi-tl(poi template language)是基于Apache POI的Word模板引擎,纯Java组件,跨平台,代码短小精悍,通过插件机制使其具有高度扩展性。
官方文档:poi-tl官方文档

2、poi-tl的优点

根据官方文档介绍,poi-tl具有以下优点:
A、支持动态填充文本、图片、表格、列表、文档
B、支持DOCX格式,所有的模板标签都是以 {{ 开头,以 }} 结尾,模板标签可以出现在任何非文本框的位置,包括页眉,页脚,表格内部等等。
C、poi-tl的一个核心特点是数据模型与样式的分离,同样的数据模型可以用来渲染各种不同样式的模板。
D、文档的样式继承模板标签的样式,即如果模板{{title}}是蓝色微软雅黑加粗四号字体,则替换后的文本也是蓝色微软雅黑加粗四号字体。

三、具体应用
1、依赖
  1. <dependency>
  2. <groupId>com.deepoove</groupId>
  3. <artifactId>poi-tl</artifactId>
  4. <version>1.5.0</version>
  5. </dependency>

2、Java类 ,保存到本地

  1. import com.deepoove.poi.XWPFTemplate;
  2. import com.deepoove.poi.data.PictureRenderData;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.util.Assert;
  6. import java.io.File;
  7. import java.util.Date;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. /**
  11. * @author Jerry
  12. * @Title: WordUtil
  13. * @Description: Word工具类
  14. * @date 219/10/6 9:09
  15. */
  16. public class WordUtil {
  17. private static Logger logger = LoggerFactory.getLogger(WordUtil.class);
  18. /**
  19. * 根据模板填充内容生成word
  20. * 调用方法参考下面的main方法,详细文档参考官方文档
  21. * Poi-tl模板引擎官方文档:http://deepoove.com/poi-tl/
  22. *
  23. * @param templatePath word模板文件路径
  24. * @param fileDir 生成的文件存放地址
  25. * @param fileName 生成的文件名,不带格式。假如要生成abc.docx,则fileName传入abc即可
  26. * @param paramMap 替换的参数集合
  27. * @return 生成word成功返回生成的文件的路径,失败返回空字符串
  28. */
  29. public static String createWord(String templatePath, String fileDir, String fileName, Map<String, Object> paramMap) {
  30. Assert.notNull(templatePath, "word模板文件路径不能为空");
  31. Assert.notNull(fileDir, "生成的文件存放地址不能为空");
  32. Assert.notNull(fileName, "生成的文件名不能为空");
  33. // 生成的word格式
  34. String formatSuffix = ".docx";
  35. // 拼接后的文件名
  36. fileName = fileName + formatSuffix;
  37. // 生成的文件的存放路径
  38. if (!fileDir.endsWith("/")) {
  39. fileDir = fileDir + File.separator;
  40. }
  41. File dir = new File(fileDir);
  42. if (!dir.exists()) {
  43. logger.info("生成word数据时存储文件目录{}不存在,为您创建文件夹!", fileDir);
  44. dir.mkdirs();
  45. }
  46. String filePath = fileDir + fileName;
  47. // 读取模板templatePath并将paramMap的内容填充进模板,即编辑模板+渲染数据
  48. XWPFTemplate template = XWPFTemplate.compile(templatePath).render(paramMap);
  49. try {
  50. // 将填充之后的模板写入filePath
  51. template.writeToFile(filePath);
  52. template.close();
  53. } catch (Exception e) {
  54. logger.error("生成word异常", e);
  55. e.printStackTrace();
  56. return "";
  57. }
  58. return filePath;
  59. }
  60. public static void main(String[] args) {
  61. Map<String, Object> params = new HashMap<>();
  62. // 渲染文本
  63. params.put("projectName", "XXX工程");
  64. ...
  65. // 渲染图片
  66. params.put("picture", new PictureRenderData(120, 120, "D:\\wx.png"));//本地图片
  67. //params.put("signature", new PictureRenderData(120, 90,".png", //BytePictureUtils.getUrlBufferedImage(pictureUrl)));//图片url
  68. // TODO 渲染其他类型的数据请参考官方文档
  69. String templatePath = "D:\\zdd.docx";
  70. String fileDir = "D:\\template";
  71. String fileName = "zdd2";
  72. String wordPath = WordUtil.createWord(templatePath, fileDir, fileName, params);
  73. System.out.println("生成文档路径:" + wordPath);
  74. }
  75. }

 3、Java类 ,保存到OSS

  1. /**
  2. * 根据模板填充内容生成word
  3. * 详细文档参考官方文档
  4. * Poi-tl模板引擎官方文档:http://deepoove.com/poi-tl/
  5. *
  6. * @param templatePath word模板文件路径
  7. * @param fileDir 生成的文件存放地址
  8. * @param fileName 生成的文件名,不带格式。假如要生成abc.docx,则fileName传入abc即可
  9. * @param paramMap 替换的参数集合
  10. * @return 生成word成功返回生成的文件的路径,失败返回空字符串
  11. */
  12. public static InputStream createWord(String templatePath, String fileDir, String fileName, Map<String, Object> paramMap) {
  13. Assert.notNull(templatePath, "word模板文件路径不能为空");
  14. Assert.notNull(fileDir, "生成的文件存放地址不能为空");
  15. Assert.notNull(fileName, "生成的文件名不能为空");
  16. // 生成的word格式
  17. String formatSuffix = ".docx";
  18. // 拼接后的文件名
  19. fileName = fileName + formatSuffix;
  20. // 生成的文件的存放路径
  21. if (!fileDir.endsWith("/")) {
  22. fileDir = fileDir + File.separator;
  23. }
  24. File dir = new File(fileDir + File.separator);
  25. if (!dir.exists()) {
  26. log.info("生成word数据时存储文件目录{}不存在,为您创建文件夹!", fileDir);
  27. dir.mkdirs();
  28. }
  29. InputStream in = null;
  30. try {
  31. InputStream inputStream = IcePdfUtils.url2InputStream(templatePath);
  32. XWPFTemplate template = XWPFTemplate.compile(inputStream).render(paramMap);
  33. File file = new File(fileDir + File.separator + fileName);
  34. // 将填充之后的模板写入filePath
  35. template.writeToFile(file.getAbsolutePath());
  36. in = new FileInputStream(file);
  37. //用完删除
  38. FileUtil.del(dir);
  39. FileUtil.del(file);
  40. template.close();
  41. } catch (Exception e) {
  42. log.error("生成word异常", e);
  43. e.printStackTrace();
  44. }
  45. return in;
  46. }
  47. public static void main(String[] args) {
  48. Map<String, Object> params = new HashMap<>();
  49. // 渲染文本
  50. params.put("leasee", "XXX工程");
  51. ...
  52. // 渲染图片
  53. //params.put("picture", new PictureRenderData(120, 120, "D:\\wx.png"));//本地图片
  54. params.put("signature", new PictureRenderData(120, 90,".png",
  55. BytePictureUtils.getUrlBufferedImage(pictureUrl)));//图片url
  56. // TODO 渲染其他类型的数据请参考官方文档
  57. String templatePath = "url地址";
  58. String fileName = "名称";
  59. InputStream wordPath = createWord(templatePath, "download", fileName, params);
  60. String fileName2 = UUID.randomUUID().toString().replaceAll("-", "") + fileName;
  61. OssFile ossFile = OssUtils.uploadOosByByte(wordPath, fileName2 + ".docx");
  62. System.out.println("生成文档路径:" + ossFile.getFileUrl());
  63. return ossFile.getFileUrl();
  64. }

4.word模版

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/606726
推荐阅读
相关标签
  

闽ICP备14008679号