[Exportar Word] Cómo usar el motor de plantillas de Java+Freemarker para generar un documento de Word (plantilla que contiene solo contenido de texto) basado en un archivo de plantilla XML

Este artículo presenta principalmente cómo utilizar el motor de plantillas de Java+Freemarker para generar documentos de Word basados ​​en archivos de plantilla XML.

Tabla de contenido

1. Exportar documento de Word

1.1 Conocimientos básicos

1.2 Crear archivos de plantilla

1.3, implementación de código

(1) Introducir dependencias

(2) Crear una clase de herramienta Freemarker

(3) Código de caso de prueba

(4) Efecto de operación


1. Exportar documento de Word

1.1 Conocimientos básicos

Los archivos de Word tienen dos formatos de sufijo, a saber: doc y docx. doc se usa antes de Word 2003 y docx se usa después de Word 2007. Se puede decir que docx es una extensión y optimización de doc. La velocidad de respuesta, el rendimiento y el espacio ocupado por docx son mejores que docx. Además, docx es esencialmente un archivo comprimido en formato zip. La capa inferior se basa en OOXML para organizar los datos. Es decir, la capa inferior de docx es en realidad una serie de archivos compuestos de XML. , y luego usamos el programa para representar el archivo XML, y finalmente es el estilo de archivo de Word que vemos.

El archivo de plantilla de Word que usé en este artículo usa el sufijo docx. La idea central es convertir el archivo docx en el archivo XML correspondiente y luego modificar el contenido en el archivo XML para convertirlo en un marcador de posición en el motor de plantillas de Freemarker. Posteriormente, el marcador de posición se reemplaza con datos reales a través del programa de renderizado Freemarker y el archivo de plantilla reemplazado se convierte en un documento docx, de modo que el documento de Word se genera de acuerdo con el archivo de plantilla.

  • Nota: El marcador de posición en marcador libre es ${}. Por ejemplo, si se usa aquí la forma de [${nombre}], se debe incluir un campo llamado [nombre] en los datos transmitidos.

1.2 Crear archivos de plantilla

Primero cree un archivo de Word con un sufijo docx. Puede escribir el contenido en el archivo de acuerdo con sus necesidades reales. El contenido del archivo docx que creé es el siguiente:

Después de editar el contenido, guárdelo como un archivo XML, como se muestra en la siguiente figura:

Después de exportar el archivo XML, ábralo y verá que contiene etiquetas XML. Formatéelo primero para que se vea más cómodo. Puede verificar si el contenido de su marcador de posición cumple con la sintaxis de marcador libre. Porque a veces, en el archivo XML que exportamos, [${xxx}] puede estar separado en dos líneas, lo que hará que el marcador de posición deje de ser válido, por lo que a veces es necesario modificar manualmente el marcador de posición. El contenido del archivo XML de Word exportado es aproximadamente el siguiente:

Una vez que se completa el reemplazo, nuestro archivo de plantilla de Word está listo.Este archivo XML es el archivo de plantilla de Word que eventualmente necesitaremos, que se usará más adelante.

1.3, implementación de código

(1) Introducir dependencias

Si es un proyecto de SpringBoot, SpringBoot nos ha proporcionado un iniciador de freemarker, que nos permite integrar freemarker rápidamente, de la siguiente manera:

<!-- 引入 freemarker 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

Si se trata de un proyecto Java ordinario, puede introducir las siguientes dependencias:

<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.30</version>
</dependency>

(2) Crear una clase de herramienta Freemarker

Después de introducir la dependencia de freemarker, puede usar Freemarker para escribir una clase de herramienta que se usa especialmente para procesar la exportación de archivos y la representación de datos.


package com.gitcode.demo.util;

import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.Map;

/**
 * @version 1.0.0
 * @Date: 2023/8/4 15:05
 * @Author ZhuYouBin
 * @Description: Freemarker 工具类
 */
public class FreemarkerUtil {

    /**
     * 使用 Freemarker 生成 Word 文件
     * @param templateName 模板文件路径名称
     * @param fileName 生成的文件路径以及名称
     * @param dataModel 填充的数据对象
     */
    public static void exportWord(String templateName, String fileName, Map<String, Object> dataModel) {
        generateFile(templateName, fileName, dataModel);
    }

    /**
     * 使用 Freemarker 生成指定文件
     * @param templateName 模板文件路径名称
     * @param fileName 生成的文件路径以及名称
     * @param dataModel 填充的数据对象
     */
    private static void generateFile(String templateName, String fileName, Map<String, Object> dataModel) {
        try {
            // 1、创建配置对象
            Configuration config = new Configuration(Configuration.VERSION_2_3_30);
            config.setDefaultEncoding("utf-8");
            config.setClassForTemplateLoading(FreemarkerUtil.class, "/templates");
            // 2、获取模板文件
            Template template = config.getTemplate(templateName);
            // 3、创建生成的文件对象
            File file = new File(fileName);
            FileOutputStream fos = new FileOutputStream(file);
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos, StandardCharsets.UTF_8));
            // 4、渲染模板文件
            template.process(dataModel, writer);
            // 5、关闭流
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

(3) Código de caso de prueba

package com.gitcode.demo.word;

import com.gitcode.demo.util.FreemarkerUtil;

import java.util.HashMap;
import java.util.Map;

/**
 * @version 1.0.0
 * @Date: 2023/8/4 15:26
 * @Author ZhuYouBin
 * @Description: 使用 Freemarker 导出 Word 文件
 */
public class ExportWordDemo {
    public static void main(String[] args) {
        String templateName = "freemarker模板文件.xml";
        String fileName = "导出的word文档.docx";
        Map<String, Object> dataModel = new HashMap<>();
        dataModel.put("name", "张三");
        dataModel.put("sex", "男");
        dataModel.put("age", "20");
        dataModel.put("address", "xxx地址yyy号");
        // 执行导出
        FreemarkerUtil.exportWord(templateName, fileName, dataModel);
    }
}

(4) Efecto de operación

Ejecute el código del caso de prueba, y luego en el directorio del proyecto, puede ver el documento de Word generado, el contenido es el siguiente:

El archivo de plantilla anterior es solo un texto simple, también puede agregar tablas, imágenes y otro contenido al archivo de plantilla, puede usar la etiqueta de ciclo en Freemarker para agregar datos de tabla automáticamente, el contenido de la imagen está codificado por base64, por lo que lo que necesita para leer la imagen será Después de convertirla en codificación base 64, luego se representa en un archivo XML.Los siguientes artículos presentarán la exportación de plantillas de tablas e imágenes.

En este punto, la introducción de Freemarker para exportar documentos de Word ha terminado.

En resumen, este artículo ha terminado y presenta principalmente cómo utilizar el motor de plantillas de Java+Freemarker para generar documentos de Word basados ​​en archivos de plantilla XML.

Supongo que te gusta

Origin blog.csdn.net/qq_39826207/article/details/132125051
Recomendado
Clasificación