freemarker生成word 兼容wps/office/小程序打开 (服务器必须是windows)
一:目的:兼容wps/电脑端office/小程序打开
-
freemarker生成的word底层技术是XML,生成的word是不兼容小程序打开的
-
freemarker创建word模板的时候 文件格式选择为
(1)XML文件 生成的word只能兼容WPS,小程序不支持打不开
(2)Word XML 文档 生成的word兼容WPS、PC端office,小程序不支持打开 -
.避坑点如果选择的文件格式Word XML需要在注意下生成图片的问题,并不是直接在标签里面渲染的图片Base64,而是通过绑定的方式渲染的
(1)顶部通过标签将图片和图片显示区域绑定
顶部标签
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId5"
Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"
Target="media/image5.png"/>
</Relationships>
Id:图片显示区域的标签id 对应图片显示区域的 r:id
Target:图片的名称 对应底部图片的 pkg:name
图片显示区域
<v:imagedata r:id="rId5" o:title="eb84b15f3f5f075f811833e54b45f877"/>
底部图片
<pkg:part pkg:name="/word/media/image5.png"
pkg:contentType="image/png"
pkg:compression="store">
<pkg:binaryData>base64数据</pkg:binaryData>
二: freemarker生成word 此处不做描述(请自行查阅)
三:实现是用 jacob 将freemarker生成的word转成office可以打开的word
- 本次代码使用的环境windows 64位系统
- 需要使用的文件有两个jacob-1.18-x64.dll和jacob.dll 两个文件
- 步骤
(1)系统安装office
(2)jacob-1.18-x64.dll 文件放置 java_home得jdk1.8.0_131\jre\bin目录下面
(3)jacob.dll 64位系统放置C:\Windows\System32 目录下
pom
<dependency>
<groupId>com.hynnet</groupId>
<artifactId>jacob</artifactId>
<version>1.18</version>
</dependency>
文件转换代码
String newFile ="要生成的文件目录+文件名";
String oldFile ="freemarke生成的文件目录+文件名";
ActiveXComponent _app = new ActiveXComponent("Word.Application");
_app.setProperty("Visible", Variant.VT_FALSE);
Dispatch documents = _app.getProperty("Documents").toDispatch();
// 打开FreeMarker生成的Word文档
Dispatch doc = Dispatch.call(documents, "Open",oldFile, Variant.VT_FALSE, Variant.VT_TRUE).toDispatch();
// 另存为新的Word文档
Dispatch.call(doc, "SaveAs", newFile, Variant.VT_FALSE, Variant.VT_TRUE);
Dispatch.call(doc, "Close", Variant.VT_FALSE);
_app.invoke("Quit", new Variant[] {});
ComThread.Release();