因为业务需求,需要导出word 文档,效果如下:
上述字段 每一行为list 遍历得到
技术: freemarker 技术---我们word 高级版本(ftl 的制作)
1 首先要准备ftl 文档
打开word 编辑,变为下面形式(注意,下面为表格插入,一行一列)
然后将word 保存为xml 文档
打开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 文档存放
代码书写
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