freemarker 导出word 步骤:
1. 导入freemarker-2.3.19.jar 包
2. 将模板另存为 .xml文件
3. 打开xml文件找到需要填充数据的字段添加 ${变量名称}
要在 姓名 后面添加数据 姓名:${name}
4. 修改完后,将文件后缀改为 .flt格式
5. 添加导出代码
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class ExportWord
{
private Configuration configuration = null;
private Template template = null;
private static Object obj = new Object();
public ExportWord()
{
}
@SuppressWarnings("unchecked")
public void init(Map map, OutputStream outs, String inUrl)
{
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
// 设置test.flt所在的加载路径,在test包下
configuration.setClassForTemplateLoading(this.getClass(), "/com/util");
try
{
// test.flt为要装载的模板
template = configuration.getTemplate(inUrl);
template.setEncoding("utf-8");
}
catch (IOException e)
{
e.printStackTrace();
}
createDoc(map, outs);
}
/**
* 创建Doc文件
*
* @author
*/
@SuppressWarnings("unchecked")
public void createDoc(Map map, OutputStream outs)
{
// 填充模板数据
// getData(dataMap);
Writer out = null;
// File outFile = new File("d:/aa.doc");
try
{
out = new BufferedWriter(new OutputStreamWriter(outs, "utf-8"));
// out = new BufferedWriter(new OutputStreamWriter(new
// FileOutputStream(outFile), "utf-8"));
}
catch (Exception e1)
{
e1.printStackTrace();
}
try
{
// 这里注意同步,因为前面是单例
synchronized (obj)
{
template.process(map, out);
}
outs.flush();
outs.close();
out.close();
}
catch (TemplateException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
/**
* 填充数据 注意dataMap里存放的数据Key值要与模板中的参数相对应
*
* @param dataMap
* @author
*/
private void getData(Map dataMap)
{
dataMap.put("zhengshu_number", "00000111");
dataMap.put("aa", "张三");
dataMap.put("bb", "1000.52");
}
}
6. 给模板中添加需要填充的数据,使用Map封装
// 导出模板的数据
Map dataMap = new HashMap<String, String>();
// 姓名
dataMap.put("name","XXXXXXXXXXXX" );
注意:map中的key 为第3步中标红的 ${变量名称} ,“变量名称“必须和模板中添加的名称一致,否则数据填充不上去
如:
dataMap.put(" name","XXXXXXXXXXXX" );
7. 调用封装word的类、
// 输出流
OutputStream outs = response.getOutputStream();
String fileName = "aa" + String.valueOf(System.currentTimeMillis()).substring(9, 13) + ".doc";
String headStr = "attachment; filename="" + fileName + """;
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition", headStr);
// 调用的模板名称
String modelName = "aa.flt";
ExportWord word = new ExportWord();
word.init(dataMap, outs, modelName);
1. 导入freemarker-2.3.19.jar 包
2. 将模板另存为 .xml文件
3. 打开xml文件找到需要填充数据的字段添加 ${变量名称}
xml 中的内容<w:t>姓名:${name}</w:t></w:r>
要在 姓名 后面添加数据 姓名:${name}
4. 修改完后,将文件后缀改为 .flt格式
5. 添加导出代码
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class ExportWord
{
private Configuration configuration = null;
private Template template = null;
private static Object obj = new Object();
public ExportWord()
{
}
@SuppressWarnings("unchecked")
public void init(Map map, OutputStream outs, String inUrl)
{
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
// 设置test.flt所在的加载路径,在test包下
configuration.setClassForTemplateLoading(this.getClass(), "/com/util");
try
{
// test.flt为要装载的模板
template = configuration.getTemplate(inUrl);
template.setEncoding("utf-8");
}
catch (IOException e)
{
e.printStackTrace();
}
createDoc(map, outs);
}
/**
* 创建Doc文件
*
* @author
*/
@SuppressWarnings("unchecked")
public void createDoc(Map map, OutputStream outs)
{
// 填充模板数据
// getData(dataMap);
Writer out = null;
// File outFile = new File("d:/aa.doc");
try
{
out = new BufferedWriter(new OutputStreamWriter(outs, "utf-8"));
// out = new BufferedWriter(new OutputStreamWriter(new
// FileOutputStream(outFile), "utf-8"));
}
catch (Exception e1)
{
e1.printStackTrace();
}
try
{
// 这里注意同步,因为前面是单例
synchronized (obj)
{
template.process(map, out);
}
outs.flush();
outs.close();
out.close();
}
catch (TemplateException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
/**
* 填充数据 注意dataMap里存放的数据Key值要与模板中的参数相对应
*
* @param dataMap
* @author
*/
private void getData(Map dataMap)
{
dataMap.put("zhengshu_number", "00000111");
dataMap.put("aa", "张三");
dataMap.put("bb", "1000.52");
}
}
6. 给模板中添加需要填充的数据,使用Map封装
// 导出模板的数据
Map dataMap = new HashMap<String, String>();
// 姓名
dataMap.put("name","XXXXXXXXXXXX" );
注意:map中的key 为第3步中标红的 ${变量名称} ,“变量名称“必须和模板中添加的名称一致,否则数据填充不上去
如:
dataMap.put(" name","XXXXXXXXXXXX" );
7. 调用封装word的类、
// 输出流
OutputStream outs = response.getOutputStream();
String fileName = "aa" + String.valueOf(System.currentTimeMillis()).substring(9, 13) + ".doc";
String headStr = "attachment; filename="" + fileName + """;
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition", headStr);
// 调用的模板名称
String modelName = "aa.flt";
ExportWord word = new ExportWord();
word.init(dataMap, outs, modelName);