FluentOpenXml-Foxby

Foxbyは、OpenXml形式のWord文書を操作するためのライブラリです。 テンプレートによってドキュメントを生成し、既存のドキュメントに変更加えるように設計されています。 これにより、COM +の使用を拒否したり、 OpenXML SDKを介してOpenXMLツリーを編集したり、宣言形式のメタ要素からドキュメント構造を構築するメカニズムに移動したりできます

解決するタスクのクラス:段落の作成、表、リストの作成と記入、画像の操作、書式設定など。 実際、ライブラリは、 Fluentインターフェイスの形式のAPIを備えたOpenXML SDKのラッパーです。

使用の利点



私たちはこのライブラリを2つのプロジェクトで使用しています。 最初のバージョンはEskat0nによって作成され、Word文書を操作するためのプロジェクトサブシステムの一部として生まれましたが、後に独立したプロジェクトとして削除されました。

次の利点を区別できます。
  1. アプリケーションが実行されているサーバーでは、Microsoft Officeのインストールは不要です
  2. スタックしたWordプロセスで問題なし
  3. COM +よりはるかに高速に動作します
  4. ドキュメントの作成と編集にはハードドライブへの書き込みは不要です。すべてはRAMで行われます
  5. Wordオブジェクトを操作するための便利なFluent API
  6. メタ言語マークアップドキュメントを作成する機能


設置



最新バージョンはNuGetを介してインストールできます。



ソースコードとライセンス



ソースコードは.NET 4.0 / C#で記述され、 LGPLライセンスの下でIndyCodeによってfluent -openxmlとしてGoogle Codeにアップロードされます

使用例



以下は、ライブラリの操作を開始できる例です。

例#1-Hello Word!



private static void Main()
{
using ( var docxDocument = new DocxDocument(SimpleTemplate.EmptyWordFile))
{
var builder = new DocxDocumentBuilder(docxDocument);

builder
.Tag(SimpleTemplate.ContentTagName,
x => x.Center.Paragraph(z => z.Bold.Text( "Hello Word!" )));

File .WriteAllBytes( string .Format( @"D:\Word.docx" ), docxDocument.ToArray());
}
}

* This source code was highlighted with Source Code Highlighter .




SimpleTemplate.EmptyWordFileは、ライブラリ自体に組み込まれているテンプレートです。 テンプレートには、ヘッダー、コンテンツ、およびフッターのタグ以外には何もありません。 このテンプレートは、テスト目的および単純なドキュメントの生成に最適です。

ファイルをディスクに書き込むFile.WriteAllBytesの代わりに、バイト配列をFileResultとして転送して、ユーザーが生成されたドキュメントをすぐに受信できるようにすることができます。

添付ファイル階層は、ライブラリを操作するイデオロギーを理解するのに役立ちます。


例2契約を作成する



多くの場合、契約または請求書を作成する必要があります。 この例は、典型的なドキュメント作成シナリオを示しています。 簡単にするために、変数はデータベースから取得されるのではなく、変数によって決定されます。

private static void Main()
{
string customerName = " .." ;
string orderNumber = "4" ;
string itemName1 = "" ;
string itemSumm1 = "5 000" ;
string itemName2 = " " ;
string itemSumm2 = "6 342" ;
string summ = "11 342" ;

using ( var docxDocument = new DocxDocument(SimpleTemplate.EmptyWordFile))
{
var builder = new DocxDocumentBuilder(docxDocument);

builder
.Tag(SimpleTemplate.ContentTagName,
x => x
.Center.Paragraph(z => z.Bold.Text( string .Format( " №{0}" , orderNumber)))
.Right.Paragraph( string .Format( " {0} ." , DateTime .Now.ToString( "dd MMMM yyyy" )))
.Left.Paragraph( string .Format( ", {0}, :" , customerName))
.Table(t => t.Column( "" , 70).Column( ", ." , 30),
r => r.Row(itemName1, itemSumm1)
.Row(itemName2, itemSumm2)
.Row(w => w.Right.Bold.Text( ":" ), w=>w.Center.Bold.Underlined.Text(summ))
));

File .WriteAllBytes( string .Format( @"D:\Word.docx" ), docxDocument.ToArray());
}
}


* This source code was highlighted with Source Code Highlighter .




例3-作成されたドキュメントの変更


シナリオ:
  1. K. Ivanovによって署名されたドキュメントを作成します
  2. 承認のために文書を送信します
  3. 電子文書が返され、ペトロフA.I.が署名する必要があると彼らは言う
  4. ドキュメント内の署名者を変更する


private static void Main()
{
using ( var docxDocument = new DocxDocument(SimpleTemplate.EmptyWordFile))
{
var builder = new DocxDocumentBuilder(docxDocument);

builder
.Tag(SimpleTemplate.ContentTagName,
x => x.Left.Paragraph( " ..." )
.Right.Paragraph(z => z.Placeholder( "SIGNER_NAME" , " .." )));

File .WriteAllBytes( string .Format( @"D:\Word.docx" ), docxDocument.ToArray());
}

using ( var docxDocument = new DocxDocument( File .ReadAllBytes( @"D:\Word.docx" )))
{
var builder = new DocxDocumentBuilder(docxDocument);

builder
.Placeholder( "SIGNER_NAME" , x => x.Text( " .." ));

File .WriteAllBytes( string .Format( @"D:\Word.docx" ), docxDocument.ToArray());
}
}


* This source code was highlighted with Source Code Highlighter .




例4-ドキュメントを最初から作成する



private static void Main()
{
using ( var docxDocument = new DocxDocument())
{
docxDocument.AddOpenCloseTag( "CONTENT" );

var builder = new DocxDocumentBuilder(docxDocument);

builder
.Tag( "CONTENT" , x => x.Left.Paragraph( " ..." ));

File .WriteAllBytes( string .Format( @"D:\Word.docx" ), docxDocument.ToArray());
}
}


* This source code was highlighted with Source Code Highlighter .




例5-単体テスト


ライブラリにはかなりの数の単体テストが記述されており、スクリプトをよりよく理解できます。 Google Code:fluent-openxmlからテスト付きのソースコードをダウンロードできます。

パン



Alexander Zaitsevは楽しんで、テキストをフォーマットするためのかなり興味深い実装を行いました。

builder.Tag( "CONTENT" , x => x.Paragraph( " " .Bold() + " " .Italic() + " " .Underlined() + "" ));

* This source code was highlighted with Source Code Highlighter .


このメソッドは、Boldプロパティの代替として、テキストに使用できます。

フィードバック



このライブラリはより良いものであり、 フィードバックをいただければ、さまざまな特定の状況で動作します。




参照資料

DotNetConfカンファレンスのビデオとスライド:Fluentインターフェイスを介してOpenXmlドキュメントを作成および編集するためのOpenSourceライブラリの発表

Source: https://habr.com/ru/post/J125903/


All Articles