RCIE-ジャンクのコード屋

主に自分のためにコーディングのTIPSを蓄積しています。

(C#)docxファイルの文章を簡易編集する

作ったもの

 Microsoft Word 2007 以降の docx ファイルは、中身が zip 圧縮された xml ファイルなので、ZipArchive で展開すれば編集することができます。
 今回作ったのは docx の document 部分(文字で書かれている箇所)の xml を書き換えるクラスです。

前提

  • アセンブリ参照:System.IO.Compression
  • アセンブリ参照:System.IO.Compression.FileSystem
  • import System.Text;
  • import System.IO;
  • import System.IO.Compression;

コード

class DocxDocument {
/// <summary>
/// docxファイルのdocument部分を読み書きするクラス
/// </summary>
static class DocxEditor {
	/// <summary>
	/// docxファイルをdocument部分を読み込む。
	/// </summary>
	/// <param name="path">ファイルパス</param>
	/// <returns>読み込んだ文字列</returns>
	public static string Read(string path) {
		using (ZipArchive za = ZipFile.Open(path, ZipArchiveMode.Read)) {
			var entries = za.Entries;
			ZipArchiveEntry entry = za.GetEntry("word/document.xml");
			using (var stream = new StreamReader(entry.Open(), Encoding.UTF8)) {
				return stream.ReadToEnd();
			}
		}
	}
	/// <summary>
	/// docxファイルのdocument部分に書き込む。
	/// </summary>
	/// <param name="path">ファイルパス</param>
	/// <param name="content">書き込む文字列</param>
	public static void Write(string path, string content) {
		using (ZipArchive za = ZipFile.Open(path, ZipArchiveMode.Update)) {
			ZipArchiveEntry entry = za.GetEntry("word/document.xml");
			entry.Delete();
			entry = za.CreateEntry("word/document.xml");
			using (var stream = new StreamWriter(entry.Open(), Encoding.UTF8)) {
				stream.Write(content);
			}
		}
	}
}

使い方

string xmlText = DocxDocument.Read(@"C:\なんどか\かんとか.docx"); // 読み込む
xmlText = xmlText.Replace("<@日付>", "2019年1月1日"); // 置き換える
DocxDocument.Write(@"C:\なんとか\かんとか.docx", xmlText); // 書き込む

補足

 docx のファイルフォーマットは非常に難解で習得に時間が掛かりますが、あらかじめ書かれた文字列を置き換える程度ならすぐにできます。例えば

  • <@挨拶> → いつもお世話になっております。
  • <@日付> → 2019年1月1日
  • <@曜日> → (火)

このように置き換えれば docx の自動作成に役立つでしょう。なお、改ページを消したい時には

<w:br w:type="page"/>

を探して削除すると良いです。しかしながら、このタグを挿入すれば改ページができるわけではないので注意してください。