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

上述字段 每一行为list 遍历得到
技术: freemarker 技术---我们word 高级版本(ftl 的制作)
1 首先要准备ftl 文档
打开word 编辑,变为下面形式(注意,下面为表格插入,一行一列)

然后将word 保存为xml 文档
![]()
打开xml 文档,下面我们就更改四处,
一加入 <w:tr>前<#list list as list> 第一个list 不能变 第二个list 为变量名 第三个list 为别名
二将${fieldname} 改为${list.fieldname}
三将${fieldname} 改为${list.fieldname}
四</w:tr>后加入</#list>
注意:下面为省略的代码 代码格式化 --- notepad++ 打开-插件-XMLTools-pretty print开头的全点击
<#list list as list> <w:tr> <w:tblPrEx> <w:tblBorders> ....... <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:lang w:val="en-US" w:eastAsia="zh-CN"/> </w:rPr> <w:t>${list.fieldname}</w:t> </w:r> </w:p> ....... <w:rPr> <w:rFonts w:hint="eastAsia"/> <w:lang w:val="en-US" w:eastAsia="zh-CN"/> </w:rPr> <w:t>${list.field}</w:t> </w:r> </w:p> <w:p> </w:p> </w:tc> </w:tr> </#list>
将改好的xml 保存,如果notepad++报错不用理会,将xml 改为ftl 文件,就得到我们需要的ftl了,编译后的不要用word打开
2 java 代码的实现
引入jar 包
<properties> <!--freemarker--> <freemarker.version>2.3.23</freemarker.version> </properties> <dependencies> <!--freemarker--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>${freemarker.version}</version> </dependency>
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<Map<String, Object>> newsList=new ArrayList<Map<String,Object>>();
for(int i=1;i<=5;i++){
Map<String, Object> map=new HashMap<String, Object>();
map.put("fieldname", "字段姓名"+i);
map.put("field", "字段内容"+i);
newsList.add(map);
}
dataMap.put("list",newsList); //注意list 的名字
}
生成文档
package export; public class Export { public static void main(String[] args) { DocumentHandler dh=new DocumentHandler(); dh.createDoc(); System.out.println("end"); } }
结束
后记,导出图片
dataMap.put("image", getImageStr());
1 private String getImageStr() { 2 String imgFile = "d:/1.png"; 3 InputStream in = null; 4 byte[] data = null; 5 try { 6 in = new FileInputStream(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 = new BASE64Encoder(); 14 return encoder.encode(data); 15 } 16
浙公网安备 33010602011771号