b0a98a7076680bb756087bffbac430ae32740598.svn-base 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package cn.com.goldenwater.dcproj.utils;
  2. import cn.com.goldenwater.dcproj.util.Base64Util;
  3. import freemarker.template.Configuration;
  4. import freemarker.template.Template;
  5. import javax.servlet.ServletOutputStream;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.*;
  9. import java.net.URLEncoder;
  10. import java.nio.charset.StandardCharsets;
  11. import java.util.Map;
  12. public class WordUtils {
  13. //配置信息,代码本身写的还是很可读的,就不过多注解了
  14. private static Configuration configuration = null;
  15. //这里注意的是利用WordUtils的类加载器动态获得模板文件的位置
  16. private static String templateFolder = WordUtils.class.getClassLoader().getResource("moban.ftl").getPath();
  17. static {
  18. configuration = new Configuration();
  19. configuration.setDefaultEncoding("utf-8");
  20. try {
  21. templateFolder = templateFolder.substring(0, templateFolder.indexOf("moban.ftl"));
  22. configuration.setDirectoryForTemplateLoading(new File(templateFolder));
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. private WordUtils() {
  28. throw new AssertionError();
  29. }
  30. public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map) throws IOException {
  31. Template freemarkerTemplate = configuration.getTemplate("moban.ftl");
  32. File file = null;
  33. InputStream fin = null;
  34. ServletOutputStream out = null;
  35. try {
  36. // 调用工具类的createDoc方法生成Word文档
  37. file = createDoc(map, freemarkerTemplate);
  38. fin = new FileInputStream(file);
  39. response.setCharacterEncoding("utf-8");
  40. response.setContentType("application/msword");
  41. // 设置浏览器以下载的方式处理该文件名
  42. String fileName = "督查简报" + ".doc";
  43. response.setHeader("Content-Disposition", "attachment;filename="
  44. .concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
  45. out = response.getOutputStream();
  46. byte[] buffer = new byte[512]; // 缓冲区
  47. int bytesToRead = -1;
  48. // 通过循环将读入的Word文件的内容输出到浏览器中
  49. while ((bytesToRead = fin.read(buffer)) != -1) {
  50. out.write(buffer, 0, bytesToRead);
  51. }
  52. } finally {
  53. if (fin != null) {
  54. fin.close();
  55. }
  56. if (out != null) {
  57. out.close();
  58. }
  59. if (file != null) {
  60. file.delete(); // 删除临时文件
  61. }
  62. }
  63. }
  64. private static File createDoc(Map<?, ?> dataMap, Template template) {
  65. String name = "test.doc";
  66. File f = new File(name);
  67. Template t = template;
  68. try {
  69. // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
  70. Writer w = new OutputStreamWriter(new FileOutputStream(f), StandardCharsets.UTF_8);
  71. t.process(dataMap, w);
  72. w.close();
  73. } catch (Exception ex) {
  74. ex.printStackTrace();
  75. throw new RuntimeException(ex);
  76. }
  77. return f;
  78. }
  79. /**
  80. * 对图片进行Base64编码
  81. *
  82. * @param filename 图片路径
  83. * @return Base64编码
  84. */
  85. public static String getImageString(String filename) {
  86. InputStream in = null;
  87. byte[] data = null;
  88. try {
  89. if (!new File(filename).exists()) {
  90. return "";
  91. }
  92. in = new FileInputStream(filename);
  93. data = new byte[in.available()];
  94. in.read(data);
  95. } catch (Exception e) {
  96. e.printStackTrace();
  97. } finally {
  98. if (in != null) {
  99. try {
  100. in.close();
  101. } catch (IOException e) {
  102. e.printStackTrace();
  103. }
  104. }
  105. }
  106. return data != null ? Base64Util.encodeStr(data) : "";
  107. }
  108. }