| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- package cn.com.goldenwater.dcproj.utils;
- import cn.com.goldenwater.dcproj.util.Base64Util;
- import freemarker.template.Configuration;
- import freemarker.template.Template;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.*;
- import java.net.URLEncoder;
- import java.nio.charset.StandardCharsets;
- import java.util.Map;
- public class WordUtils {
- //配置信息,代码本身写的还是很可读的,就不过多注解了
- private static Configuration configuration = null;
- //这里注意的是利用WordUtils的类加载器动态获得模板文件的位置
- private static String templateFolder = WordUtils.class.getClassLoader().getResource("moban.ftl").getPath();
- static {
- configuration = new Configuration();
- configuration.setDefaultEncoding("utf-8");
- try {
- templateFolder = templateFolder.substring(0, templateFolder.indexOf("moban.ftl"));
- configuration.setDirectoryForTemplateLoading(new File(templateFolder));
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- private WordUtils() {
- throw new AssertionError();
- }
- public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map) throws IOException {
- Template freemarkerTemplate = configuration.getTemplate("moban.ftl");
- File file = null;
- InputStream fin = null;
- ServletOutputStream out = null;
- try {
- // 调用工具类的createDoc方法生成Word文档
- file = createDoc(map, freemarkerTemplate);
- fin = new FileInputStream(file);
- response.setCharacterEncoding("utf-8");
- response.setContentType("application/msword");
- // 设置浏览器以下载的方式处理该文件名
- String fileName = "督查简报" + ".doc";
- response.setHeader("Content-Disposition", "attachment;filename="
- .concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
- out = response.getOutputStream();
- byte[] buffer = new byte[512]; // 缓冲区
- int bytesToRead = -1;
- // 通过循环将读入的Word文件的内容输出到浏览器中
- while ((bytesToRead = fin.read(buffer)) != -1) {
- out.write(buffer, 0, bytesToRead);
- }
- } finally {
- if (fin != null) {
- fin.close();
- }
- if (out != null) {
- out.close();
- }
- if (file != null) {
- file.delete(); // 删除临时文件
- }
- }
- }
- private static File createDoc(Map<?, ?> dataMap, Template template) {
- String name = "test.doc";
- File f = new File(name);
- Template t = template;
- try {
- // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
- Writer w = new OutputStreamWriter(new FileOutputStream(f), StandardCharsets.UTF_8);
- t.process(dataMap, w);
- w.close();
- } catch (Exception ex) {
- ex.printStackTrace();
- throw new RuntimeException(ex);
- }
- return f;
- }
- /**
- * 对图片进行Base64编码
- *
- * @param filename 图片路径
- * @return Base64编码
- */
- public static String getImageString(String filename) {
- InputStream in = null;
- byte[] data = null;
- try {
- if (!new File(filename).exists()) {
- return "";
- }
- in = new FileInputStream(filename);
- data = new byte[in.available()];
- in.read(data);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (in != null) {
- try {
- in.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return data != null ? Base64Util.encodeStr(data) : "";
- }
- }
|