package com.sercurityControl.proteam.util; import freemarker.template.Configuration; import freemarker.template.Template; import org.springframework.beans.factory.annotation.Value; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.util.Map; import java.util.Objects; /** * @Auther: ccw * @Date: 2021/07/22/9:57 * @description: */ public class WordUtils { @Value("${file.upload_path}") private String UPLOAD_PATH; //配置信息,代码本身写的还是很可读的,就不过多注解了 private static Configuration configuration = null; //这里注意的是利用WordUtils的类加载器动态获得模板文件的位置 // private static final String templateFolder = WordUtils.class.getClassLoader().getResource("../../").getPath() + "/templates/word"; static { configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); configuration.setClassForTemplateLoading(WordUtils.class, "/download/"); // try { // //// 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, String title, String ftlFile) throws IOException { Template freemarkerTemplate = configuration.getTemplate(ftlFile); 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 = title + ".docx"; 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 = "sellPlan.doc"; File f = new File(name); Template t = template; try { // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开 Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8"); t.process(dataMap, w); w.close(); } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); } return f; } public static void exportMillCertificateWord2(HttpServletRequest request, HttpServletResponse response, Map map, String title, String ftlFile, String path) throws IOException { Template freemarkerTemplate = configuration.getTemplate(ftlFile); File file = null; InputStream fin = null; OutputStream out = null; // String systemName = System.getProperty("os.name"); String uploadPath = path + "word" + File.separator; try { // 调用工具类的createDoc方法生成Word文档 file = createDoc(map, freemarkerTemplate); fin = new FileInputStream(file); File file2 = new File(uploadPath); // 生成文件夹 if (!file2.exists()) { file2.mkdirs(); } String fileName = uploadPath + File.separator + title + ".doc"; out = new FileOutputStream(new File(fileName)); 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();} } } public static void exportPDF(HttpServletRequest request, HttpServletResponse response, String titleName, String fileName) throws IOException { File file = null; InputStream fin = null; ServletOutputStream out = null; try { file = new File(fileName); fin = new FileInputStream(file); response.setCharacterEncoding("utf-8"); response.setContentType("application/pdf"); // 设置浏览器以下载的方式处理该文件名 response.setHeader("Content-Disposition", "attachment;filename=" .concat(String.valueOf(URLEncoder.encode(titleName, "UTF-8")))); out = response.getOutputStream(); // 缓冲区 byte[] buffer = new byte[512]; int bytesToRead = -1; // 通过循环将读入的pdf文件的内容输出到浏览器中 while ((bytesToRead = fin.read(buffer)) != -1) { out.write(buffer, 0, bytesToRead); } } finally { if (fin != null) {fin.close();} if (out != null) {out.close();} } } public static void exportFile(HttpServletRequest request, HttpServletResponse response,String fileName,byte[] decode) throws IOException { InputStream fin = null; ServletOutputStream out = null; try { fin = new ByteArrayInputStream(decode); response.setCharacterEncoding("utf-8"); String subfix = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()); if(Objects.equals(subfix,"pdf")){ response.setContentType("application/pdf"); }else if(Objects.equals(subfix,"doc") || Objects.equals(subfix,"docx")){ response.setContentType("application/msword"); } // 设置浏览器以下载的方式处理该文件名 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; // 通过循环将读入的pdf文件的内容输出到浏览器中 while ((bytesToRead = fin.read(buffer)) != -1) { out.write(buffer, 0, bytesToRead); } } finally { if (fin != null) {fin.close();} if (out != null) {out.close();} } } /** * @return void * @author cw chen * @description 下载word文件 * @Param request * @Param response * @Param titleName * @Param fileName * @date 2023-04-17 11:07 */ public static void exportWord(HttpServletRequest request, HttpServletResponse response, String titleName, String fileName) throws IOException { File file = null; InputStream fin = null; ServletOutputStream out = null; try { file = new File(fileName); fin = new FileInputStream(file); response.setCharacterEncoding("utf-8"); response.setContentType("application/msword"); // 设置浏览器以下载的方式处理该文件名 response.setHeader("Content-Disposition", "attachment;filename=" .concat(String.valueOf(URLEncoder.encode(titleName, "UTF-8")))); out = response.getOutputStream(); // 缓冲区 byte[] buffer = new byte[512]; int bytesToRead = -1; // 通过循环将读入的pdf文件的内容输出到浏览器中 while ((bytesToRead = fin.read(buffer)) != -1) { out.write(buffer, 0, bytesToRead); } } finally { if (fin != null) {fin.close();} if (out != null) {out.close();} } } /** * @return void * @author cw chen * @description 下载word文件 * @Param request * @Param response * @Param titleName * @Param fileName * @date 2023-04-17 11:07 */ public static void exportVideo(HttpServletRequest request, HttpServletResponse response, String titleName, String fileName) throws IOException { File file = null; InputStream fin = null; ServletOutputStream out = null; try { file = new File(fileName); fin = new FileInputStream(file); response.setCharacterEncoding("utf-8"); response.setContentType("video/mp4"); // 设置浏览器以下载的方式处理该文件名 response.setHeader("Content-Disposition", "attachment;filename=" .concat(String.valueOf(URLEncoder.encode(titleName, "UTF-8")))); out = response.getOutputStream(); // 缓冲区 byte[] buffer = new byte[512]; int bytesToRead = -1; // 通过循环将读入的pdf文件的内容输出到浏览器中 while ((bytesToRead = fin.read(buffer)) != -1) { out.write(buffer, 0, bytesToRead); } } finally { if (fin != null) { fin.close(); } if (out != null) { out.close(); } file.delete(); } } }