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);
		}
	}

}
posted @ 2015-09-27 20:59  ljeabbk  阅读(417)  评论(0编辑  收藏  举报