Open XML ファイル形式を使用すると、Microsoft Word 文書内の表を操作および作成できますが、これを行うには多少手間をかける必要があります。Open XML SDK 2.0 では、Open XML ファイル形式に簡単にアクセスするための厳密に型指定されたクラスが追加されています。SDK によって、文書に情報を挿入する処理が容易になります。この Visual How To のコード サンプルでは、SDK を使用してこの目的を実現する方法を示します。
この Visual How To のサンプルには、Word 2007 または Word 2010 文書に簡単な表を挿入するために必要なコードが含まれています。図 1 に、サンプル アプリケーションで作成される表を示します。以下のセクションで、このコードについて詳細に説明します。
図 1. サンプル アプリケーションによって、既存の Word 文書にこの簡単な表が作成される。
参照のセットアップ
Open XML SDK 2.0 のコードを使用するには、プロジェクトにいくつかの参照を追加する必要があります。サンプル プロジェクトには既にこれらの参照が含まれていますが、独自のコードでは次のアセンブリを明示的に参照する必要があります。
また、次の using/Imports ステートメントをコード ファイルの先頭に追加する必要があります。
Imports DocumentFormat.OpenXml
Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml.Wordprocessing
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
プロシージャの確認
WDAddTable プロシージャは、次の値を指定する 2 つのパラメーターを受け取ります。
変更する文書の名前 (文字列)。
文書に表として挿入される文字列の 2 次元配列。
Public Sub WDAddTable(ByVal fileName As String,
ByVal data(,) As String)
public static void WDAddTable(string fileName, string[,] data)
プロシージャは、受け取った 2 次元配列の情報が含まれる表を文書の末尾に追加して、指定された文書を変更します。プロシージャを呼び出すには、サンプル コードに示すように、両方のパラメーター値を渡します。このサンプル コードを実行する前に、C:\temp\AddTable.docx という名前の文書を用意してください。
Const fileName As String = "C:\temp\AddTable.docx"
WDAddTable(fileName, New String(,) {
{"Texas", "TX"},
{"California", "CA"},
{"New York", "NY"},
{"Massachusetts", "MA"}})
const string fileName = @"C:\temp\AddTable.docx";
WDAddTable(fileName, new string[,]
{ { "Texas", "TX" },
{ "California", "CA" },
{ "New York", "NY" },
{ "Massachusetts", "MA" } });
文書へのアクセス
このコードは、文書を開くところから始まります。WordprocessingDocument.Open メソッドを使用し、文書を読み取り/書き込みアクセスで開くことを指定します (最後の true パラメーター)。次に、Word 文書の MainDocumentPart プロパティの Document プロパティを使用して、ドキュメント パーツへの参照を取得します。
Using document = WordprocessingDocument.Open(fileName, True)
Dim doc = document.MainDocumentPart.Document
' Code removed here…
End Using
using (var document = WordprocessingDocument.Open(fileName, true))
{
var doc = document.MainDocumentPart.Document;
// Code removed here…
}
Table オブジェクトの作成とプロパティの設定
文書に表を挿入する前に、Table オブジェクトを作成してプロパティを設定します。表のプロパティを設定するには、TableProperties オブジェクトの指定値を作成します。TableProperties クラスには、Shading、TableBorders、TableCaption、TableCellSpacing、TableJustification など、表を対象とする多くのプロパティがあります。重要なのは、正しいプロパティ値を指定することです。サンプル プロシージャには、次のコードが含まれています。
Dim table As New Table()
Dim props As TableProperties = _
New TableProperties(New TableBorders( _
New TopBorder With {
.Val = New EnumValue(Of BorderValues)(BorderValues.Single),
.Size = 12},
New BottomBorder With {
.Val = New EnumValue(Of BorderValues)(BorderValues.Single),
.Size = 12},
New LeftBorder With {
.Val = New EnumValue(Of BorderValues)(BorderValues.Single),
.Size = 12},
New RightBorder With {
.Val = New EnumValue(Of BorderValues)(BorderValues.Single),
.Size = 12}, _
New InsideHorizontalBorder With {
.Val = New EnumValue(Of BorderValues)(BorderValues.Single),
.Size = 12}, _
New InsideVerticalBorder With {
.Val = New EnumValue(Of BorderValues)(BorderValues.Single),
.Size = 12}))
table.AppendChild(Of TableProperties)(props)
Table table = new Table();
TableProperties props = new TableProperties(
new TableBorders(
new TopBorder {
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12 },
new BottomBorder {
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12 },
new LeftBorder {
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12 },
new RightBorder {
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12 },
new InsideHorizontalBorder {
Val = new Value<BorderValues>(BorderValues.Single),
Size = 12 },
new InsideVerticalBorder {
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12 }));
table.AppendChild<TableProperties>(props);
TableProperties クラスのコンストラクターでは、子要素を必要な数だけ指定できます (XElement クラスのコンストラクターと同様)。この例では、TopBorder、BottomBorder、LeftBorder、RightBorder、InsideHorizontalBorder、InsiderVerticalBorder の各子要素を作成しており、それぞれが表の枠線要素の 1 つを表します。各要素について、コンストラクターを呼び出す過程で Val および Size プロパティを設定します。サイズの設定は簡単ですが、Val プロパティの設定には多少手間がかかります。このプロパティは、この特定のオブジェクトでは枠線のスタイルを表しており、列挙値に設定する必要があります。これを行うには、EnumValue ジェネリック型のインスタンスを作成し、特定の枠線の種類 (BorderValues.Single) をパラメーターとしてコンストラクターに渡します。必要な表の枠線の値をすべて設定したら、表の AppendChild メソッドを呼び出します。このメソッドは、ジェネリック型が TableProperties であること、つまり変数 props を値に使用して TableProperties クラスのインスタンスを追加していることを指定します。
表のデータの格納
表とそのプロパティを用意したら、表にデータを格納します。サンプル プロシージャでは、指定した文字列の配列内のすべてのデータ行に対して繰り返し処理を行い、各データ行に対応する新しい TableRow インスタンスを作成しています。次のコードでは、行にデータを格納する詳細な部分は省略していますが、行を作成して表に追加する方法を示しています。
For i = 0 To UBound(data, 1)
Dim tr As New TableRow
' Code removed here…
table.Append(tr)
Next
for (var i = 0; i <= data.GetUpperBound(0); i++)
{
var tr = new TableRow();
// Code removed here…
table.Append(tr);
}
行ごとに、指定した文字列の配列内のすべての列に対して繰り返し処理を行います。各列に対応する新しい TableCell を作成し、データを格納して、それを行に追加します。次のコードでは、各セルにデータを格納する詳細な部分は省略していますが、列を作成して表に追加する方法を示しています。
For j = 0 To UBound(data, 2)
Dim tc As New TableCell
' Code removed here…
tr.Append(tc)
Next
for (var j = 0; j <= data.GetUpperBound(1); j++)
{
var tc = new TableCell();
// Code removed here…
tr.Append(tc);
}
次に、文字列の配列からの値が含まれる新しい Text オブジェクトを作成し、そのオブジェクトを新しい Run オブジェクトのコンストラクターに渡し、そのオブジェクトを新しい Paragraph オブジェクトのコンストラクターに渡し、そのオブジェクトをセルの Append メソッドに渡します。言い換えると、このコードはテキストを新しい TableCell オブジェクトに追加します。
tc.Append(new Paragraph(new Run(new Text(data[i, j]))));
その後、新しい TableCellProperties オブジェクトをセルに追加します。この TableCellProperties オブジェクト (前に見た TableProperties オブジェクトなど) は、コンストラクターでオブジェクトを必要な数だけ受け取ることができます。この例では、新しい TableCellWidth オブジェクトだけを渡し、オブジェクトの Type プロパティを TableWidthUnitValues.Auto に設定しています (これによって表の各列の幅が自動的に設定されます)。
' Assume you want columns that are automatically sized.
tc.Append(New TableCellProperties(
New TableCellWidth With {.Type = TableWidthUnitValues.Auto}))
// Assume you want columns that are automatically sized.
tc.Append(new TableCellProperties(
new TableCellWidth { Type = TableWidthUnitValues.Auto }));
最後の仕上げ
最後の仕上げに、表を文書の本文に追加し、文書を保存します。
doc.Body.Append(table)
doc.Save()
doc.Body.Append(table);
doc.Save();
サンプル プロシージャ
次のコード例には、完全なサンプル プロシージャが含まれています。
Public Sub WDAddTable(ByVal fileName As String,
ByVal data(,) As String)
Using document = WordprocessingDocument.Open(fileName, True)
Dim doc = document.MainDocumentPart.Document
Dim table As New Table()
Dim props As TableProperties = _
New TableProperties(New TableBorders( _
New TopBorder With {
.Val = New EnumValue(Of BorderValues)(BorderValues.Single),
.Size = 12},
New BottomBorder With {
.Val = New EnumValue(Of BorderValues)(BorderValues.Single),
.Size = 12},
New LeftBorder With {
.Val = New EnumValue(Of BorderValues)(BorderValues.Single),
.Size = 12},
New RightBorder With {
.Val = New EnumValue(Of BorderValues)(BorderValues.Single),
.Size = 12}, _
New InsideHorizontalBorder With {
.Val = New EnumValue(Of BorderValues)(BorderValues.Single),
.Size = 12}, _
New InsideVerticalBorder With {
.Val = New EnumValue(Of BorderValues)(BorderValues.Single),
.Size = 12}))
table.AppendChild(Of TableProperties)(props)
For i = 0 To UBound(data, 1)
Dim tr As New TableRow
For j = 0 To UBound(data, 2)
Dim tc As New TableCell
tc.Append(New Paragraph(New Run(New Text(data(i, j)))))
' Assume you want columns that are automatically sized.
tc.Append(New TableCellProperties(
New TableCellWidth With {.Type = TableWidthUnitValues.Auto}))
tr.Append(tc)
Next
table.Append(tr)
Next
doc.Body.Append(table)
doc.Save()
End Using
End Sub
public static void WDAddTable(string fileName, string[,] data)
{
using (var document = WordprocessingDocument.Open(fileName, true))
{
var doc = document.MainDocumentPart.Document;
Table table = new Table();
TableProperties props = new TableProperties(
new TableBorders(
new TopBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new BottomBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new LeftBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new RightBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new InsideHorizontalBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new InsideVerticalBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
}));
table.AppendChild<TableProperties>(props);
for (var i = 0; i <= data.GetUpperBound(0); i++)
{
var tr = new TableRow();
for (var j = 0; j <= data.GetUpperBound(1); j++)
{
var tc = new TableCell();
tc.Append(new Paragraph(new Run(new Text(data[i, j]))));
// Assume you want columns that are automatically sized.
tc.Append(new TableCellProperties(
new TableCellWidth { Type = TableWidthUnitValues.Auto }));
tr.Append(tc);
}
table.Append(tr);
}
doc.Body.Append(table);
doc.Save();
}
}
この Visual How To のサンプルでは、Word 2007 または Word 2010 文書に表を挿入するコードを示しています。サンプルを使用するには、「関連情報」セクションに記載されたリンクから入手できる Open XML SDK 2.0 をインストールする必要があります。また、サンプルでは Open XML SDK 2.0 のコード例の一部として含まれるコードも使用しています。「関連情報」セクションには、一連のコード例へのリンクも記載されていますが、コード例をダウンロードおよびインストールしなくてもサンプルは使用できます。
このサンプル アプリケーションで紹介したプロパティは、Word の表を作成するときに使用できる Open XML SDK 2.0 のプロパティの一部に過ぎません。詳細については、Open XML SDK 2.0 Productivity Tool に付属のドキュメントを参照してください。アプリケーション ウィンドウの左下隅にある [Open XML SDK ドキュメント] タブをクリックし、目的のクラスを探してください。最初に、TableProperties クラスおよび TableCellProperties クラスを調べます。現在のところ、ドキュメントにはコード例は含まれていませんが、ここで解説したサンプルとドキュメントを参考にすれば、サンプル アプリケーションを問題なく変更できるはずです。 |