C#でWordファイルを作成・編集する方法|初心者向けにライブラリ選びから実装手順まで解説
はじめに
C#でWordファイルを作成・編集できるようになると、請求書、見積書、契約書、報告書、帳票などをプログラムから自動生成できます。手作業でWordを開いてコピー&ペーストする作業を減らせるため、業務システムや社内ツール、Webアプリケーションでもよく使われる実装です。
一方で、「C# Word」と検索して調べ始めると、Open XML SDK、Office Interop、DocX、Aspose.Words、Spire.Docなど複数の方法が出てきます。どれを選べばよいか分からないまま実装すると、サーバーで動かない、レイアウトが崩れる、PDF変換ができない、ライセンス条件に合わないといった問題が起こりやすくなります。
この記事では、C#でWordファイルを作成・編集する方法を初心者向けに整理し、ライブラリの選び方から基本的な実装手順、実務での注意点まで解説します。
1. C#でWordファイルを作成・編集する方法の全体像
C#でWordファイルを扱う方法は、大きく分けると「Wordファイルの中身を直接操作する方法」と「Microsoft Word本体を自動操作する方法」に分かれます。
Wordファイル、特に現在よく使われる.docxは、内部的にはXMLベースのOpen XML形式です。Microsoftの説明でも、Open XML形式はXMLベースのファイル形式であり、Wordでは.docxなどの拡張子として使われます。マイクロソフトサポート
そのため、C#から.docxを操作する場合は、Wordアプリケーションを起動しなくても、ライブラリを使って文書構造を編集できます。
1-1. C#でWord操作が必要になる主なケース
C#でWordファイルを操作する代表的なケースは次のようなものです。
業務システムでは、顧客情報や請求データをもとに、請求書・見積書・契約書・申込書などを自動作成する場面が多くあります。テンプレートとなるWordファイルを用意しておき、会社名、氏名、金額、日付などを差し込む形です。
また、データベースの内容をWord帳票として出力したい場合にも使われます。たとえば、月次報告書、作業報告書、検査結果表、議事録、診断書形式のレポートなどです。
さらに、Webアプリケーションでユーザーが入力した内容をWord形式でダウンロードさせる機能にも利用できます。PDFよりもWordのほうが後から編集しやすいため、社内文書や提案書ではWord出力が求められることがあります。
1-2. Wordファイル操作でできること・できないこと
C#でWordファイルを操作すると、主に次のような処理ができます。
新規Wordファイルの作成、既存ファイルの読み込み、文字列の追加、段落の追加、テキストの検索・置換、表の作成、画像の挿入、フォント設定、ヘッダー・フッター編集、改ページ、テンプレートへの差し込み、PDF変換などです。
ただし、すべてのライブラリが同じ機能を持っているわけではありません。無料ライブラリでは基本的な.docx作成や編集はできても、複雑なレイアウト、コメント、変更履歴、差し込み印刷、PDF変換、高度な表現には対応が弱いことがあります。
特にPDF変換は注意が必要です。Word文書のレイアウトをPDFとして再現するには、ページレイアウト、フォント、画像、表、改ページなどを正確に計算する必要があります。Aspose.Wordsの公式ドキュメントでも、WordからPDFへの変換はWordのページレイアウトエンジンに近い処理が必要になる複雑な処理として説明されています。Aspose Documentation
1-3. .docと.docxの違い
.docは古いWord文書形式で、主にWord 97〜2003時代に使われていたバイナリ形式です。一方、.docxはWord 2007以降で標準的に使われるOpen XML形式です。
C#で扱いやすいのは基本的に.docxです。Open XML SDKやDocXなど、多くのライブラリは.docxを対象にしています。Open XML SDKはOpen XMLパッケージとスキーマ要素を操作するためのSDKで、Word、Excel、PowerPointなどのOffice Open XML形式を扱うために使われます。Microsoft Learn
古い.docを扱いたい場合は、Office Interopや商用ライブラリが候補になります。ただし、サーバー環境でMicrosoft Wordを自動操作する方法には注意が必要です。
1-4. 初心者は「ライブラリ選び」から始めるべき理由
C#でWord操作を始めるときは、コードを書く前にライブラリ選びを行うことが重要です。
理由は、ライブラリによって対応できる処理が大きく違うからです。たとえば、Open XML SDKは無料で使えて.docxを直接操作できますが、Word文書の構造を理解する必要があります。Office InteropはWordの機能を利用できる反面、Wordのインストールが必要で、サーバー利用には向きません。商用ライブラリは機能が豊富ですが、費用やライセンス確認が必要です。
初心者が最初に確認すべきポイントは、「新規作成だけでよいのか」「既存テンプレートを編集したいのか」「PDF変換が必要か」「サーバーで動かすのか」「無料で済ませたいのか」です。この条件によって、選ぶべき方法が変わります。
2. C#でWordファイルを扱う代表的な方法
C#でWordファイルを扱う代表的な方法には、Open XML SDK、Microsoft Office Interop、DocX・Xceed Words for .NET、Aspose.Words・Spire.Docなどの商用ライブラリ、テンプレート差し込み方式があります。
2-1. Open XML SDKを使う方法
Open XML SDKは、Microsoftが提供しているOpen XML形式を操作するためのライブラリです。.docxファイルを直接作成・編集できます。Microsoft Learnには、Open XML SDKを使ってWord文書をプログラムから作成する方法や、文書を読み取り専用で開く方法が公開されています。Microsoft Learn+1
Open XML SDKのメリットは、無料で使えること、Wordのインストールが不要なこと、サーバーやクラウド環境でも使いやすいことです。
一方で、Word文書の内部構造に近いコードを書く必要があるため、初心者には少し難しく感じるかもしれません。段落、Run、Text、Table、SectionPropertiesなどの要素を理解する必要があります。
Open XML SDKは、細かく制御したい場合や、ライセンス費用を抑えたい場合に向いています。
2-2. Microsoft Office Interopを使う方法
Microsoft Office Interopは、C#からMicrosoft WordアプリケーションをCOM経由で操作する方法です。Wordを実際に起動し、文書を開いて編集し、保存するようなイメージです。
Wordの機能をそのまま使えるため、画面上で行う操作に近い処理を書けます。既存のWordマクロやWordの機能に慣れている場合は理解しやすい方法です。
ただし、Office Interopを使うには基本的に実行環境にMicrosoft Wordがインストールされている必要があります。また、MicrosoftはOfficeのサーバーサイドオートメーションについて、推奨もサポートもしないと説明しています。マイクロソフトサポート
そのため、デスクトップアプリでユーザーのPC上にあるWordを操作する用途なら候補になりますが、ASP.NETやWindowsサービス、バッチ処理、クラウド環境では避けるのが一般的です。
2-3. DocX・Xceed Words for .NETを使う方法
DocXやXceed Words for .NETは、C#からWordファイルを比較的シンプルなコードで作成・編集できるライブラリです。
Xceed.Words.NETのNuGetページでは、Microsoft Officeを必要とせず、Word文書の作成、編集、変換、保護などを行える.NETライブラリとして説明されています。NuGet
Open XML SDKよりもコードが分かりやすいことが多く、初心者が「まずC#でWordファイルを作ってみたい」という場合に使いやすい選択肢です。
ただし、無料版・有料版・ライセンス条件・対応機能はバージョンや製品形態によって変わるため、商用利用前には必ず公式情報を確認しましょう。
2-4. Aspose.Words・Spire.Docなど商用ライブラリを使う方法
Aspose.WordsやSpire.Docなどの商用ライブラリは、Word文書の作成・編集に加えて、PDF変換、HTML変換、差し込み印刷、複雑な書式、表、画像、ヘッダー・フッターなどに幅広く対応していることが多いです。
Aspose.Words for .NETは、Word、PDF、Web文書の作成、編集、変換などを行う.NET向けライブラリとして提供されています。Aspose Products
商用ライブラリのメリットは、実務で必要になりやすい機能がまとまっていることです。特に、WordからPDFへの変換、既存テンプレートの高精度な維持、画像や表を含む複雑な文書の出力では有力な選択肢になります。
デメリットはコストです。開発者ライセンス、サーバーライセンス、配布条件などを確認する必要があります。
2-5. Wordテンプレートを差し込み編集する方法
実務で最もよく使われるのが、Wordテンプレートを用意して、C#でプレースホルダーを置換する方法です。
たとえば、Wordファイル内に次のような文字列を置いておきます。
{{CustomerName}}
{{InvoiceDate}}
{{TotalAmount}}
C#側では、これらを実際の値に置き換えます。
この方法のメリットは、レイアウトをWord上で調整できることです。プログラムで細かく余白や表の幅を設定するよりも、テンプレートをデザイナーや事務担当者が編集できる形にしたほうが運用しやすくなります。
ただし、Wordでは1つの文字列が複数のRunに分割されることがあります。その場合、単純な文字列置換では反映されないことがあるため、テンプレート設計には注意が必要です。
3. C#向けWordライブラリの選び方
C#でWordライブラリを選ぶときは、「無料か有料か」だけで判断しないことが大切です。実行環境、対応形式、機能、ライセンス、保守性を含めて比較しましょう。
3-1. 無料・有料で比較する
無料で始めたい場合は、Open XML SDKが有力です。NuGetではDocumentFormat.OpenXmlパッケージとして提供されており、Word、Excel、PowerPoint文書を強い型付きの.NET APIで扱うためのライブラリとして説明されています。NuGet
無料ライブラリはコストを抑えられますが、複雑なレイアウトやPDF変換を自前で対応する必要が出ることがあります。
有料ライブラリは費用がかかりますが、開発工数を大きく減らせる場合があります。特に帳票出力、契約書作成、PDF変換、サーバー大量処理などを行う場合は、ライブラリ費用よりも開発・保守コストの削減効果が大きいことがあります。
3-2. Wordのインストールが必要かで比較する
サーバーやクラウド環境で使うなら、Wordのインストールが不要なライブラリを選ぶのが基本です。
Open XML SDK、DocX、Xceed Words for .NET、Aspose.Words、Spire.Docなどは、Wordファイルそのものをライブラリで操作する方式です。
一方、Office InteropはWordアプリケーションを操作する方式です。デスクトップアプリ用途では使える場面がありますが、サーバーサイドではトラブルの原因になりやすいため注意が必要です。
3-3. サーバー・クラウド環境で使えるか確認する
ASP.NET Core、Windowsサービス、Azure App Service、AWS、DockerなどでWordファイルを生成する場合は、サーバー環境で安定して動作するライブラリを選びましょう。
確認すべき項目は、次のとおりです。
・Wordのインストールが不要か
・Linux環境で動作するか
・.NET 6 / .NET 8 など対象バージョンに対応しているか
・同時実行時に安全か
・一時ファイルの保存先を制御できるか
・PDF変換時にフォントを指定できるか
・商用利用ライセンスが条件に合うか
サーバーでOffice Interopを使うと、権限、ダイアログ表示、プロセス残り、同時実行、ファイルロックなどの問題が起きやすくなります。業務システムでは、サーバー対応を明記しているライブラリを選ぶほうが安全です。
3-4. 日本語・画像・表・ヘッダー・フッター対応を確認する
日本語文書を扱う場合は、日本語フォント、禁則処理、改行、縦書き、全角文字、ルビ、均等割り付けなどが問題になることがあります。
基本的な日本語テキストの出力だけなら多くのライブラリで対応できますが、PDF変換まで行う場合はフォント環境が重要です。サーバーに日本語フォントが入っていないと、文字化けやレイアウト崩れが発生することがあります。
また、表や画像を多用する文書では、セル幅、画像サイズ、余白、折り返し、ヘッダー・フッターの位置なども確認しましょう。無料ライブラリで十分な場合もありますが、帳票品質を重視するなら商用ライブラリの検証も必要です。
3-5. 初心者におすすめの選び方
初心者には、目的別に次の選び方がおすすめです。
まず、.docxを無料で作成・編集したいならOpen XML SDKを検討します。コードはやや長くなりますが、仕組みを理解すれば安定して使えます。
簡単なコードでWordファイルを作りたいならDocXやXceed Words for .NETが候補になります。段落追加やテキスト置換などを直感的に書きやすい点が魅力です。
サーバーで大量の帳票を作る、PDF変換も必要、レイアウト品質を重視するという場合は、Aspose.WordsやSpire.Docなどの商用ライブラリを比較しましょう。
Office Interopは、既にWordが入っているPC上で動く社内向けデスクトップツールなどに限定して考えるのが無難です。
4. C#でWordファイルを作成する基本手順
ここでは、無料で使いやすいOpen XML SDKを例に、C#で新規Wordファイルを作成する基本手順を紹介します。
4-1. 開発環境を準備する
まず、C#の開発環境を準備します。一般的には次の構成で始めるとよいでしょう。
・Visual Studio または Visual Studio Code
・.NET 6 以降
・C# コンソールアプリまたはASP.NET Coreアプリ
・NuGetパッケージ管理機能
初心者は、まずコンソールアプリでWordファイルを1つ作成するところから始めるのがおすすめです。Webアプリに組み込むのは、基本動作を確認してからにしましょう。
4-2. NuGetでライブラリをインストールする
Open XML SDKを使う場合は、NuGetでDocumentFormat.OpenXmlをインストールします。
コマンドラインでは次のように実行します。
Bashdotnet add package DocumentFormat.OpenXml
Visual Studioを使う場合は、「NuGetパッケージの管理」からDocumentFormat.OpenXmlを検索してインストールします。
4-3. 新規Wordファイルを作成する
次のコードは、C#で新しいWordファイルを作成する最小構成の例です。
C#using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
var filePath = "sample.docx";
using (var document = WordprocessingDocument.Create(
filePath,
WordprocessingDocumentType.Document))
{
var mainPart = document.AddMainDocumentPart();
mainPart.Document = new Document(
new Body(
new Paragraph(
new Run(
new Text("C#で作成したWordファイルです。")
)
)
)
);
mainPart.Document.Save();
}
Console.WriteLine("Wordファイルを作成しました。");
このコードを実行すると、sample.docxというWordファイルが作成されます。
4-4. 文字列・段落を追加する
複数の段落を追加したい場合は、BodyにParagraphを追加します。
C#using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
var filePath = "paragraphs.docx";
using (var document = WordprocessingDocument.Create(
filePath,
WordprocessingDocumentType.Document))
{
var mainPart = document.AddMainDocumentPart();
mainPart.Document = new Document();
var body = new Body();
body.Append(
new Paragraph(
new Run(
new Text("見出し:C#でWordファイルを作成する")
)
)
);
body.Append(
new Paragraph(
new Run(
new Text("これは本文の1段落目です。")
)
)
);
body.Append(
new Paragraph(
new Run(
new Text("これは本文の2段落目です。")
)
)
);
mainPart.Document.Append(body);
mainPart.Document.Save();
}
Open XML SDKでは、Word文書の構造をプログラムで組み立てます。Document、Body、Paragraph、Run、Textという階層を意識すると理解しやすくなります。
4-5. 作成したWordファイルを保存する
Open XML SDKでは、Save()を呼び出して文書内容を保存します。また、usingを使うことでファイルが正しく閉じられます。
ファイルを保存するときは、次の点に注意しましょう。
・保存先フォルダが存在するか
・同名ファイルを上書きしてよいか
・ファイルがWordで開かれていないか
・アプリケーションに書き込み権限があるか
特にWebアプリでは、保存先をアプリケーションフォルダにすると権限エラーになることがあります。一時フォルダや専用の出力フォルダを用意しましょう。
5. C#で既存のWordファイルを編集する方法
既存のWordファイルを編集する場合は、テンプレートファイルを読み込み、必要な箇所を変更して別名保存する流れが一般的です。
5-1. 既存の.docxファイルを読み込む
Open XML SDKで既存ファイルを編集する場合は、WordprocessingDocument.Open()を使います。
C#using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
var filePath = "template.docx";
using (var document = WordprocessingDocument.Open(filePath, true))
{
var body = document.MainDocumentPart?.Document.Body;
if (body != null)
{
body.Append(
new Paragraph(
new Run(
new Text("C#から追加した段落です。")
)
)
);
document.MainDocumentPart!.Document.Save();
}
}
第2引数をtrueにすると編集可能な状態で開きます。読み取りだけでよい場合はfalseを指定します。
5-2. Word内のテキストを検索・置換する
テンプレートの文字列を置換する場合、単純な文書では次のような処理で対応できます。
C#using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
var filePath = "template.docx";
using (var document = WordprocessingDocument.Open(filePath, true))
{
var texts = document.MainDocumentPart!
.Document
.Descendants<Text>();
foreach (var text in texts)
{
if (text.Text.Contains("{{CustomerName}}"))
{
text.Text = text.Text.Replace("{{CustomerName}}", "山田 太郎");
}
if (text.Text.Contains("{{Date}}"))
{
text.Text = text.Text.Replace("{{Date}}", DateTime.Today.ToString("yyyy年MM月dd日"));
}
}
document.MainDocumentPart.Document.Save();
}
Microsoft Learnにも、Open XML SDKを使ってWord文書内のテキストを検索・置換する方法が掲載されています。Microsoft Learn
ただし、Wordでは同じ見た目の文字列でも、内部的に複数のText要素やRunに分割されることがあります。たとえば、{{CustomerName}}の途中だけフォントが違うと、単純なContains()では見つからない場合があります。
実務では、プレースホルダー全体に同じ書式を設定する、プレースホルダーを短くする、コンテンツコントロールを使う、商用ライブラリの置換機能を使うなどの対策を検討します。
5-3. 差し込み用テンプレートを編集する
差し込み用テンプレートを使う場合は、元ファイルを直接編集せず、コピーしてから編集するのが安全です。
C#var templatePath = "invoice_template.docx";
var outputPath = "invoice_001.docx";
File.Copy(templatePath, outputPath, overwrite: true);
using (var document = WordprocessingDocument.Open(outputPath, true))
{
foreach (var text in document.MainDocumentPart!.Document.Descendants<Text>())
{
text.Text = text.Text
.Replace("{{InvoiceNo}}", "INV-001")
.Replace("{{CustomerName}}", "株式会社サンプル")
.Replace("{{TotalAmount}}", "110,000円");
}
document.MainDocumentPart.Document.Save();
}
この方法なら、テンプレートファイルを壊さずに何度でも使い回せます。
5-4. 段落・見出し・改ページを追加する
Word文書に段落や改ページを追加するには、Paragraphを追加します。改ページはBreakを使います。
C#using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Wordprocessing;
var body = document.MainDocumentPart!.Document.Body;
body!.Append(
new Paragraph(
new Run(
new Text("新しい章の見出し")
)
)
);
body.Append(
new Paragraph(
new Run(
new Break() { Type = BreakValues.Page }
)
)
);
body.Append(
new Paragraph(
new Run(
new Text("改ページ後の本文です。")
)
)
);
見出しスタイルを厳密に設定したい場合は、Word側でテンプレートにスタイルを用意し、C#側からスタイルIDを指定する方法が使われます。
5-5. 編集後のWordファイルを別名保存する
既存ファイルを編集するときは、直接上書きするよりも別名保存が安全です。特にテンプレートを使う場合は、必ずコピーを作ってから編集しましょう。
C#var templatePath = "contract_template.docx";
var outputPath = $"contract_{DateTime.Now:yyyyMMddHHmmss}.docx";
File.Copy(templatePath, outputPath);
using (var document = WordprocessingDocument.Open(outputPath, true))
{
foreach (var text in document.MainDocumentPart!.Document.Descendants<Text>())
{
text.Text = text.Text.Replace("{{Name}}", "佐藤 花子");
}
document.MainDocumentPart.Document.Save();
}
ファイル名には、日時、顧客ID、伝票番号などを含めると管理しやすくなります。
6. C#でWord文書に表・画像・書式を追加する方法
Word文書では、テキストだけでなく、表、画像、フォント、余白、ヘッダー・フッターなどを扱う場面が多くあります。
6-1. 表を作成してデータを挿入する
Open XML SDKで表を作成する例です。
C#using DocumentFormat.OpenXml.Wordprocessing;
var table = new Table();
var headerRow = new TableRow();
headerRow.Append(
new TableCell(new Paragraph(new Run(new Text("商品名")))),
new TableCell(new Paragraph(new Run(new Text("数量")))),
new TableCell(new Paragraph(new Run(new Text("金額"))))
);
table.Append(headerRow);
var dataRow = new TableRow();
dataRow.Append(
new TableCell(new Paragraph(new Run(new Text("開発費")))),
new TableCell(new Paragraph(new Run(new Text("1")))),
new TableCell(new Paragraph(new Run(new Text("100,000円"))))
);
table.Append(dataRow);
document.MainDocumentPart!.Document.Body!.Append(table);
document.MainDocumentPart.Document.Save();
表の罫線やセル幅を設定するには、TablePropertiesやTableCellPropertiesを追加します。帳票では表の見た目が重要になるため、最初はWordテンプレート内に表を作っておき、C#から行だけを追加する方法もおすすめです。
6-2. 画像を挿入する
画像挿入は、テキスト追加よりも少し複雑です。Open XML SDKでは、画像パーツを文書に追加し、描画要素として参照する必要があります。
初心者の場合、画像を多用する文書では、まずDocXや商用ライブラリを使う方法を検討してもよいでしょう。ライブラリによっては、画像ファイルのパスを指定して挿入するだけで済む場合があります。
画像を扱うときは、次の点に注意します。
・画像ファイルの存在確認
・対応形式
・画像サイズ
・縦横比
・本文中の配置
・ヘッダーやフッターへの挿入可否
画像サイズを指定しないと、Word上で想定より大きく表示されることがあります。帳票では、あらかじめテンプレート側に画像枠を用意しておくとレイアウト崩れを防ぎやすくなります。
6-3. フォント・文字サイズ・太字を設定する
Open XML SDKでは、RunPropertiesを使って文字の書式を設定します。
C#var run = new Run();
run.Append(
new RunProperties(
new Bold(),
new FontSize() { Val = "28" },
new RunFonts() { Ascii = "Yu Gothic", HighAnsi = "Yu Gothic", EastAsia = "Yu Gothic" }
)
);
run.Append(new Text("太字の見出しです"));
var paragraph = new Paragraph(run);
document.MainDocumentPart!.Document.Body!.Append(paragraph);
document.MainDocumentPart.Document.Save();
FontSizeの値は半ポイント単位です。たとえば28は14ptを意味します。
日本語を扱う場合は、EastAsiaに日本語フォントを指定することが重要です。英数字だけにフォントを指定しても、日本語部分に反映されないことがあります。
6-4. ページ設定・余白・改ページを設定する
ページ余白や用紙サイズは、セクション設定で管理します。Open XML SDKではSectionPropertiesを使います。
C#var sectionProperties = new SectionProperties(
new PageMargin()
{
Top = 1440,
Bottom = 1440,
Left = 1440,
Right = 1440
}
);
document.MainDocumentPart!.Document.Body!.Append(sectionProperties);
document.MainDocumentPart.Document.Save();
Open XMLでは、余白の単位としてtwipが使われます。1インチは1440twipです。
改ページは、次のように追加できます。
C#var pageBreak = new Paragraph(
new Run(
new Break() { Type = BreakValues.Page }
)
);
document.MainDocumentPart!.Document.Body!.Append(pageBreak);
請求書、契約書、報告書などでは、ページの途中で表が分断されると見づらくなります。必要に応じて、テンプレート側で改ページ位置を調整しておきましょう。
6-5. ヘッダー・フッターを編集する
ヘッダー・フッターには、会社名、文書番号、ページ番号、日付、ロゴなどを入れることがよくあります。
Open XML SDKでもヘッダー・フッターは編集できますが、本文よりも構造が複雑です。初心者は、まずWordテンプレート側にヘッダー・フッターを作成しておき、必要な文字列だけをC#で置換する方法が扱いやすいです。
たとえば、ヘッダー内に{{CompanyName}}という文字列を置いておき、本文と同じように置換する設計にします。
C#foreach (var headerPart in document.MainDocumentPart!.HeaderParts)
{
foreach (var text in headerPart.RootElement!.Descendants<Text>())
{
text.Text = text.Text.Replace("{{CompanyName}}", "株式会社サンプル");
}
headerPart.RootElement.Save();
}
フッターも同様にFooterPartsを処理します。
7. 実務でよく使うWord自動生成パターン
C#でWordファイルを扱う実務では、ゼロから文書を作るよりも、テンプレートを使って自動生成するパターンが多く使われます。
7-1. 請求書・見積書をWordで自動作成する
請求書や見積書では、会社名、宛先、発行日、明細、合計金額、消費税額などを差し込みます。
おすすめの流れは次のとおりです。
1. Wordで請求書テンプレートを作成する
2. 差し込み箇所に {{CustomerName}} などの目印を入れる
3. C#でテンプレートをコピーする
4. 顧客情報や明細データを差し込む
5. Wordファイルとして保存する
6. 必要に応じてPDFへ変換する
明細行が可変の場合は、テンプレート内に1行分の表を用意しておき、C#から行を複製してデータを入れる方法が使いやすいです。
7-2. 契約書テンプレートに顧客情報を差し込む
契約書では、会社名、住所、代表者名、契約期間、金額、条項番号などを差し込みます。
契約書はレイアウトや文言の正確性が重要です。そのため、C#で全文を組み立てるよりも、法務担当者が管理するWordテンプレートを使うほうが安全です。
注意点は、プレースホルダーを本文中に自然な形で入れすぎないことです。たとえば、{{CustomerName}}のように明確な目印にしておくと、誤置換を防ぎやすくなります。
また、契約書では変更履歴やコメントが残っていないかも確認しましょう。自動生成前のテンプレートをきれいな状態にしておくことが大切です。
7-3. データベースの内容をWord帳票に出力する
データベースから取得した内容をWord帳票に出力する場合は、データ取得処理とWord生成処理を分けて設計します。
C#public class InvoiceData
{
public string CustomerName { get; set; } = "";
public string InvoiceNo { get; set; } = "";
public DateTime InvoiceDate { get; set; }
public decimal TotalAmount { get; set; }
}
このようなデータクラスを作り、Word生成処理には完成したデータだけを渡します。SQLを直接Word生成コードの中に書くと、保守しづらくなります。
C#public void CreateInvoice(InvoiceData data, string templatePath, string outputPath)
{
File.Copy(templatePath, outputPath, true);
using var document = WordprocessingDocument.Open(outputPath, true);
foreach (var text in document.MainDocumentPart!.Document.Descendants<Text>())
{
text.Text = text.Text
.Replace("{{CustomerName}}", data.CustomerName)
.Replace("{{InvoiceNo}}", data.InvoiceNo)
.Replace("{{InvoiceDate}}", data.InvoiceDate.ToString("yyyy年MM月dd日"))
.Replace("{{TotalAmount}}", $"{data.TotalAmount:N0}円");
}
document.MainDocumentPart.Document.Save();
}
このように分けると、データ取得元がSQL Server、CSV、APIなどに変わっても、Word生成処理を再利用しやすくなります。
7-4. 複数のWordファイルを一括作成する
複数のWordファイルを一括作成する場合は、テンプレートをループ処理でコピーし、1件ずつ差し込みます。
C#foreach (var customer in customers)
{
var outputPath = Path.Combine(
"output",
$"invoice_{customer.CustomerId}.docx"
);
File.Copy("invoice_template.docx", outputPath, true);
using var document = WordprocessingDocument.Open(outputPath, true);
foreach (var text in document.MainDocumentPart!.Document.Descendants<Text>())
{
text.Text = text.Text
.Replace("{{CustomerName}}", customer.Name)
.Replace("{{Address}}", customer.Address);
}
document.MainDocumentPart.Document.Save();
}
一括作成では、ファイル名の重複、出力先フォルダの容量、処理途中の失敗、ログ出力が重要になります。100件中1件で失敗した場合に全体を止めるのか、失敗分だけログに残して続行するのかも決めておきましょう。
7-5. WordからPDFへ変換する場合の注意点
WordからPDFへ変換したい場合は、ライブラリ選びが特に重要です。
Open XML SDKはWord文書の構造を操作するためのライブラリであり、Wordと同じ見た目でPDF化する機能を主目的としているわけではありません。PDF変換が必要な場合は、Aspose.Words、Spire.Doc、Xceed Words for .NETなど、PDF出力機能を持つライブラリを検討します。
Aspose.Wordsでは、Microsoft Officeを使用せずにWord形式からPDFへ変換できることが公式ドキュメントで説明されています。Aspose Documentation
PDF変換時は、次の点に注意しましょう。
・日本語フォントがサーバーに存在するか
・Word上の見た目とPDFの見た目が一致するか
・表や画像がページからはみ出さないか
・改ページ位置が変わらないか
・ライセンス上、サーバー変換が許可されているか
特に日本語フォントがないLinux環境では、PDFの文字化けや代替フォントによるレイアウト崩れが起こりやすくなります。
8. C#でWordファイルを操作するときの注意点
C#でWordファイルを操作する場合、コード自体よりも運用環境でのトラブルに注意が必要です。
8-1. Office Interopをサーバーで使う際の注意点
Office Interopは便利に見えますが、サーバーサイドでの利用には大きな注意が必要です。
Microsoftは、Officeのサーバーサイドオートメーションについて、非対話型の実行環境では安定性やセキュリティなどの問題が発生し得るため、推奨もサポートもしないと説明しています。マイクロソフトサポート
サーバーでOffice Interopを使うと、次のような問題が起こることがあります。
・Wordプロセスが残る
・ダイアログが表示されて処理が止まる
・同時実行でエラーになる
・権限不足で起動できない
・ファイルがロックされる
・WindowsサービスやIIS上で不安定になる
そのため、ASP.NETやバッチ処理でWordファイルを生成するなら、Open XML SDKやサーバー対応のライブラリを選ぶほうが安全です。
8-2. ファイルロック・権限エラーへの対処
Wordファイル操作でよくあるエラーが、ファイルロックと権限エラーです。
ファイルロックは、対象のWordファイルをWordアプリで開いているときに起こります。プログラムから編集しようとしても、別プロセスが使用中のため失敗します。
対策として、次の点を確認します。
・処理対象ファイルをWordで開いていないか
・FileStreamを閉じ忘れていないか
・usingを使っているか
・同時に同じファイル名へ出力していないか
・出力先フォルダに書き込み権限があるか
Webアプリでは、ユーザーごとにファイル名を分ける、処理ごとに一時フォルダを作る、保存後すぐにストリームを閉じるといった設計が有効です。
8-3. 文字化け・日本語フォント崩れへの対処
日本語の文字化けやフォント崩れは、Word生成でよくある問題です。
特にPDF変換時は、実行環境に日本語フォントが存在しないと、別フォントに置き換わってレイアウトが崩れることがあります。
対策として、次の点を確認しましょう。
・Wordテンプレートで使用するフォントを統一する
・サーバーに日本語フォントをインストールする
・ライブラリ側でフォントフォルダを指定する
・英数字用フォントだけでなく日本語用フォントも指定する
・本番環境と同じ環境でPDF出力をテストする
Open XML SDKで日本語フォントを指定する場合は、RunFontsのEastAsiaも意識します。
8-4. テンプレートのレイアウト崩れを防ぐ方法
テンプレートのレイアウト崩れを防ぐには、Word側の設計が重要です。
差し込み後の文字数が長くなると、表のセル幅が変わったり、改ページ位置がずれたりします。たとえば、会社名が短い場合は問題なくても、長い会社名では1行に収まらないことがあります。
対策として、次のような工夫が有効です。
・差し込み後の最大文字数を想定する
・表の幅を固定する
・不要な自動調整をオフにする
・プレースホルダーに同じ書式を設定する
・改ページ位置をテンプレート側で調整する
・テストデータに長い文字列を含める
テンプレートは、最短データではなく最長データでテストすることが大切です。
8-5. ライセンス・商用利用の確認ポイント
Wordライブラリを業務システムで使う場合は、ライセンス確認が必須です。
確認すべきポイントは次のとおりです。
・商用利用できるか
・サーバー利用できるか
・開発者ごとのライセンスか
・アプリケーション配布時の条件は何か
・PDF変換機能は別ライセンスか
・無料版に透かしや機能制限がないか
・クラウド環境での利用が許可されているか
特に商用ライブラリの無料評価版では、出力ファイルに透かしが入ったり、ページ数制限があったりする場合があります。本番導入前に必ず公式のライセンス条件を確認しましょう。
9. C#でWord操作がうまくいかないときの原因と対処法
C#でWordファイルを操作していると、ファイルが開けない、置換されない、画像が表示されない、保存後に破損するなどの問題が発生することがあります。原因を切り分けながら対処しましょう。
9-1. Wordファイルが開けない場合
Wordファイルが開けない場合は、まずファイル形式を確認します。
Open XML SDKやDocXで扱えるのは基本的に.docxです。古い.docファイルをそのまま読み込もうとすると失敗する場合があります。
確認すべきポイントは次のとおりです。
・拡張子が .docx か
・ファイルが破損していないか
・Wordで手動で開けるか
・ファイルパスが正しいか
・読み取り権限があるか
・他のプロセスが使用していないか
まずWordで手動で開けるか確認し、開けない場合はファイル自体が破損している可能性があります。
9-2. 文字の置換が反映されない場合
文字の置換が反映されない場合、よくある原因はプレースホルダーが複数のRunに分割されていることです。
Wordでは、同じ行に見える文字列でも、太字、フォント、スペルチェック、編集履歴などの影響で内部的に分割されることがあります。
対策は次のとおりです。
・プレースホルダー全体を同じ書式にする
・途中で太字や色変更をしない
・変更履歴を削除する
・プレースホルダーを短くする
・単純置換ではなく専用のテンプレート機能を使う
たとえば、{{CustomerName}}のCustomer部分だけ色が違うと、C#側では1つの文字列として見つからないことがあります。
9-3. 画像や表が正しく表示されない場合
画像が表示されない場合は、画像パーツの追加、参照ID、サイズ指定を確認します。Open XML SDKでは、画像ファイルを追加するだけではなく、文書内からその画像を参照する構造が必要です。
表が崩れる場合は、セル幅や表幅の設定を確認します。Wordの自動調整によって、データが入ったあとに列幅が変わることもあります。
対策として、テンプレート側で表の幅を固定し、C#では既存の行を複製して値だけ差し替える方法が有効です。
9-4. 保存したファイルが破損する場合
保存したWordファイルが破損する場合は、Open XMLの構造が正しくない可能性があります。
よくある原因は次のとおりです。
・必要なDocumentPartが作成されていない
・Bodyが存在しない
・XML要素の追加場所が不正
・保存前に例外が発生している
・ファイルを閉じる前に別プロセスがアクセスしている
・同時に同じファイルへ書き込んでいる
Open XML SDKでは、Word文書の構造に合わない場所へ要素を追加すると、Wordで開けないファイルになることがあります。最初は小さな文書で動作確認し、段階的に機能を追加しましょう。
9-5. NuGetパッケージのバージョン不一致を確認する
ビルドエラーや実行時エラーが出る場合は、NuGetパッケージのバージョン不一致も確認しましょう。
特に、複数プロジェクトで同じライブラリを使っている場合、プロジェクトごとに異なるバージョンが参照されていると問題が起こることがあります。
確認すべき項目は次のとおりです。
・DocumentFormat.OpenXmlのバージョン
・対象フレームワーク
・依存パッケージのバージョン
・古いDLLがbinフォルダに残っていないか
・開発環境と本番環境で同じバージョンか
一度binやobjフォルダを削除し、パッケージを復元し直すことで解決する場合もあります。
まとめ
C#でWordファイルを作成・編集する方法は複数あります。無料で.docxを直接操作したいならOpen XML SDK、簡単なコードで作成・編集したいならDocXやXceed Words for .NET、PDF変換や高度な帳票出力まで必要ならAspose.WordsやSpire.Docなどの商用ライブラリが候補になります。
Office InteropはWordの機能を利用できる一方で、Wordのインストールが必要で、サーバーサイド利用には向きません。特にWebアプリやクラウド環境では、Word本体を起動しない方式を選ぶのが基本です。
初心者は、まず次の順番で進めるとスムーズです。
1. 作りたいWord文書の完成形を決める
2. 新規作成かテンプレート編集かを決める
3. PDF変換が必要か確認する
4. サーバーで動かすか確認する
5. 条件に合うライブラリを選ぶ
6. 小さなサンプルで作成・編集を試す
7. 実務用テンプレートに差し込み処理を組み込む
C#でWord操作を実装するうえで最も重要なのは、最初にライブラリ選びを間違えないことです。単純な文書作成なら無料ライブラリで十分な場合がありますが、帳票品質、PDF変換、商用利用、サーバー運用まで考えるなら、有料ライブラリも含めて比較しましょう。

