ホームページ  >  記事  >  バックエンド開発  >  C# は NPOI を使用して Word ドキュメントを生成します (テンプレートに従って)

C# は NPOI を使用して Word ドキュメントを生成します (テンプレートに従って)

php是最好的语言
php是最好的语言オリジナル
2018-08-07 10:52:3616856ブラウズ

このプロジェクトではワードエクスポートを統合する必要がありますが、私がやっていたときはオンラインドキュメントリソースが少なく、非常に乱雑だったので、それを確認して整理し、記録を作成し、NPOIの基本的な操作をいくつか共有しました困っている人たちと一緒に Word 文書を操作しています。

この記事では、Word のテキストを生成する操作、表の操作、および図の操作を説明します。これらはすべて Word を生成するための基本的な操作です。

以下はあくまで私の個人的な理解ですので、よりよいアイデアがございましたら、お気軽に追加してください。

VS2017、ソリューションを右クリックし、NuGet パッケージを管理し、プロジェクトの NPOI パッケージを検索してインストールし、引用符を付けます:
using NPOI.XWPF.UserModel;
この記事では、 NPOI バージョン 2.3.0 の場合
本題に入ります
1. テンプレートを入手します (XWPFDocument doc)
テンプレートを使用するには、まずテンプレートを入手します。次に、取得したテンプレートを NPOI のドキュメント オブジェクトの編集:
using (FileStream stream = File.OpenRead("template file address")){
としてインスタンス化します。 XWPFDocument doc = 新しい XWPFDocument(ストリーム);
//プロセスドキュメント、コードコントロール編集ドキュメント。
}
ドキュメントを処理した後、新しいファイルを生成し、それをドキュメントに書き込み、単語の生成を完了します。
FileStream file = new FileStream(生成されたファイルパス ファイル名, FileMode.Create, FileAccess.Write);
doc.Write(file);
file.Close();
doc は、テンプレートのすべてのコンテンツにアクセスします。
もう 1 つの点は、このエディタで使用されるテンプレートはすべて docx サフィックス ファイルであるということです。doc が変更されている場合、docx の読み取り時にエラーが報告され、doxc ドキュメントとして保存する必要があります。
2. テキスト処理 (XWPFParagraph para)
doc.Paragraphs ドキュメント内のすべての段落オブジェクトを取得します;
para.ParagraphText 段落のテキスト データを取得します;
para.ReplaceText (置き換えるテキスト、置換テキスト) 段落のテキストを置き換えます (テンプレート実装の鍵)

XWPFParagraph の公式リファレンスドキュメント

3. テーブル処理 ( XWPFTable テーブル)
doc.Tables ドキュメント内のすべてのテーブル オブジェクトを取得します;
ここでさらに説明する必要がありますが、doc.Tables は Word の最も外側のテーブルのみを取得し、ネストされたテーブルは含まれません。
cell.Tables を使用してネストされたセルを取得できます;
(1) テーブルの行処理 (XWPFTableRow 行)
row.Rows テーブルのすべての行を取得します;
(2) テーブルのセル処理(XWPFTableCell セル)
row.GetTableICells() ; テーブル行内のすべてのセルを取得;
セルを取得した後、次のことができます。セルのテキスト段落 (段落) を取得し、テキスト置換を実行します。
(3) 行セルを水平方向に結合します

CT_Tc cttcofRowThird = cell.GetCTTc();
CT_TcPr ctProfRowThird = cttcofRowThird.AddNewTcPr();
ctProfRowThird.gridSpan = new CT_DecimalNumber();
ctProfRowThird.gridSpan.val = num.ToString();//合并num列

(4) 列セルを垂直方向に結合します

List<XWPFTableRow> rows所有要合并的行的XWPFTableRow对象集合。

XWPFTableCell cellFirstofThird = 第一行要合并的单元格对象;
CT_Tc cttcFirstofThird = cellFirstofThird.GetCTTc();
CT_TcPr ctPrFirstofThird = cttcFirstofThird.AddNewTcPr();
ctPrFirstofThird.AddNewVMerge().val = ST_Merge.restart;//开始合并行
ctPrFirstofThird.AddNewVAlign().val = ST_VerticalJc.center;//垂直
cttcFirstofThird.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
for (int i = 1; i < rows.Count; i++)
{
    XWPFTableCell cellfirstofRow = 第i行要合并的单元格对象;
    CT_Tc cttcfirstofRow = cellfirstofRow.GetCTTc();
    CT_TcPr ctPrfirstofRow = cttcfirstofRow.AddNewTcPr();
    ctPrfirstofRow.AddNewVMerge().val = ST_Merge.@continue;//继续合并行
    ctPrfirstofRow.AddNewVAlign().val = ST_VerticalJc.center;//垂直
}

4. 画像処理
NPOI バージョン 2.3.0 の画像挿入は XML ファイルの変更を統合していないため、手書きでコンパイルする必要があります (もちろん、コピーしました)。

using (FileStream fsImg = new FileStream(图片路径, FileMode.Open, FileAccess.Read, FileShare.None))
{
var picID = doc.AddPictureData(fsImg, (int)NPOI.XWPF.UserModel.PictureType.JPEG);
string picXml = ""
+ "      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"
                    + "         <pic:nvPicPr>" + "            <pic:cNvPr id=\""
                    + "0"
                    + "\" name=\"Generated\"/>"
                    + "            <pic:cNvPicPr/>"
                    + "         </pic:nvPicPr>"
                    + "         <pic:blipFill>"
                    + "            <a:blip r:embed=\""
                    + id
                    + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"
                    + "            <a:stretch>"
                    + "               <a:fillRect/>"
                    + "            </a:stretch>"
                    + "         </pic:blipFill>"
                    + "         <pic:spPr>"
                    + "            <a:xfrm>"
                    + "               <a:off x=\"0\" y=\"0\"/>"
                    + "               <a:ext cx=\""
                    + width
                    + "\" cy=\""
                    + height
                    + "\"/>"
                    + "            </a:xfrm>"
                    + "            <a:prstGeom prst=\"rect\">"
                    + "               <a:avLst/>"
                    + "            </a:prstGeom>"
                    + "         </pic:spPr>"
                    + "      </pic:pic>";
                XWPFParagraph par = cell.AddParagraph();//创建段落对象(可以在doc加也可在cell加)
                par.Alignment = ParagraphAlignment.CENTER;//居中
                XWPFRun run = par.CreateRun();
                CT_Inline inline = run.GetCTR().AddNewDrawing().AddNewInline();
                inline.graphic = new CT_GraphicalObject
                {
                    graphicData = new CT_GraphicalObjectData
                    {
                        uri = "http://schemas.openxmlformats.org/drawingml/2006/picture"
                    }
                };
                try
                {
                    inline.graphic.graphicData.AddPicElement(picXml);
                }
                catch (XmlException xe)
                {
                    throw xe;
                }
                NPOI.OpenXmlFormats.Dml.WordProcessing.CT_PositiveSize2D extent = inline.AddNewExtent();
                extent.cx = width;
                extent.cy = height;
                NPOI.OpenXmlFormats.Dml.WordProcessing.CT_NonVisualDrawingProps docPr = inline.AddNewDocPr();
                docPr.id = 1;
                docPr.name = "Image" + id;
}

今日はここで終わりにします。さらに情報が得られたら、後でさらに追加します。

関連する推奨事項:

C/C を使用して PHP 拡張機能を作成する

[c# チュートリアル]C# データ型

以上がC# は NPOI を使用して Word ドキュメントを生成します (テンプレートに従って)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。