DUICUO

Javaテクノロジー: Spring BootとFreeMarkerの統合によりWord文書を生成

今日は、FreeMarkerテンプレートエンジンをSpring Bootと統合してWordファイルを生成する方法をご紹介します。ご興味のある方は、ぜひご活用ください。完全なソースコードは記事の最後に掲載しています。ぜひ議論やアイデアの交換をお待ちしております!

I. FreeMarker とは何ですか?

FreeMarker はオープンソースのテンプレート エンジンです。テンプレートと動的に入力されたデータを使用して、出力テキスト (HTML Web ページ、Word 文書、電子メール、構成ファイル、ソース コードなど) を動的にレンダリングおよび生成する汎用テクノロジです。

テンプレートはFreeMarkerテンプレート言語(FTL)で記述されます。これはシンプルで特化した言語であり、PHPのような完成度の高いプログラミング言語とは異なります。そのため、FTLは主にデータの表示方法に重点を置いており、表示する具体的なデータには、より成熟したプログラミング言語(Java、C#、Pythonなど)が必要です。

FreeMarker の概略図は次のとおりです。

II. サンプルコード

1. FreeMarker依存パッケージをインポートする

 <!-- HTML メール テンプレートを作成するための FreeMarker 依存パッケージ-->
<依存関係>
<グループ ID > org .springframework .boot </グループ ID >
<artifactId> スプリング-ブート-スターター- フリーマーカー</artifactId>
</依存関係>

2. application.yml で FreeMarker を設定する

フリーマーカー:
cache : false # キャッシュを有効にするかどうか。開発環境では、テンプレートの頻繁な変更とデバッグが必要となるため、キャッシュを有効にすることは推奨されません。
設定
クラシック互換: true
拡張子: .html #主に.tpl形式
文字セット: UTF - 8
template - loader - path : classpath : / templates / #テンプレート パス。通常はこれがテンプレート パスです。

3. 新しいクラスIExportService.javaを作成する

パッケージ com .springboot .email .email .service ;

javax.servlet.http.HttpServletResponse インポートします
java.util.Map をインポートします

パブリックインターフェイスIExportService {
/**
Wordファイルを指定したディレクトリにエクスポートする
/
void exportDocFile ( String fileName String tplName Map < String Object > data )は Exception をスローします
/**
Wordファイルをクライアントにエクスポートする
/
void exportDocToClient ( HttpServletResponse 応答 String fileName String tplName Map < String Object >データ)は Exception をスローします
}

4. IExportService.java インターフェイスの新しい実装クラス、ExportServiceImpl.java を作成します。

パッケージ com .springboot .email .email .service .impl ;

com .springboot .email .email .service .IExportServiceをインポートします
freemarker .template .Templateをインポートします
org.springframework.beans.factory.annotation.Autowired インポートます
org.springframework.stereotype.Service インポートします
org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer インポートます

javax.servlet.http.HttpServletResponse インポートします
java.io. *をインポートします
java .net .URLEncoderをインポートします
java.util.Map をインポートします

@サービス
パブリッククラス ExportServiceImpl は IExportService を実装します{
プライベート文字列エンコーディング;
プライベート文字列 exportPath = "D:\\export\\" ;
@オートワイヤード
プライベート FreeMarkerConfigurer freeMarkerConfigurer ;
パブリックテンプレート getTemplate (文字列名)例外をスローします{
freeMarkerConfigurer.getConfiguration ( ). getTemplate ( "test.html" )を返します
}


/**
ローカルファイルを指定されたディレクトリにエクスポートする
/
@オーバーライド
public void exportDocFile ( String fileName , String tplName , Map < String , Object > data ) throws Exception {
//ディレクトリが存在しない場合は作成します。
ファイル exportDirs =新しいファイル( exportPath ) ;
if ( ! exportDirs .exists ( ) ) {
exportDirs .mkdirs ( ) ;
}
ライター writer = new BufferedWriter ( new OutputStreamWriter ( new FileOutputStream ( exportPath + fileName ) , encoding ) ) ;
getTemplate ( tplName ) .process (データライター) ;
}

/**
Word ファイルをブラウザ クライアントにエクスポートする
/
@オーバーライド
public void exportDocToClient ( HttpServletResponse レスポンス String fileName String tplName Map < String Object >データ)例外をスローします{
レスポンスをリセットます
レスポンス.setCharacterEncoding ( "UTF-8" ) ;
レスポンス.setContentType ( "application/msword" ) ;
レスポンス.setHeader ( "Content-Disposition" "attachment; filename=" + URLEncoder .encode ( fileName "UTF-8" ) ) ;
//ローカルファイルをクライアントに送信する
ライター out = response .getWriter ( ) ;
テンプレート template = getTemplate ( tplName ) ;
テンプレート.process (データ出力) ;
out.close ( ) ;
}
}

5. 新しいテンプレートファイル test.html を作成します。

具体的な詳細については、ソースコードを参照してください。テンプレートファイルを作成するには、新しいWord文書を作成し、フォーマットを調整してXMLファイルとして保存し、文書内のループマーカーを調整してから、HTMLファイルとして保存してプロジェクトに配置します。

ご質問がございましたら、お気軽にメッセージを残してください。

6. 新しいテストクラスExportController.javaを作成する

 @RestController
@RequestMapping ( "/エクスポート" )
パブリッククラスExportController {
@オートワイヤード
プライベート IExportService エクスポートサービス;
@RequestMapping (= "/testWord " メソッド= RequestMethod .GET )
public void exportWord ( HttpServletRequest リクエスト HttpServletResponse レスポンス)例外をスローします{
文字列 fileName = "Test Word Export.doc" ; //ファイル名
//ヘッダーデータを設定する
Map <文字列オブジェクト> dataMap =新しい HashMap <> ( ) ;
dataMap.put ( "name" "Xiaoming" ) ;
dataMap.put ( "regAddress" "蘇州" ) ;
//テーブルデータを設定する
リスト< ScoreVo > list =新しい ArrayList <> ( ) ;
ScoreVo vo1 =新しい ScoreVo ( ) ;
vo1.setCourseName ( "英語" ) ;
vo1.setScore ( 95 ) ;
vo1.setRank ( 3 ) ;
ScoreVo vo2 =新しい ScoreVo ( ) ;
vo2.setCourseName ( "数学" ) ;
vo2.setScore ( 100 ) ;
vo2.setRank ( 1 ) ;
リストに追加( vo1 )
リストに追加( vo2 )
dataMap .put ( "courseList " リスト) ;
exportService .exportDocToClient (レスポンスファイル名 "test.html" データマップ) ;
}
}

アクセスアドレス: http://localhost:8080/export/testWord

エクスポートされたファイルの結果:

Gitee アドレス: https://gitee.com/hgm1989/springboot-email.git