1. Introducir dependencias
备注:如果没有jar包冲突,可以忽略jar排重(<exclusions>标签内内容)
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.3.0</version>
<exclusions>
<exclusion>
<artifactId>poi-ooxml-schemas</artifactId>
<groupId>org.apache.poi</groupId>
</exclusion>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>4.3.0</version>
<exclusions>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>4.3.0</version>
</dependency>
2. plantilla de palabras
3. Código específico
3.1 capa de controlador
@GetMapping(value = "/exportReportPreview") public void exportReportPreview(solicitud HttpServletRequest, respuesta HttpServletResponse, @RequestParam String no) lanza IOException { accidentService.exportReportPreview(solicitud, respuesta, no); }
3.2 Clase de implementación
@Override public void exportReportPreview (solicitud HttpServletRequest, respuesta HttpServletResponse, número de cadena) lanza IOException { Accidente accidente = this.getAccidentByNo(no); //★★★★★★★★La plantilla se almacena en el directorio de recursos, el directorio específico está determinado por sus propias necesidades Crear //"template/docx/accident/first report.docx" //fileSavePath es un directorio temporal (la prueba local es la ruta bajo una determinada letra de unidad y el servidor Linux es la ruta específica) / /dirección de plantilla de palabra TemplateExportParams templateExportParams = new TemplateExportParams( "template/docx/accident/first report.docx"); String wordModelPath = templateExportParams.getTemplateUrl(); //Generar dirección de archivo temporal Map<String,Object> params = JSON.parseObject (JSON.toJSONString(accidente), clase Map.); ExportWordUtil.exportWord(wordModelPath,fileSavePath,accident.getTitle() + ".docx",params,request,respuesta); }
3.3 Herramientas
@Slf4j public class ExportWordUtil { /** * Exportar palabra * <p>El primer paso es generar el archivo de Word reemplazado, que solo admite docx</p> * <p>El segundo paso es descargar el archivo generado</ p> * < p>El tercer paso es eliminar los archivos temporales generados</p> * Formato de variable en las variables de plantilla: { {foo}} * @param templatePath dirección de plantilla de palabra * @param temDir Generar dirección de almacenamiento de archivos temporales * @ param fileName nombre de archivo * @ param params Parámetros reemplazados * @param request HttpServletRequest * @param respuesta HttpServletResponse */ public static void exportWord(String templatePath, String temDir, String fileName, Map<String, Object> params, solicitud HttpServletRequest, respuesta HttpServletResponse) { Assert.notNull( rutaPlantilla,"La ruta de la plantilla no puede estar vacía"); Afirmar.notNull( temDir,"La ruta del archivo temporal no puede estar vacía");"ISO-8859-1"); } } demás { fileName = new String( fileName.getBytes ; ) ("utf-8"), "ISO-8859-1" doc.write(fos); // Configura la descarga forzada para que no se abra Response.setContentType("application /force-download"); // Establece el nombre del archivo respuesta.addHeader("Content-Disposition", "attachment;fileName= " + fileName); OutputStream out = respuesta.getOutputStream(); doc.write(out); out .close(); } captura (Excepción e) {separador; }mkdirs(); } prueba { Directorio de archivo = nuevo archivo (temDir); String userAgent = request.getHeader("user-agent").toLowerCase(); if (userAgent.contains("msie") || userAgent.contains("como gecko")) { fileName = URLEncoder.encode(fileName, "UTF-8"); } else { fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1"); } XWPFDocument doc = WordExportUtil.exportWord07(templatePath, parámetros); String tmpPath = temDir + fileName; FileOutputStream fos = nuevo FileOutputStream(tmpPath); doc.write(fos); // 设置强制下载不打开 respuesta.setContentType("aplicación/descarga forzada"); // 设置文件名 respuesta.addHeader("Content-Disposition", "attachment;fileName=" + fileName); OutputStream out = respuesta.getOutputStream(); doc.write(out); out.close(); } catch (Exception e) { e .printStackTrace(); } finalmente { //Este paso depende de los requisitos específicos, ya sea para eliminar delFileWord(temDir,fileName); } } /** * Eliminar el archivo generado en tiempo cero */ public static void delFileWord(String filePath, String fileName){ Archivo archivo = nuevo archivo (rutadelarchivo+nombredelarchivo); Archivo archivo1 = nuevo archivo (rutadelarchivo); archivo.delete(); archivo1.delete(); } }