freemarker导出word文档(循环+合并单元格)
Step1. 制作模板
首先准备一份要导出的word.doc文档;
例如,这就是你要生成的效果:
如上图,行不确定,列是确定的,先不考虑合并单元格的问题,假设每个部分都只是一列的时候,制作相应模板,把需要导出的数据相应的插入 ${}到里面, ${}就是个占位符,来放数据的,如下:
接下来使用wps将文档另存为xml格式,然后将xml文件的后缀名改成ftl
这样一来模板就制作完成了
Step2. 修改ftl文档
使用ue或者其他格式化工具打开ftl文档,这样方便查看,不然一大堆代码看起来很费劲,
<#list list1 as item><#if item_index==0>${item.a1} ${item.aa} ${item.ab} ${item.ac} <#elseif item_index!=0 >${item.a1} ${item.aa} ${item.ab} ${item.ac} #if>
#list>
Step3. 生成word文档代码
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;public class Word08 {private Configuration configuration = null; public Word08(){ configuration = new Configuration(); configuration.setDefaultEncoding("UTF-8"); } public static void main(String[] args) { Word08 test = new Word08(); test.createWord(); } public void createWord(){ Map dataMap=new HashMap(); getData(dataMap);configuration.setClassForTemplateLoading(this.getClass(), "");Template t=null; try { t = configuration.getTemplate("080.ftl","UTF-8");File outFile = new File("D:/outFile"+new SimpleDateFormat("yyyy-MM-dd-HH-mm").format(new Date())+".doc"); //?????????? Writer out = null; out = new BufferedWriter(new OutputStreamWriter((new FileOutputStream(outFile)), "UTF-8")); t.process(dataMap, out);System.out.println("生成成功");} catch (Exception e) { e.printStackTrace(); } } private void getData(Map dataMap) {List
TestDto08是一个实体类为了获取数据临时加上的
public class TestDto08 {private String state;private String a;private String aa;private String ab;private String ac;private String bb;private String bc;private String bd;private String a1;private String b1;private String c1;public String getB1() {return b1;}public void setB1(String b1) {this.b1 = b1;}public String getA1() {return a1;}public void setA1(String a1) {this.a1 = a1;}public String getC1() {return c1;}public void setC1(String c1) {this.c1 = c1;}public String getA() {return a;}public void setA(String a) {this.a = a;}public String getAa() {return aa;}public void setAa(String aa) {this.aa = aa;}public String getAb() {return ab;}public void setAb(String ab) {this.ab = ab;}public String getAc() {return ac;}public void setAc(String ac) {this.ac = ac;}public String getState() {return state;}public void setState(String state) {this.state = state;}public String getBb() {return bb;}public void setBb(String bb) {this.bb = bb;}public String getBc() {return bc;}public void setBc(String bc) {this.bc = bc;}public String getBd() {return bd;}public void setBd(String bd) {this.bd = bd;}}
代码比较简单可以自己理解一下。
如果你不想使用那么多的list,这些也可以在一个list中完成,使用<#list map?keys as key>遍历list中的map,这时list中就会有三个map,这样做模板就不需要三行,只需要做一行。ftl代码如下:
<#list map?keys as key>
<#list map[key] as item>
<#if item_index==0>
${item.a}
${item.aa} ${item.ab} ${item.ac} <#elseif item_index!=0 >
${item.a}
${item.aa} ${item.ab} ${item.ac} #if> #list>
#list>
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
