[Word のエクスポート] Java+Freemark テンプレート エンジンを使用して、XML テンプレート ファイルに基づいて Word 文書 (テキスト コンテンツのみを含むテンプレート) を生成する方法

この記事では主に、Java+Freemark テンプレート エンジンを使用して XML テンプレート ファイルに基づいて Word ドキュメントを生成する方法を紹介します。

目次

1. Word文書をエクスポートする

1.1. 基礎知識

1.2. テンプレートファイルの作成

1.3、コードの実装

(1) 依存関係を導入する

(2) Freemarkツールクラスの作成

(3) テストケースコード

(4) 運用効果


1. Word文書をエクスポートする

1.1. 基礎知識

Word ファイルには doc と docx という 2 つの拡張子形式があり、doc は Word2003 以前で使用され、docx は Word2007 以降で使用され、docx は doc を拡張して最適化したものと言えます。docx は、応答速度、パフォーマンス、占有容量が docx よりも優れています。さらに、docx は本質的に zip 形式の圧縮ファイルです。最下層は OOXML に基づいてデータを整理します。つまり、docx の最下層は、は実際には XML で構成される一連のファイルであり、プログラムを使用して XML ファイルをレンダリングし、最終的に表示される Word ファイル スタイルになります。

この記事で使用した Word テンプレート ファイルでは、docx サフィックスが使用されています。中心となるアイデアは、docx ファイルを対応する XML ファイルに変換し、XML ファイル内のコンテンツを変更して、Freemarker テンプレート エンジンのプレースホルダーに変更することです。その後、Freemarker レンダリング プログラムを通じてプレースホルダーが実際のデータに置き換えられ、置き換えられたテンプレート ファイルが docx ドキュメントに変換され、テンプレート ファイルに従って Word ドキュメントが生成されます。

  • 注: freemark のプレースホルダーは ${} です。たとえば、ここで [${name}] の形式を使用する場合、送信データに [name] というフィールドを含める必要があります。

1.2. テンプレートファイルの作成

まず、docx サフィックスが付いた Word ファイルを作成します。実際のニーズに応じてファイルの内容を書き込むことができます。作成した docx ファイルの内容は次のとおりです。

コンテンツを編集した後、次の図に示すように、XML ファイルとして保存します。

XML ファイルをエクスポートした後、ファイルを開くと、XML タグが含まれていることがわかります。最初にフォーマットして、より快適に見えるようにします。プレースホルダーのコンテンツがフリーマーカー構文を満たしているかどうかを確認できます。エクスポートする XML ファイルでは、[${xxx}] が 2 行に分かれている場合があり、プレースホルダーが無効になる場合があるため、プレースホルダーを手動で変更する必要がある場合があります。エクスポートされた Word XML ファイルの内容はおおよそ次のとおりです。

置き換えが完了すると、Word テンプレート ファイルが完成します。この XML ファイルが、最終的に必要となる Word テンプレート ファイルであり、後で使用します。

1.3、コードの実装

(1) 依存関係を導入する

SpringBoot プロジェクトの場合、SpringBoot は次のように freemark スターターを提供しており、これを使用して freemark を迅速に統合できます。

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

通常の Java プロジェクトの場合は、次の依存関係を導入できます。

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

(2) Freemarkツールクラスの作成

FreeMarker の依存関係を導入した後、FreeMarker を使用して、ファイルのエクスポートとデータのレンダリングの処理に特に使用されるツール クラスを作成できます。


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) テストケースコード

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) 運用効果

テスト ケースのコードを実行すると、プロジェクト ディレクトリで生成された Word ドキュメントが表示されます。内容は次のとおりです。

上記のテンプレート ファイルは単なるテキストです。テーブル、画像、その他のコンテンツをテンプレート ファイルに追加することもできます。Freemark のサイクル タグを使用してテーブル データを自動的に追加できます。画像のコンテンツは Base64 でエンコードされているため、画像は Base64 エンコードに変換された後、XML ファイルにレンダリングされます。次の記事では、表と画像のテンプレート エクスポートについて紹介します。

この時点で、Word 文書をエクスポートする Freemark の導入は終了です。

要約すると、この記事は終わりです。主に、Java+Freemark テンプレート エンジンを使用して、XML テンプレート ファイルに基づいて Word ドキュメントを生成する方法を紹介します。

おすすめ

転載: blog.csdn.net/qq_39826207/article/details/132125051