Java工具类(二) 模版导出工具类
根据模版导出Word或Excel
工作中,有时需要导出Word一些操作,最常见的方法就是根据模版导出。主要技术有:强大的POI和较为流行的模版引擎FreeMarker,个人偏爱FreeMarker。
package com.cnblog.util;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class ExportUtil {
/**
* 通过字段替换 导出word
*/
public static void exportWord(String fileName, Map<String, String> params, HttpServletResponse response) {
InputStream is = null;
ServletOutputStream out = null;
try {
is = ExportUtil.class.getResourceAsStream("/" + fileName);
POIFSFileSystem pfs = new POIFSFileSystem(is);
HWPFDocument hwpf = new HWPFDocument(pfs);
Range range = hwpf.getRange();
Set<String> keys = params.keySet();
for (String key : keys) {
range.replaceText(key, params.get(key));
}
response.setCharacterEncoding("UTF-8");
response.setContentType("application/octet-stream; charset=UTF-8");
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
out = response.getOutputStream();
hwpf.write(out);
out.flush();
} catch (FileNotFoundException e) {
throw new RuntimeException("未找到模板文件!");
} catch (IOException e) {
throw new RuntimeException("读取文件错误!");
} finally {
IOUtils.closeQuietly(out);
IOUtils.closeQuietly(is);
}
}
/**
* 通过 FreeMarker 动态生成word/Excel
* 一般用于导出循环数据
* tip:图片请替换base64
*/
public static void createWE(String fileName, String templateName, Map<String, Object> dataMap, HttpServletResponse response) {
OutputStream out = null;
try {
// 创建配置实例
Configuration cfg = new Configuration();
cfg.setDefaultEncoding("utf-8");
String path = ExportUtil.class.getResource("/").toString();
cfg.setDirectoryForTemplateLoading(new File(path.substring(6, path.length())));
cfg.setObjectWrapper(new DefaultObjectWrapper());
// 获取模板
Template template = cfg.getTemplate(templateName);
// 将模板和数据模型合并生成文件
response.setCharacterEncoding("UTF-8");
response.setContentType("application/octet-stream; charset=UTF-8");
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
out = response.getOutputStream();
Writer docout = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
template.process(dataMap, docout);
} catch (FileNotFoundException e) {
throw new RuntimeException("未找到模板文件!");
} catch (IOException e) {
throw new RuntimeException("读取文件错误!");
} catch (TemplateException e) {
throw new RuntimeException("模版文件错误!");
} finally {
IOUtils.closeQuietly(out);
}
}
}