因为业务需求,需要导出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