Java利用freemarker导出带有图片的word文档

news/2024/11/28 10:46:30/

1.使用Microsoft Office Word编辑word模板,把需要动态修改的内容替换成${xxxxxx},如果有图片,尽量选择较小的图片几十K左右,并调整好位置及大小

 

                                                                           图1 模板示例

注意:

1.变量需要使用${},例如:${CORP_ADDR}

 

2.将word文件另存为Word 2003 XML文档格式

 

                                                         图2 另存为Word 2003 XML文档

注意:

1.另存为文件名要使用英文命名   

2.请使用Microsoft Office Word打开word并且另存为,因为WPS没有Word 2003 XML选项,只要Word XML,可能会出现兼容问题,导致2003版本word无法打开,并且图片处理上要麻烦一点

3.如果保存为Word XML文档,那么需要修改的地方更多(具体请查下最下面的测试模板)

 

3.用Firstobject free XML editor格式化导出来的xml文件

 

                                                         图3 Firstobject free XML editor格式化XML

下载Firstobject free XML editor,然后打开刚导出的xml,然后按F8或者Shift+F8快捷键格式化,然后保存

由于word另存为xml格式文件时,xml代码是被压缩的,所以需要格式化一下,便于阅读与编辑

 

4.使用Notepad++或类似编辑工具打开xml,检查动态变量是否正确

由于word编辑过程中,设置字体等原因,可能会导致${xxxxx}会被分割开,所以要检查xml文件里面的所有变量命名是否正确;   

修改后→   

 

图4 此处为错误变量与修改后变量

 

5.图片处理

1)如果导出来的文档与模板上的图片数量相等,不会动态新增图片的

搜索<w:binData ,会看到被这个标签包含起来的base64形式的图片,将base64编码删除,然后换成变量名${XXXXX}

修改后→  

 

图5 修改图片变量

 

2)如果图片是动态新增的,那么需要修改XML模板多处

1、搜索<w:binData ,会看到被这个标签包含起来的base64形式的图片,将base64编码删除,然后换成变量名${XXXXX}

2、修改<w:binData w:name属性 与 它匹配的<v:imagedata 标签的src属性,确保它们两个的命名一样,但是与其他图片命名不重复

 

注意:

1.“>${XXXXX}<”图片变量这尖括号中间不能加任何其他的诸如空格,tab,换行等符号。

6.处理List列表(待选)

使用<#list files as XXXX> </#list>遍历数据,其中XXXX为遍历后的对象,可以使用XXXX来取值,${XXXX_index}表示下标,${XXXX.NAME}为对象的值

 

图6 处理List

7. 标识替换完之后,模板就弄完了,另存为.ftl后缀文件即可

注意:

1.一定不要用word打开ftl模板文件,否则xml内容会发生变化,导致前面的工作白做了。

 

8.JAVA处理

1)引入freemarker

<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.22</version>
</dependency>

2)加入Util工具类

package com.gzzn.gzajzhjgpt.util;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;import cn.hutool.core.codec.Base64;
import freemarker.template.Configuration;
import freemarker.template.Template;/*** <b>利用FreeMarker,将ftl模板转为word;</b><br>* 1.将word另存为xml,修改后缀为ftl放入src/main/resources/templates中<br>* 2.WordUtil.createWord(dataMap, "check_report_temp.ftl", stream);调用* @ClassName: WordUtil* @author Jinlong Li* @Date: 2020年3月23日 下午3:04:50*/
public class WordUtil {/*** * @Title: createWord* @author Jinlong Li* @Date 2020年3月23日 上午11:24:27* @param dataMap      word中需要展示的动态数据,用map集合来保存* @param templateName word模板名称,例如:teample.ftl* @param os           输出流* @return void 返回类型*/@SuppressWarnings("deprecation")public static void createWord(Map<String, Object> dataMap, String templateName, OutputStream os) {try {// 创建配置实例Configuration configuration = new Configuration();// 设置编码configuration.setDefaultEncoding("UTF-8");// ftl模板文件configuration.setClassForTemplateLoading(WordUtil.class, "/templates");// 获取模板Template template = configuration.getTemplate(templateName);// 将模板和数据模型合并生成文件Writer out = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));// 生成文件template.process(dataMap, out);// 关闭流out.flush();out.close();} catch (Exception e) {e.printStackTrace();}}/*** 将图片转换为BASE64为字符串* * @param filename* @return* @throws IOException*/public static String getImageString(String filename) throws IOException {InputStream in = null;byte[] data = null;try {in = new FileInputStream(filename);data = new byte[in.available()];in.read(data);in.close();} catch (IOException e) {throw e;} finally {if (in != null) {in.close();}}return data != null ? Base64.encode(data) : "";}/*** 将图片转换为BASE64为字符串* * @param filename* @return* @throws IOException*/public static String getImageString(File file) throws IOException {InputStream in = null;byte[] data = null;try {in = new FileInputStream(file);data = new byte[in.available()];in.read(data);in.close();} catch (IOException e) {throw e;} finally {if (in != null) {in.close();}}return data != null ? Base64.encode(data) : "";}/*** 将图片转换为BASE64为字符串* * @param filename* @return* @throws IOException*/public static String getImageString(InputStream is) throws IOException {byte[] data = null;try {data = new byte[is.available()];is.read(data);} catch (IOException e) {throw e;} finally {if (is != null) {is.close();}}return data != null ? Base64.encode(data) : "";}
}

注意:

1.根据存放模板目录不一样,请调整Util里面的模板文件存放根目录,默认是/templates,即src/main/resources下面的templates目录下面

 

图7 模板文件目录

3)调用生成文档

/** 生成word */
WordUtil.createWord(dataMap, "check_report_temp.ftl", stream);

参数dataMap为Map<String, Object>结构的参数,key对应模板内的变量名,

参数check_report_temp.ftl,为模板文件名称

参数stream为输出流,如果想下载:

 

