ワープロ ドキュメントの表内のテキストを変更する
このトピックでは、Open XML SDK for Office を使用して、既存のワープロ ドキュメント内のテーブル内のテキストをプログラムで変更する方法について説明します。
既存のドキュメントを開く
既存のドキュメントを開くには、次の using
ステートメントに示すように、WordprocessingDocument クラスをインスタンス化します。 同じステートメントで、Open
メソッドを使用して指定したfilepath
でワープロ ファイルを開き、Boolean パラメーターを true
に設定してドキュメントの編集を有効にします。
using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
v3.0.0 以降では、using ステートメントに依存することを優先して、Close() メソッドが削除されました。
これにより、閉じかっこに達したときに、 Dispose() メソッドが自動的に呼び出されます。 using ステートメントに続くブロックは、using ステートメントで作成または名前付けされたオブジェクトのスコープを確立します。 Open XML SDK の WordprocessingDocument クラスは、IDisposable実装の一部としてオブジェクトを自動的に保存および閉じます。また、ブロックを終了するとDispose()が自動的に呼び出されるため、using
ステートメントを使用する限り、明示的にSave()またはDispose()を呼び出す必要はありません。
表の構造
WordProcessingML
ドキュメントの基本的なドキュメント構造は、document
要素とbody
要素で構成され、その後に段落を表す p
などの 1 つ以上のブロック レベル要素が続きます。 段落には、1 つ以上の r
要素が含まれています。
r
は、書式設定などのプロパティの共通セットを持つテキストの領域である run を表します。 実行には、1 つ以上の t
要素が含まれています。
t
要素には、テキストの範囲が含まれています。
このドキュメントには、次の例のような表を含めることができます。
table
は、rows
とcolumns
に配置された段落 (およびその他のブロック レベルのコンテンツ) のセットです。
WordprocessingML
のテーブルは、HTML テーブル タグに似た tbl
要素を使用して定義されます。 たとえば、セルを 1 つだけ含む空白の表 (つまり 1 行 1 列の表) があり、その罫線が 1 ポイントに指定されているとします。 このテーブルは、次の WordprocessingML
コード例で表されます。
<w:tbl>
<w:tblPr>
<w:tblW w:w="5000" w:type="pct"/>
<w:tblBorders>
<w:top w:val="single" w:sz="4" w:space="0" w:color="auto"/>
<w:left w:val="single" w:sz="4 w:space="0" w:color="auto"/>
<w:bottom w:val="single" w:sz="4" w:space="0" w:color="auto"/>
<w:right w:val="single" w:sz="4" w:space="0" w:color="auto"/>
</w:tblBorders>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="10296"/>
</w:tblGrid>
<w:tr>
<w:tc>
<w:tcPr>
<w:tcW w:w="0" w:type="auto"/>
</w:tcPr>
<w:p/>
</w:tc>
</w:tr>
</w:tbl>
このテーブルは、 tblW
要素を使用してページ幅の 100% のテーブル全体のプロパティ、 tblBorders
要素を使用するテーブル罫線のセット、 tblGrid
要素を使用してテーブル内の共有垂直エッジのセットを定義するテーブル グリッド、および tr
要素を使用した単一のテーブル行を指定します。
サンプル コードの動作のしくみ
サンプル コードでは、 using
ステートメントでドキュメントを開いた後、ドキュメント内の最初のテーブルを見つけます。 次に、インデックスが 1 の行を検索して、テーブル内の 2 番目の行を見つけます。 次に、次のコード例に示すように、インデックスが 2 の 3 番目のセルをその行に配置します。
// Find the first table in the document.
Table table = doc.MainDocumentPart.Document.Body.Elements<Table>().First();
// Find the second row in the table.
TableRow row = table.Elements<TableRow>().ElementAt(1);
// Find the third cell in the row.
TableCell cell = row.Elements<TableCell>().ElementAt(2);
目的のセルを見つけたら、そのセルの最初の段落から 1 番目のセクションを探して、テキストを別のテキストに置き換えます。 これらの操作をコードで表すと、次のようになります。
// Find the first paragraph in the table cell.
Paragraph p = cell.Elements<Paragraph>().First();
// Find the first run in the paragraph.
Run r = p.Elements<Run>().First();
// Set the text for the run.
Text t = r.Elements<Text>().First();
t.Text = txt;
表内のセルのテキストを変更する
次のコード例は、ワープロ ドキュメント内の表の指定されたセルのテキストを変更する方法を示します。 コード例では、ファイル名とパスが引数として ChangeTextInCell
メソッドに渡されるドキュメントにテーブルが含まれていることを想定しています。
また、表に少なくとも 2 つの行と 3 つの列があり、2 行 3 列目のセルにテキストが含まれていることも想定しています。 プログラムで ChangeTextInCell
メソッドを呼び出すと、指定した場所にあるセル内のテキストが、 ChangeTextInCell
メソッドに 2 番目の引数として渡すテキストに置き換えられます。
任意のテキスト | 任意のテキスト | 任意のテキスト |
---|---|---|
任意のテキスト | 任意のテキスト | 2 番目の引数のテキスト |
サンプル コード
ChangeTextInCell
メソッドは、2 行目のテキストと、ファイル内で見つかった最初のテーブルの 3 番目の列を変更します。 このメソッドを呼び出すときは、ファイルの完全パスを 1 番目のパラメーター、使用するテキストを 2 番目のパラメーターとして渡します。 たとえば、 ChangeTextInCell
メソッドを次に呼び出すと、指定したセル内のテキストが "API の例のテキスト" に変更されます。
ChangeTextInCell(args[0], args[1]);
次に、完全なコード例を示します。
// Change the text in a table in a word processing document.
static void ChangeTextInCell(string filePath, string txt)
{
// Use the file name and path passed in as an argument to
// open an existing document.
using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
{
if (doc.MainDocumentPart is null || doc.MainDocumentPart.Document.Body is null)
{
throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}
// Find the first table in the document.
Table table = doc.MainDocumentPart.Document.Body.Elements<Table>().First();
// Find the second row in the table.
TableRow row = table.Elements<TableRow>().ElementAt(1);
// Find the third cell in the row.
TableCell cell = row.Elements<TableCell>().ElementAt(2);
// Find the first paragraph in the table cell.
Paragraph p = cell.Elements<Paragraph>().First();
// Find the first run in the paragraph.
Run r = p.Elements<Run>().First();
// Set the text for the run.
Text t = r.Elements<Text>().First();
t.Text = txt;
}
}