springboot+freemarker implementa la plantilla de word de exportación

marcador libre

  • FreeMarker es un motor de plantillas: es decir, una herramienta de propósito general para generar texto de salida (páginas web HTML, correos electrónicos, archivos de configuración, código fuente, etc.) basado en plantillas y datos a modificar. No está destinado a usuarios finales, sino a una biblioteca de clases de Java, un componente que los programadores pueden integrar en los productos que desarrollan.
  • FreeMarker es gratuito y se publica bajo la licencia Apache versión 2.0. Su plantilla está escrita como FreeMarker Template Language (FTL), que es un lenguaje simple y dedicado. Es necesario preparar los datos para que se muestren en un lenguaje de programación real, como la consulta de la base de datos y la operación comercial, y luego la plantilla muestra los datos preparados. En la plantilla, se usa principalmente para mostrar los datos, pero fuera de la plantilla, se enfoca en qué datos mostrar

Configuración del proyecto:

		<!--添加freeMarker-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.20</version>
        </dependency>
#配置freemarker配置
#模板存放路径(默认地址为classpath:/templates/)
spring.freemarker.template-loader-path=classpath:/templates
#模板后缀
spring.freemarker.suffix= .ftl
#编码
spring.freemarker.charset= utf-8
#RequestContext属性的名称(默认为-)
spring.freemarker.request-context-attribute= request

Nota: El archivo de plantilla predeterminado aquí está en la carpeta de plantillas en recursos (el archivo de plantilla de ruta predeterminada debe colocarse en recursos, cuando el programa carga el archivo de plantilla, freemarker proporciona una variedad de métodos para obtener el archivo de plantilla, puede averiguarlo por ti mismo)

El siguiente paso que tenemos que hacer es preparar nuestra plantilla de Word y luego convertir la plantilla a un archivo xml. Necesitamos definir nuestros marcadores de posición en la plantilla de Word, usando ${string}. Simplemente defina "cadena" de acuerdo con sus propias preferencias.

El proceso es el siguiente:

documento de word:
inserte la descripción de la imagen aquí
luego guarde nuestro documento de word como un documento xml.
inserte la descripción de la imagen aquí
Cambie el sufijo de nuestro documento xml a ftl y luego abra nuestro archivo ftl con un software que pueda abrir archivos ftl. Aquí tenemos un par de advertencias.
En primer lugar, los marcadores de posición definidos se pueden separar. Es como lo siguiente:
inserte la descripción de la imagen aquí
lo que tenemos que hacer es eliminar la parte redundante, en la imagen defino ${userName}, entonces elimino la parte redundante y la cambio a ${userName}.

En segundo lugar, a lo que debemos prestar atención es que debemos agregar la etiqueta freeMarker nosotros mismos en nuestra parte de la tabla. Utilice etiquetas personalizadas entre los códigos de tabla. Los parámetros definidos deben ser consistentes con los que definimos en el método, de lo contrario no se puede obtener el valor.

Comienzo de la tabla:
inserte la descripción de la imagen aquí
Nota: <w:tr></w:tr> representa una fila donde se necesita un bucle, agregue una instrucción de bucle de marcador libre delante de esa línea, use el lenguaje de etiquetas c similar a jsp, recuerde encontrar el correspondiente < Agregar </#list> después de /w:tr> (esta es la declaración de freemarker)
Enlace de referencia de instrucciones del manual en línea chino de Freemarker: http://freemarker.foofun.cn/ref_directives.html

La siguiente es la implementación de la función:
clase de herramienta

package com.newdo.base;

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.util.Map;

public class WordUtil {
    
    

    /**
     * 生成word文件
     * @param dataMap word中需要展示的动态数据,用map集合来保存
     * @param templateName word模板名称,例如:test.ftl
     * @param filePath 文件生成的目标路径,例如:D:/wordFile/
     * @param fileName 生成的文件名称,例如:test.doc
     */
    @SuppressWarnings("unchecked")
    public static void createWord(HttpServletRequest request, HttpServletResponse response, Map dataMap, String templateName, String filePath, String fileName){
    
    
        try {
    
    
            //创建配置实例
            Configuration configuration = new Configuration();
            //设置编码
            configuration.setDefaultEncoding("UTF-8");
            //ftl模板文件 取模板文件存放地址
            configuration.setClassForTemplateLoading(WordUtil.class,"/templates");
            //获取模板
            Template template = configuration.getTemplate(templateName);
            //输出文件
            File outFile = new File(filePath+File.separator+fileName);
            //如果输出目标文件夹不存在,则创建
            if (!outFile.getParentFile().exists()){
    
    
                outFile.getParentFile().mkdirs();
            }
            //检测是否存在 存在删除
            if (outFile.exists()) {
    
    
                outFile.delete();
            }
            //将模板和数据模型合并生成文件
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
            //生成文件 实际这里已经将文件生成在指定位置
            template.process(dataMap, out);
            
			//以下操作是将文件下载
            File file = new File(filePath + "\\" + fileName);
            InputStream fin = new FileInputStream(file);
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/msword");
            // 设置浏览器以下载的方式,处理该文件名  ps:docx格式office可能存在打不开等问题
            fileName = URLEncoder.encode(fileName, "utf-8");
            response.setHeader("Content-Disposition","attachment;filename="+fileName);
            ServletOutputStream out2 = response.getOutputStream();
            byte[] buffer = new byte[512];
            int bytesToRead = -1;
            // 通过循环将读入的Word文件的内容输出到浏览器中
            while ((bytesToRead = fin.read(buffer)) != -1) {
    
    
                out2.write(buffer, 0, bytesToRead);
            }

            //关闭流
            out.flush();
            out.close();

            fin.close();
            out2.close();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }
}

dirección de almacenamiento de archivos
inserte la descripción de la imagen aquí

llamada de método

public static void main(String[] args) {
    
    
         /** 用于组装word页面需要的数据 */
        Map<String, Object> dataMap = new HashMap<String, Object>();
        dataMap.put("name","测试");
        dataMap.put("date","2023-03-09");
        dataMap.put("content","测试内容");
        List<Object> datas = new ArrayList<>();
        for(int i=0;i<10;i++){
    
    
            Data data = new Data();
            data.put("title","标题" + i);
            data.put("content","内容" + i);
            data.put("another","作者" + i);
            datas.add(data);
        }
        dataMap.put("listInfo",datas);
        String filePath = "";
        if (IsWhatSystem.whatSystem()) {
    
    
            //文件路径
            filePath = "D:/doc_f/";
        }else {
    
    
            filePath = "/doc_f/";
        }
        //文件唯一名称
        String fileOnlyName = "生成Word文档.doc";
        /** 生成word  数据包装,模板名,文件生成路径,生成的文件名*/
        WordUtil.createWord(dataMap, "dacyjl.ftl", filePath, fileOnlyName);
    }

Además, las columnas de la tabla en la plantilla también se pueden fusionar, por lo que no diré más aquí, y se mencionará en el enlace de referencia a continuación.
Enlace de referencia para este artículo:
https://www.cnblogs.com/h-java/p/10026850.html

Enlace de referencia de combinación de celdas
https://blog.csdn.net/weixin_43667830/article/details/106936546
https://blog.csdn.net/weixin_43165220/article/details/119537190

Supongo que te gusta

Origin blog.csdn.net/Strive279/article/details/129422526
Recomendado
Clasificación