[Export Word] Comment utiliser le moteur de modèle Java+Freemarker pour générer un document Word (modèle contenant uniquement du contenu textuel) basé sur un fichier de modèle XML

Cet article explique principalement comment utiliser le moteur de modèle Java+Freemarker pour générer des documents Word basés sur des fichiers de modèle XML.

Table des matières

1. Exporter le document Word

1.1. Connaissances de base

1.2. Créer des fichiers modèles

1.3, implémentation du code

(1) Introduire des dépendances

(2) Créer une classe d'outils Freemarker

(3) Code du cas de test

(4) effet de fonctionnement


1. Exporter le document Word

1.1. Connaissances de base

Les fichiers Word ont deux formats de suffixe, à savoir : doc et docx. doc est utilisé avant Word 2003 et docx est utilisé après Word 2007. On peut dire que docx est une extension et une optimisation de doc. La vitesse de réponse, les performances et l'espace occupé par docx sont meilleurs que docx. De plus, docx est essentiellement un fichier compressé au format zip. La couche inférieure est basée sur OOXML pour organiser les données. C'est-à-dire la couche inférieure de docx est en fait une série de fichiers composés de XML. , puis utilisez le programme pour rendre le fichier XML, et enfin c'est le style de fichier Word que nous voyons.

Le fichier de modèle Word que j'ai utilisé dans cet article utilise le suffixe docx.L'idée principale est de convertir le fichier docx dans le fichier XML correspondant, puis de modifier le contenu du fichier XML pour le transformer en espace réservé dans le moteur de modèle Freemarker. Ensuite, l'espace réservé est remplacé par des données réelles via le programme de rendu Freemarker, et le fichier de modèle remplacé est converti en un document docx, de sorte que le document Word est généré conformément au fichier de modèle.

  • Remarque : L'espace réservé dans freemarker est ${}. Par exemple, si la forme [${name}] est utilisée ici, un champ appelé [name] doit être inclus dans les données transmises.

1.2. Créer des fichiers modèles

Créez d'abord un fichier Word avec un suffixe docx. Vous pouvez écrire le contenu dans le fichier en fonction de vos besoins réels. Le contenu du fichier docx que j'ai créé est le suivant :

Après avoir modifié le contenu, enregistrez-le en tant que fichier XML, comme illustré dans la figure suivante :

Après avoir exporté le fichier XML, ouvrez le fichier et vous verrez qu'il contient des balises XML. Formatez-le d'abord pour qu'il paraisse plus confortable. Vous pouvez vérifier si le contenu de votre espace réservé respecte la syntaxe freemarker. Parce que parfois, dans le fichier XML que nous exportons, [${xxx}] peut être séparé en deux lignes, ce qui rendra l'espace réservé invalide, il est donc parfois nécessaire de modifier manuellement l'espace réservé. Le contenu du fichier Word XML exporté est à peu près le suivant :

Une fois le remplacement terminé, notre fichier de modèle Word est prêt. Ce fichier XML est le fichier de modèle Word dont nous aurons éventuellement besoin et qui sera utilisé ultérieurement.

1.3, implémentation du code

(1) Introduire des dépendances

S'il s'agit d'un projet SpringBoot, SpringBoot nous a fourni un starter freemarker, qui nous permet d'intégrer rapidement freemarker, comme suit :

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

S'il s'agit d'un projet Java ordinaire, vous pouvez introduire les dépendances suivantes :

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

(2) Créer une classe d'outils Freemarker

Après avoir introduit la dépendance freemarker, vous pouvez utiliser Freemarker pour écrire une classe d'outils spécialement utilisée pour traiter l'exportation de fichiers et le rendu des données.


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) Code du cas de test

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) effet de fonctionnement

Exécutez le code du cas de test, puis dans le répertoire du projet, vous pouvez voir le document Word généré, le contenu est le suivant :

Le fichier de modèle ci-dessus n'est qu'un simple texte, vous pouvez également ajouter des tableaux, des images et d'autres contenus au fichier de modèle, vous pouvez utiliser la balise cycle dans Freemarker pour ajouter automatiquement des données de table, le contenu de l'image est encodé par base64, donc vous devez lire l'image sera Après avoir été convertie en encodage base64, elle est ensuite rendue dans un fichier XML.Les articles suivants présenteront l'exportation de modèles de tableaux et d'images.

À ce stade, l'introduction de Freemarker exportant des documents Word est terminée.

En résumé, cet article est terminé, il présente principalement comment utiliser le moteur de template Java+Freemarker pour générer des documents Word basés sur des fichiers de template XML.

Je suppose que tu aimes

Origine blog.csdn.net/qq_39826207/article/details/132125051
conseillé
Classement