5分でOfficeOpenXMLドキュメントを生成

多くの場合、ASP.NET上のアプリケーションからOpenXML形式のレポートをサーバー上で生成する必要があります。

これを行うには、いくつかの一般的な方法があります。
  1. 「発見、リンク、zayuzal」-Googleにアクセスして、docxまたはxlsxを生成するライブラリを探し、接続し、理解し、生成します。 これはよく知られていますが、長い間です。
  2. 「Fu」-COMを使用します。 これは推奨されません。サーバーにMicrosoft Officeがインストールされている必要があります。スレッドセーフではなく、x64に対応しておらず、一般的に古臭いです。
  3. 「B」-形式を理解し、XMLとzipから組み立てます。 残忍。
  4. 「Microsoftの方法」-この方法はカットの下で説明されています。


小さな紹介


OfficeOpenXMLは、WordおよびExcelで作業するときにデフォルトでドキュメントを保存する場所です:docxおよびxlsx。 ファイルはzipアーカイブです。 名前をzipに変更し、アーカイバを開いて、内容を検討できます。
OfficeOpenXMLフォルダービュー
OOXMLのレポートは、よく知られた方法で受信され、編集されます。 深刻なアプリケーションでこの形式を制限することはお勧めしませんが、サポートすることをお勧めします。

準備する


以下が必要です。
Microsoft WebサイトからOpenXMLSDKToolをダウンロードしてインストールします。

セットアップ

行こう


Open XML SDK 2.0生産性向上ツールを起動します。
生産性ツール
このツールは非常にシンプルで、2つの小さいが重要な操作を実行できます。
しかし、まず最初に。

コード生成


ドキュメントをプログラムに読み込み、「コードを反映」をクリックします。
コードを反映

左側には、ドキュメントの構造が表示されます-アーカイブに存在するファイルとその内容の表示。
ツリー内のノードを選択できます。右側では、この特定のピースを生成できるXMLおよびコードの形式でノードの内容を確認できます。 私の例では、ドキュメントの本文から1つの段落が表示されます。 それはただword / document.xmlにあります。
ツリーのルート(ドキュメント自体)を選択すると、ドキュメント全体のコードが取得されます。

今、このコードを使用しましょう
  1. Visual Studioでプロジェクトを作成します。 シンプルなコンソールC#アプリケーションにします
  2. アセンブリDocumentFormat.OpenXmlへの参照を追加します。
    参照を追加
    GACにあります。 そこに配置したくない場合は、ファイル自体へのリンクを追加できます。 OpenXMLSDKToolが置かれた場所と同じ場所に個別ダウンロードできますが、リンクOpenXMLSDKv2.msiを使用します
  3. WindowsBaseへの参照を追加します
  4. ファイル「GeneratedClass.cs」を追加します
  5. ReflectedCodeウィンドウからツールボックスからコードをコピーします
  6. ファイルを閉じて保存し、Program.csに移動します
  7. Mainメソッドを記述します。
    new GeneratedCode.GeneratedClass().CreatePackage( @"D:\Temp\Output.docx" );
  8. 打ち上げ
それだけです ドキュメントを生成するためのコードの準備ができました。 ドキュメントは、Wordで保存する前とまったく同じに見えます。 速いでしょう?

中身は?

生成されたクラスの中には何がありますか?
まず、1つのオープンメソッドがあります。
public void CreatePackage( string filePath) {
using (WordprocessingDocument package = WordprocessingDocument.Create(filePath, WordprocessingDocumentType.Document)) {
CreateParts(package);
}
}

これは、ドキュメントに含まれるテキストが挿入される場所です。
private void GenerateMainDocumentPart1Content(MainDocumentPart mainDocumentPart1) {
Run run2 = new Run() { RsidRunProperties = "00184031" };
Text text2 = new Text();
text2.Text = " , , , ." ; // . ?
}

コードのプライベートメソッドの名前からわかるように、OpenXmlドキュメントはパーツで構成されています。 各パーツを生成するための個別のメソッドが作成されました。
もちろん、最も好奇心The盛な人は、悪意を持って笑って、ドキュメントに写真を挿入しました。
画像は、このファイルにbase64の形式で直接保存されます。
#region Binary Data
//...
#endregion

弓を結ぶ

写真のリファクタリングと静的コンテンツの動的コンテンツへの置換は、演習として読者に任されます。
そして、これはファイルではなくバイトの配列を生成するメソッドです-一時ファイルなしでasp.netからクライアントに戻るために:
public byte [] CreatePackageAsBytes() {
using ( var mstm = new MemoryStream()) {
using (WordprocessingDocument package = WordprocessingDocument.Create(mstm, WordprocessingDocumentType.Document)) {
CreateParts(package);
}
mstm.Flush();
mstm.Close();
return mstm.ToArray();
}
}

すべて、docx形式のレポートを生成するためのコードは準備ができています。
コンテンツを動的に置き換えることは残っています。 しかし、私たちは常に同じことをするためにこれをすべてしませんでしたね? 「Word形式でダウンロード」リンクをページに追加します。

文書比較


そのため、ドキュメントに従ってコードを生成しました。 彼らはそこに大量のデータを追加し、それをリファクタリングし、本番環境に実装しました。 そして、レポートのフォントとテキストを変更する必要があります。 これを行う方法? 長い間検索するためのコードがたくさんあります。
すべてが非常にシンプルであることが判明しました。ドキュメントを比較する機能は私たちを助けます:
  1. 古い文書と新しい文書を次に置く
  2. Open XML Productivity Toolを開き、[ファイルを比較...]を選択します。
    比較ダイアログ
  3. ファイルを開き、[OK]をクリックします。 比較の結果は次のとおりです。
    結果

    ファイル名のある行で、正確な違いを確認できます。
    比較の詳細

    MoreOprionsは、比較するときに無視するものを選択します。
    [パーツコードの表示]には、XMLが表示されているパーツのコードが表示されます。
    すでにXMLと労働コードを比較することはできません。

ちなみに、この機能は、OpenXML形式に精通している場合に使用するのに非常に便利です。ドキュメントに何かを追加し、何が変更されたかを確認します。 これは、記事の冒頭で言及した「Kommersant」メソッドを選択した人を助けます。

事実


結論


DocumentFormat.OpenXmlを使用してWebアプリケーションでレポートを生成するのが正しい選択だと思います。 SDKの便利なツールキットを使用すると、無駄に時間を無駄にしないことができます。

何を読む


OpenXML SDK Pro: msdn.microsoft.com/en-us/library/bb448854(office.14).aspx
OpenXMLについて(だれかがそれに慣れていない場合): en.wikipedia.org/wiki/Office_Open_XML

頑張って ご清聴ありがとうございました。

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


All Articles