                                                             图8 下载word文档示例

如果想输出到本地:

                                                 图9 输出到本地示例

保存到本地测试代码:TestJava2Word.java

测试模板:check_report_temp.ftl

注意:测试模板导出的是Word XML文档,所以对图片处理上比Word 2003 XML文档上要多

Word 2003 XML测试模板:operinspectinfo.ftl

Word模板:OperInspectInfo.docx

效果图:

 

 

更多模板处理操作,请参考freemarker官方文档:https://freemarker.apache.org/           http://freemarker.foofun.cn/

FirstObject XML Editor下载地址:http://www.firstobject.com/dn_editor.htm                 http://www.youxiaxiazai.com/soft/128/297.html


http://www.ppmy.cn/news/338451.html

相关文章

GAN生成哆啦A梦,亲测训练50000epoch

** GAN生成哆啦A梦&#xff0c;亲测训练50000epoch ** 闲着没事学了一下GAN网络&#xff0c;感觉这个东西挺有趣的&#xff0c;所以就打算跟大家分享一下这个东西&#xff0c;其中的原理就不用跟大家说了&#xff0c;因为现在其他的博客介绍原理都很全面&#xff0c;大家可以…

cad2016批量修改相关字体,统一文字样式

1.先在页面打开&#xff0c;输入命令“st”,选择style,打开样式 2.standard,这个样式是系统默认的&#xff0c;将字体名修改为“微软雅园” 3.选中相关文字&#xff0c;然后选择文字>注释>将样式修改为“standad”,这样相关的文字都变为了微软雅黑的样子。

Win11解决应用程序字体太小

Win11解决应用程序字体太小 原因一般是 分辨率太高导致。 解决方法 右键属性选择兼容性更改DPI设置勾选替代高DPI缩放行为&#xff0c;注意要选择系统这个选项。 然后重新打开软件即可。

CAD图纸中文字字体特别粗看不清楚怎么办?

在设计完CAD图纸之后&#xff0c;点 击效果查看还是好好的&#xff0c;等我们将图纸文件发送给其他人之后&#xff0c;上面的文字就变得很粗或者是很细&#xff0c;完全就看不了了&#xff0c;那就疑惑了&#xff0c;为什么呢&#xff1f;这其实是字体线宽的设置有问题哦。下面…

kernal tch 下载 天正_kernal tch 下载 天正_打开cad图时提示TCH_KERNAL 缺乏解释器天正图形看不见, 请下载天正插件.........

答&#xff1a;一般就是CAD 3dmax vray 之类的 还有草图大师 这些属于最常用的 但是学起来特别难 没个月学不会 酷家乐设计 操作简单 搜索出图快 学起来特别容易 答&#xff1a;1、菜单栏选择“文件——绘图实用工具——检查”&#xff1b;也可以在命令行输入“AUDIT”&#xf…

天正lisp文件夹_天正文件布图在哪里

Q1. 为何图形导出后出现的填充和文字丢失&#xff1f; 一些设计单位在执行“图形导出”(以前叫“另存旧版”)命令后&#xff0c;把图形文件复制到其他机器&#xff0c;由天正3或者acad打开&#xff0c;出现丢失字体或者填充图案的问题。 原因是该机器的Acad系统没有天正建筑或者…

cad连筋字体怎么安装_天正建筑CAD字体太小怎么办?别慌!问题不大,解决方案都在这里...

我们在绘制图纸的时候&#xff0c;经常需要对图纸进行一些标注&#xff0c;不过有时候字体太小了&#xff0c;打印出来看不清&#xff0c;怎么办呢&#xff1f;今天小编就来告诉大家调整字体的办法&#xff01;希望能够帮助到大家~ 一、改变字体大小 1、文字样式 首先&#xff…