TemplateEngine.Docx-docxドキュメント用のOpenSource .NETテンプレートエンジン





エンタープライズアプリケーションの開発では、小さな参照から大きなレポートまで、ドキュメントにデータをアップロードする問題を解決することが必要になることがよくあります。



docxドキュメントを生成するためのオープンソースソリューションを共有したいと思います。これにより、コードを書き換えずにWordでデザインを変更できるテンプレートに従ってドキュメントに入力できます。



はじめに-少し紹介します。



テンプレートエンジンに必要なもの





テンプレートエンジンを検索する



適切な「テンプレートエンジン」の検索は失敗しました。サーバーに登録されたドキュメントを作成するという提案もあります。 ( http://livedocx.com/)、4番目のものは異なるプログラマーの指定をテンプレートに追加します 。テンプレートを可能な限りクリーンなままにしておくことで回避したいと思いますhttps://github.com/tssoft/TsSoft.Docx.TemplateEngine )。



何を得たの



コード側では、「テーブル」、「リスト」、「行」、「セル」など、おなじみのエンティティを使用します。



テンプレート側では、ドキュメントは、コンテンツコントロールが配置されて使用され、タグプロパティを介してデータに関連付けられます。 コンテンツコントロールは非常に簡単に追加でき、{FIO}などのテキスト挿入とは異なり、操作中にそれらを台無しにすることは非常に困難です。デザイナーのデザインモードがオフの場合、コントロールの特別な指定はまったく表示されません。



たとえば、テーブルに記入し、その完了日とレコード数を示す必要があります。

Word文書でこのテーブルのテンプレートを作成します。





入力する各フィールドはコントロールに配置し、コード内のデータに関連付ける必要があります。 これを行うには:

  1. [開発者]タブに移動し(存在しない場合は、[ファイル]→[設定]→[リボンの設定]→[開発者]の横のチェックボックスをオンにします)、デザイナーモードをオンにします。
  2. 入力するフィールドとなるテキストを選択します。
  3. [コンテンツコントロールの挿入] [書式設定されたテキスト]をクリックします。
  4. [プロパティ]をクリックし、[タイトル]および[タグ]フィールドに入力します。








テーブルまたはリストに記入する場合は、別のコンテンツコントロールに配置する必要もあります。



これは、コンテンツコントロールが追加されたテンプレートの外観です。





次に、テンプレートにデータを入力します。

2つの行を持つ1つのフィールドと1つのテーブルを追加する必要があり、テーブルのフッターにレコード数を示します。

var valuesToFill = new Content( new FieldContent("Report date", DateTime.Now.Date.ToString()), new TableContent("Team members") .AddRow( new FieldContent("Full name", "  "), new FieldContent("Role", "")) .AddRow( new FieldContent("Full name", "  "), new FieldContent("Role", "")) .AddRow( new FieldContent("Full name", "  "), new FieldContent("Role", " ")), new FieldContent("Count", "3") );
      
      







TemplateProcessorの起動...

 using(var outputDocument = new TemplateProcessor("OutputDocument.docx") .SetRemoveContentControls(true)) { outputDocument.FillContent(valuesToFill); outputDocument.SaveChanges(); }
      
      







すべてがうまくいった場合、次のドキュメントが出力されます。







SetRemoveContentControls(bool value)メソッドを使用すると、結果のドキュメントでコンテンツコントロールが不要になった場合にコンテンツコントロールを削除できます。



TemplateEngine.Docxを使用すると、単純なフィールド、テーブル、リスト、ネストされたリスト、リスト付きのテーブル、テーブル付きのリスト、さらにリストを持つテーブル付きのリストを入力できます... Contentクラスの構造により、要素を無制限にネストしたテンプレートを作成できます。







その他の例!



単純なフィールドに入力する







 var valuesToFill = new Content(new FieldContent("Report date", DateTime.Now.ToString()));
      
      







テーブルに記入する







 var valuesToFill = new Content( new TableContent("Team Members Table") .AddRow( new FieldContent("Name", "Eric"), new FieldContent("Role", "Program Manager")) .AddRow( new FieldContent("Name", "Bob"), new FieldContent("Role", "Developer")), new FieldContent("Count", "2"));
      
      







記入リスト







 var valuesToFill = new Content( new ListContent("Team Members List") .AddItem( new FieldContent("Name", "Eric"), new FieldContent("Role", "Program Manager")) .AddItem( new FieldContent("Name", "Bob"), new FieldContent("Role", "Developer")));
      
      







ネストされたリストを埋める







 var valuesToFill = new Content( new ListContent("Team Members Nested List") .AddItem(new ListItemContent("Role", "Program Manager") .AddNestedItem(new FieldContent("Name", "Eric")) .AddNestedItem(new FieldContent("Name", "Ann"))) .AddItem(new ListItemContent("Role", "Developer") .AddNestedItem(new FieldContent("Name", "Bob")) .AddNestedItem(new FieldContent("Name", "Richard"))));
      
      







リスト内の表







 var valuesToFill = new Content( new ListContent("Projects List") .AddItem(new ListItemContent("Project", "Project one") .AddTable(TableContent.Create("Team members") .AddRow( new FieldContent("Name", "Eric"), new FieldContent("Role", "Program Manager")) .AddRow( new FieldContent("Name", "Bob"), new FieldContent("Role", "Developer")))) .AddItem(new ListItemContent("Project", "Project two") .AddTable(TableContent.Create("Team members") .AddRow( new FieldContent("Name", "Eric"), new FieldContent("Role", "Program Manager")))) .AddItem(new ListItemContent("Project", "Project three") .AddTable(TableContent.Create("Team members") .AddRow( new FieldContent("Name", "Bob"), new FieldContent("Role", "Developer")))));
      
      







テーブル内のリスト







 var valuesToFill = new Content( new TableContent("Projects Table") .AddRow( new FieldContent("Name", "Eric"), new FieldContent("Role", "Program Manager"), new ListContent("Projects") .AddItem(new FieldContent("Project", "Project one")) .AddItem(new FieldContent("Project", "Project two"))) .AddRow( new FieldContent("Name", "Bob"), new FieldContent("Role", "Developer"), new ListContent("Projects") .AddItem(new FieldContent("Project", "Project one")) .AddItem(new FieldContent("Project", "Project three"))));
      
      







個別に入力される複数のブロックで構成されるテーブル







 var valuesToFill = new Content( new TableContent("Team Members Statistics") .AddRow( new FieldContent("Name", "Eric"), new FieldContent("Role", "Program Manager")) .AddRow( new FieldContent("Name", "Richard"), new FieldContent("Role", "Program Manager")) .AddRow( new FieldContent("Name", "Bob"), new FieldContent("Role", "Developer")), new TableContent("Team Members Statistics") .AddRow( new FieldContent("Statistics Role", "Program Manager"), new FieldContent("Statistics Role Count", "2")) .AddRow( new FieldContent("Statistics Role", "Developer"), new FieldContent("Statistics Role Count", "1")));
      
      







縦に結合されたセルを持つテーブル







 var valuesToFill = new Content( new TableContent("Team members info") .AddRow( new FieldContent("Name", "Eric"), new FieldContent("Role", "Program Manager"), new FieldContent("Age", "37"), new FieldContent("Gender", "Male")) .AddRow( new FieldContent("Name", "Bob"), new FieldContent("Role", "Developer"), new FieldContent("Age", "33"), new FieldContent("Gender", "Male")) .AddRow( new FieldContent("Name", "Ann"), new FieldContent("Role", "Developer"), new FieldContent("Age", "34"), new FieldContent("Gender", "Female")));
      
      







水平方向に結合されたセルを持つテーブル







 var valuesToFill = new Content( new TableContent("Team members projects") .AddRow( new FieldContent("Name", "Eric"), new FieldContent("Role", "Program Manager"), new FieldContent("Age", "37"), new FieldContent("Projects", "Project one, Project two")) .AddRow( new FieldContent("Name", "Bob"), new FieldContent("Role", "Developer"), new FieldContent("Age", "33"), new FieldContent("Projects", "Project one")) .AddRow( new FieldContent("Name", "Ann"), new FieldContent("Role", "Developer"), new FieldContent("Age", "34"), new FieldContent("Projects", "Project two")));
      
      







ダウンロード先



このプロジェクトはNuGet( http://www.nuget.org/packages/TemplateEngine.Docx/ )で入手でき、GitHub( https://github.com/UNIT6-open/TemplateEngine.Docx )でリクエストをプルすることができます。



ご清聴ありがとうございました。このツールがあなたのプロジェクトに役立つことを願っています。



著者:アレクセイ・ヴォルコフ、ルスラナ・コトヴァ



All Articles