wordexport: JAVA生成并导出Word文档技术论证

[](#freemarker-%E6%A8%A1%E6%9D%BF)freemarker 模板

咨询了两位同事,其他项目上用到了word生成和导出,结合资料和自己的试验,技术上是可行的。主要是使用了 freemarker 模板填充占位符的方式来生成word文档,支持跨平台。

[](#%E5%AE%9E%E7%8E%B0%E6%AD%A5%E9%AA%A4)实现步骤

[](#1-doc%E6%96%87%E4%BB%B6%E7%94%9F%E6%88%90)1 doc文件生成

[](#11-%E6%A8%A1%E6%9D%BF%E5%88%B6%E4%BD%9C)1.1 模板制作

[](#12-%E5%B7%A5%E7%A8%8B%E5%88%9B%E5%BB%BA)1.2 工程创建

  • 1.2.1 创建springboot工程
  • 1.2.2 在pom.xml中添加freemarker依赖及springboot相关依赖
  • 1.2.3 在src/main/resources下创建文件目录templates
  • 1.2.4 将前面制作好的模板放到templates目录下
  • 1.2.5 开始编码、测试

[](#2-docx%E6%96%87%E4%BB%B6%E7%94%9F%E6%88%90)2 docx文件生成

[](#21-%E6%A8%A1%E6%9D%BF%E5%88%B6%E4%BD%9C)2.1 模板制作

  • 制作docx文件模板的详细步骤可参考 java利用Freemarker模板生成docx格式的word文档这篇文章
  • 生成内容为表格文本的docx文件的详细步骤可参考 java利用Freemarker模板生成docx格式的word文档(全过程)这篇文章。这篇文章参考了上面这篇文章,所以实现的步骤差不多一样。
  • 简单来说docx模板制作主要分为三步:
  • 1 将docx扩展名改为zip
  • 2 打开zip并拷贝并另存为压缩包中word/document.xml文件
  • 3 修改拷贝出的xml内容使之符合freemarker解析规范,并将xml扩展名改为ftl
  • 4 将document.ftl与zip包放到代码工程的静态资源路径下
  • docx模板使用注意事项:
  • 1 zip包为原docx文件的zip包,不要将修改后的document.xml覆盖替换原文件
  • 2 一个docx文件只对应一个document.ftl,所以有多个docx文件时,注意模板名称不要重复

[](#22-%E5%B7%A5%E7%A8%8B%E5%88%9B%E5%BB%BA)2.2 工程创建

  • 2.2.1 创建springboot工程
  • 2.2.2 在pom.xml中添加freemarker依赖及springboot相关依赖
  • 2.2.3 在src/main/resources下创建文件目录templates
  • 2.2.4 将前面制作好的模板document.ftl与zip包放到templates目录下
  • 2.2.5 开始编码、测试

[](#3-%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81)3 示例代码

[](#%E4%BA%8B%E9%A1%B9%E8%AF%B4%E6%98%8E)事项说明

  • 目前仅测试了扩展名为doc及docx且内容为表格文本的word文件的生成,没有对图片、超链接等进行测试验证
  • 使用freemarker模板生成word文件,前提是需要制作好模板,根据使用场景不同来填充不同模板生成word文档
  • 不同与其他项目中将生成的word文件先上传到mongodb再根据fileId下载文件的方式,我自己编写的代码是访问时直接下载,并没有将word文档存储到mongodb。具体采用哪种方式可以根据实际需求来进行选择

[](#%E5%85%B3%E4%BA%8E%E5%9B%BE%E7%89%87%E5%AF%BC%E5%87%BA)关于图片导出

  • doc 文件导出图片比较简单,只需要在模板的需要展示图片的位置设置占位符,将需要导出的图片转为 base64 编码即可替换。此方法已经过验证,是可行的,gitee 示例代码已经更新。
  • docx 文件导出图片比较麻烦些,首先将模板中需要展示图片的位置以及引用id都设置占位符(此占位符一般会替换为导出文件的文件名称),在导出图片时将需要导出的图片文件压缩到模板 zip 文件 word/media 目录中,同时用图片文件的名称(不包含扩展名)替换占位符,再将 zip 中 word/_rels/document.xml.rels 文件里追加导出图片的引用。此方法已经过验证,是可行的,gitee 示例代码已经更新。

[](#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99)参考资料

[](#apache-poi)apache-poi

[](#xwpfdocument)XWPFDocument

Modifier and Type

Field and Description

备注

protected java.util.List

bodyElements

迭代器(段落和表格)

protected java.util.List

charts

图表

protected java.util.List

comments

批注

protected java.util.List

contentControls

内容控制

protected XWPFEndnotes

endnotes

尾注

protected java.util.List

footers

页脚

protected XWPFFootnotes

footnotes

脚注

protected java.util.List

headers

页眉

protected java.util.List

hyperlinks

超链接

protected XWPFNumbering

numbering

编号

protected java.util.Map<java.lang.Long,java.util.List>

packagePictures

图片

protected java.util.List

paragraphs

段落(文字)

protected java.util.List

pictures

图片

protected XWPFStyles

styles

字体样式

protected java.util.List

tables

表格

[](#%E7%89%88%E6%9C%AC)版本

使用了两个版本的 apache-poi

  • 3.12 : 使用该版本请注释掉 com/fattree/apachepoi/word/utils 中的 ApachePOIUtils.javaMainUtils.java 这两个类
  • 4.1.2: 使用该版本请注释掉 com/fattree/apachepoi/word/utils 中的 ApachePOIUtils312.javaMainUtils312.java 这两个类

[](#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99-1)参考资料

[](#easy-poi)easy-poi

[](#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99-2)参考资料

[](#poi-tl)poi-tl

[](#%E5%85%B3%E4%BA%8E-apache-poi)关于 apache-poi

  • poi-tl(poi template language)是Word模板引擎,使用Word模板和数据创建很棒的Word文档。
  • poi-tl 是一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库

[](#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99-3)参考资料


原网址: 访问
创建于: 2023-05-08 11:31:22
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论