最近项目遇到需要生成复杂word文档的功能。个人感觉poi对excel的操作强于对word的操作,jacob对写复杂的word来说操作量也比较大,网上看到有关freemarker制作word模板并能轻松导出,决定一试,果然方便,下面介绍下采用freemarker制作模板导出的步骤和方法。
1、做好原始的word模板(按照自己的需求制作),下面是我项目中的需求模板
内容比较多(有多级表头,有图片等等),就不一一截图了。
2、有了模板之后就可以开始进行变量的设置了,如上图中编制时间就可以修改成“编制时间:${year}年${month}月${day}日”。把所有需要动态设置的内容用变量替换。
3、将处理好后的word文档另存为xml格式,‘Word 2003 XML文档(*.xml)’下载foxe_CHS.exe工具,打开处理好的xml格式文档。检查一遍是否所有的设置变量都确认无误(有时候在存储成xml文档的过程中,变量有可能会被拆分成几部分,如${year} 有可能被拆分成了'${ye'和'ar}',这时就需要自己去修改调整过来)
确认变量设置完成后,将文件存储为XX.ftl格式的文件。
4、java后台模板载入:
//设置模本装置方法和路径,FreeMarker支持多种模板装载方法.可以重servlet,classpath,数据库装载,
//这里我们的模板是放在com/dse/gzzxhl/word/report/day包下面
this.configuration = new Configuration();
this.configuration.setDefaultEncoding("utf-8");
configuration.setClassForTemplateLoading(this.getClass(), "/com/dse/gzzxhl/word/report/day");
Template t=null;
try {
//shuiqingribao.ftl为要装载的模板
t = configuration.getTemplate("xxx.ftl");
} catch (IOException e) {
e.printStackTrace();
return false;
}
5、设置数据集
dataMap.put("year",arr[0]);
dataMap.put("month",Integer.parseInt(arr[1]));
dataMap.put("day",Integer.parseInt(arr[2]));
//生成雨情描述
dataMap.put("yqdesc",getYqdesc(date,list0,list1,list2));
//生成雨量统计数据集(暴雨以上量级)
dataMap.put("yltjlist",getYltjList(list3));
//雨情图片
dataMap.put("jyurl", getImageStr("XXX.png"));
//水情描述
dataMap.put("sqdesc",getSqdesc(date,list4,list5,list6)[0]);
//水情描述1
dataMap.put("sqdesc1",getSqdesc(date,list4,list5,list6)[1]);
//水情报警信息数据集
dataMap.put("sqbjxxlist",sqbjxxlist);
注意图片要用base64编码转换:方法如下
private String getImageStr(String url) {
String imgFile = url;
InputStream in = null;
byte[] data = null;
try {
File file = new File(url);
if(file.exists()){
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
}
else{
System.out.println("文件"+url+"不存在!");
return "";
}
} catch (IOException e) {
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}
6、输出文档,代码如下:
String filePath = “XXX/XX/X"//要输出的路径
File outFile = new File(filePath);
Writer out = null;
try {
FileOutputStream fos = new FileOutputStream(outFile);
OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8");
out = new BufferedWriter(oWriter);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
return false;
}
try {
//dataMap为设置好的数据集
t.process(dataMap, out);
return true;
}
catch (TemplateException e){
e.printStackTrace();
return false;
}catch(IOException e1){
e1.printStackTrace();
return false;
}
finally{
out.flush();
out.close();
}
7、完成输出,生成文档。
相关推荐
当涉及到多表格的复杂Word文档时,我们需要在FTL模板中定义多个表格,并在运行时填充这些表格的数据。FreeMarker支持多种数据类型,包括列表、映射等,这使得在模板中创建和操作表格变得简单。你可以通过迭代数据...
- **创建模板**:在FreeMarker中创建一个Word模板,定义好文档的布局和样式,用`<#...>`标记来定义变量。 - **配置FreeMarker**:在Java项目中引入FreeMarker库,设置模板目录,加载模板文件。 - **准备数据模型*...
# 本项目主要介绍 1. itextpdf(CreatePdf) 不太推荐需要在代码内部编写PDF格式,如果要使用,建议写个基类,将同一版本 或者同一类型的公共方法写入,差异化的抽象,一个模板一个子类...复杂word动态生成上功能很强大
在SSM项目中,FreeMarker模板可以用来生成Word文档的结构和内容。开发者通常会创建一个FreeMarker模板文件,其中包含固定的格式和占位符,然后在Java代码中填充数据,生成Word文档。 Jacob库的使用是为了在Java环境...
在Word中直接添加这些元素是简单易行的,但在编程环境中,这可能需要额外的图像处理库,如Java的ImageIO或者第三方库,如FreeMarker或Thymeleaf,它们可以与Apache POI结合使用。 4. **PDF文档处理**: 虽然主要讨论...
本主题聚焦于如何利用一个文档模板原件和将其转换为.ftl(FreeMarker)格式来生成动态的Word文档。FreeMarker是Java的一个模板引擎,常用于生成HTML、XML等静态或动态文本,但也可扩展到生成Word文档。 首先,理解...
Java 通过模板生成 Word 是一个常见的需求,尤其在企业级应用中,经常需要根据动态数据生成报告或合同等文档。这个过程通常涉及到使用特定库来处理 Word 文档的创建和编辑。本文将深入探讨如何使用 Java 实现这一...
在IT行业中,Word模板填充是一项常见的任务,尤其在自动化文档生成和报告制作中十分有用。这里我们关注的是一个名为"word-export"的项目,它利用了FreeMarker模板引擎来实现这个功能。FreeMarker是一个强大的、轻量...
本项目"freemaker2word"专注于利用FreeMarker将数据转换为Microsoft Word文档,其中包括了图片和表格的处理,这对于那些需要自动化生成报告或者批量制作文档的场景非常实用。 在FreeMarker的工作原理中,它通过读取...
使用Freemarker模板引擎,开发者可以定义模板,将XML数据动态渲染成Word文档,实现自定义的格式化输出。 7. **Freemarker**:Freemarker是一个基于Java的模板引擎,常用于生成HTML、XML或其他格式的文本。它允许...
5. **FreeMarker和velocity**:这两个模板引擎可以与Apache POI或其他库结合使用,通过模板来生成docx文档。这种方式适合大量重复性内容的生成,如批量生成个性化合同。 6. **export-word-main项目**:根据提供的...