java ftl 模板 输出list_freemarker导出word 文档list 集合遍历数据和图片

本文介绍如何使用Java和Freemarker模板(FTL)导出包含列表数据和图片的Word文档。首先,创建FTL模板,通过编辑XML文档并替换特定标记来设置列表遍历。然后在Java代码中加载模板,设置数据模型并生成文档。最后,展示如何在数据模型中添加图片的Base64编码以插入到Word中。
摘要由CSDN通过智能技术生成

因为业务需求,需要导出word 文档,效果如下:

04cb07e8b7e26571157f794988818b7f.png

上述字段 每一行为list 遍历得到

技术:   freemarker 技术---我们word 高级版本(ftl 的制作)

1 首先要准备ftl 文档

打开word 编辑,变为下面形式(注意,下面为表格插入,一行一列)

a15454ad12a94e183a6455805153fc13.png

然后将word 保存为xml  文档

845642d4f4d301cb8fd11e56f1f2de8f.png

打开xml 文档,下面我们就更改四处,

一加入 

前    第一个list 不能变  第二个list 为变量名  第三个list 为别名

二将${fieldname}  改为${list.fieldname}

三将${fieldname} 改为${list.fieldname}

四后加入#list>

注意:下面为省略的代码 代码格式化 --- notepad++ 打开-插件-XMLTools-pretty print开头的全点击

.......

${list.fieldname}

.......

${list.field}

#list>

将改好的xml 保存,如果notepad++报错不用理会,将xml 改为ftl 文件,就得到我们需要的ftl了,编译后的不要用word打开

2 java 代码的实现

引入jar 包

2.3.23

org.freemarker

freemarker

${freemarker.version}

ftl 文档存放

0a52888bbd06deb1a97c80942147fea7.png

代码书写

package export;

import java.io.*;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import freemarker.template.Configuration;

import freemarker.template.Template;

import freemarker.template.TemplateException;

import sun.misc.BASE64Encoder;

public class DocumentHandler {

private Configuration configuration = null;

public DocumentHandler() {

configuration = new Configuration();

configuration.setDefaultEncoding("utf-8");

}

public void createDoc() {

// 要填入模本的数据文件

Map dataMap = new HashMap();

getData(dataMap);

// getTest(dataMap);

// 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,

// 这里我们的模板是放在com.template包下面

configuration.setClassForTemplateLoading(this.getClass(),

"/com/template");

Template t = null;

try {

// test.ftl为要装载的模板

t = configuration.getTemplate("3.ftl");

t.setEncoding("utf-8");

} catch (IOException e) {

e.printStackTrace();

}

// 输出文档路径及名称

File outFile = new File("D:/test3.doc","utf-8"); //要与上下文编码一致

Writer out = null;

try {

out = new BufferedWriter(new OutputStreamWriter(

new FileOutputStream(outFile), "utf-8"));

} catch (Exception e1) {

e1.printStackTrace();

}

try {

t.process(dataMap, out);

out.close();

} catch (TemplateException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 注意dataMap里存放的数据Key值要与模板中的参数相对应

* @param dataMap

*

*/

@SuppressWarnings("unchecked")

private void getData(Map dataMap) {

dataMap.put("name", "表格设计的合理性美观性要考虑");

List> newsList=new ArrayList>();

for(int i=1;i<=5;i++){

Map map=new HashMap();

map.put("fieldname", "字段姓名"+i);

map.put("field", "字段内容"+i);

newsList.add(map);

}

dataMap.put("list",newsList); //注意list 的名字

}

生成文档

packageexport;public classExport {public static voidmain(String[] args) {

DocumentHandler dh=newDocumentHandler();

dh.createDoc();

System.out.println("end");

}

}

结束

后记,导出图片

dataMap.put("image", getImageStr());

1 privateString getImageStr() {2 String imgFile = "d:/1.png";3 InputStream in = null;4 byte[] data = null;5 try{6 in = newFileInputStream(imgFile);7 data = new byte[in.available()];8 in.read(data);9 in.close();10 } catch(IOException e) {11 e.printStackTrace();12 }13 BASE64Encoder encoder = newBASE64Encoder();14 returnencoder.encode(data);15 }16

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值