Word for WPF
表の挿入
Word for WPF の操作 > 上級レベルの操作 > 表の挿入

表は、Word ドキュメントでデータをいくつかの行と列に整えて表示するために使用されます。

以下のコードでは、WordUtils および DataAccess という 2 つのクラスが使用されています。これらのクラスは、システムの次の場所にある製品サンプル内に置かれています。
Documents\ComponentOne Samples\WPF\WordCreator
これらのクラスを上記の場所からアプリケーションで使用できます。

Word for WPF を使用すると、次のコードで構造を Word ドキュメントに追加できます。

' データを取得します
Dim ds = DataAccess.GetDataSet()

' ページ四角形を計算します(マージンを差し引いて)
Dim rcPage As Rect = WordUtils.PageRectangle(word)
Dim rc As Rect = rcPage

' タイトルを追加します
Dim titleFont As New Font("Tahoma", 24, RtfFontStyle.Bold)
rc = WordUtils.RenderParagraph(word, word.Info.Title, titleFont, rcPage, rc, False)

' いくつかのテーブルをレンダリングします
RenderTable(word, rc, rcPage, ds.Tables("Customers"), New String() {"CompanyName", "ContactName", "Country", "Address", "Phone"})
// データを取得します
var ds = DataAccess.GetDataSet();

// ページ四角形を計算します(マージンを差し引いて)
Rect rcPage = WordUtils.PageRectangle(word);
Rect rc = rcPage;

// タイトルを追加します
Font titleFont = new Font("Tahoma", 24, RtfFontStyle.Bold);
rc = WordUtils.RenderParagraph(word, word.Info.Title, titleFont, rcPage, rc, false);

// いくつかのテーブルをレンダリングします
RenderTable(word, rc, rcPage, ds.Tables["Customers"], new string[]
{ "CompanyName", "ContactName", "Country", "Address", "Phone" });

テーブルのコンテンツのフォントを選択し、テーブルを構築するには、次のコードを使用できます。

' フォントを選択します
Dim hdrFont As New Font("Tahoma", 10, RtfFontStyle.Bold)
Dim txtFont As New Font("Tahoma", 8)

' テーブルを構築します
'word.AddBookmark(table.TableName, 0, rc.Y);
rc = WordUtils.RenderParagraph(word, "NorthWind " + table.TableName, hdrFont, rcPage, rc, False)

' テーブルを構築します
rc = RenderTableHeader(word, hdrFont, rc, fields)
For Each dr As DataRow In table.Rows
        rc = RenderTableRow(word, txtFont, hdrFont, rcPage, rc, fields, _
                dr)
Next

' 終了
Return rc
// フォントを選択します
Font hdrFont = new Font("Tahoma", 10, RtfFontStyle.Bold);
Font txtFont = new Font("Tahoma", 8);

// テーブルを構築します
//word.AddBookmark(table.TableName, 0, rc.Y);
rc = WordUtils.RenderParagraph(word, "NorthWind " + table.TableName, hdrFont, rcPage, rc, false);

// テーブルを構築します
rc = RenderTableHeader(word, hdrFont, rc, fields);
foreach (DataRow dr in table.Rows)
{
     rc = RenderTableRow(word, txtFont, hdrFont, rcPage, rc, fields, dr);
}

// 終了
return rc;

テーブルを構築したら、次のコードを使用して、テーブルヘッダーと行のセルの高さと幅を計算し、それらをレンダリングする必要があります。

Private Shared Function RenderTableHeader(word As C1WordDocument, font As Font, rc As Rect, fields As String()) As Rect
        ' セルの幅を計算します(すべての列で同じ)
        Dim rcCell As Rect = rc
        rcCell.Width = rc.Width / fields.Length
        rcCell.Height = 0

        ' セルの高さを計算します(すべての列の最大値)
        For Each field As String In fields
                Dim height = word.MeasureString(field, font, rcCell.Width).Height
                rcCell.Height = Math.Max(rcCell.Height, height)
        Next
        rcCell.Height += 6
        ' 6 ポイントのマージンを追加します
        ' ヘッダーセルをレンダリングします
        Dim fmt = New StringFormat()
        fmt.LineAlignment = VerticalAlignment.Center
        For Each field As String In fields
                word.FillRectangle(Colors.Black, rcCell)
                word.DrawString(field, font, Colors.White, rcCell, fmt)
                rcCell = WordUtils.Offset(rcCell, rcCell.Width, 0)
        Next

        ' 四角形を更新して返します
        Return WordUtils.Offset(rc, 0, rcCell.Height)
End Function

Private Shared Function RenderTableRow(word As C1WordDocument, font As Font, hdrFont As Font, rcPage As Rect, rc As Rect, fields As String(), _
        dr As DataRow) As Rect
        ' セルの幅を計算します(すべての列で同じ)
        Dim rcCell As Rect = rc
        rcCell.Width = rc.Width / fields.Length
        rcCell.Height = 0

        ' セルの高さを計算します(すべての列の最大値)
        rcCell = WordUtils.Inflate(rcCell, -4, 0)
        For Each field As String In fields
                Dim text As String = dr(field).ToString()
                Dim height = word.MeasureString(text, font, rcCell.Width).Height
                rcCell.Height = Math.Max(rcCell.Height, height)
        Next
        rcCell = WordUtils.Inflate(rcCell, 4, 0)
        ' 4 ポイントのマージンを追加します
        rcCell.Height += 2

        ' 必要なら、改行します
        If rcCell.Bottom > rcPage.Bottom Then
                word.PageBreak()
                rc = RenderTableHeader(word, hdrFont, rcPage, fields)
                rcCell.Y = rc.Y
        End If

        ' 垂直方向に中央揃えにします
        Dim fmt As New StringFormat()
        fmt.LineAlignment = VerticalAlignment.Center

        ' データセルをレンダリングします
        For Each field As String In fields

                ' コンテンツを取得します
                Dim text As String = dr(field).ToString()

                ' 水平方向の配置を設定します
                Dim d As Double
                fmt.Alignment = If((Double.TryParse(text, NumberStyles.Any, CultureInfo.CurrentCulture, d)), HorizontalAlignment.Right, HorizontalAlignment.Left)

                ' セルをレンダリングします
                word.DrawRectangle(Colors.LightGray, rcCell)
                rcCell = WordUtils.Inflate(rcCell, -4, 0)
                word.DrawString(text, font, Colors.Black, rcCell, fmt)
                rcCell = WordUtils.Inflate(rcCell, 4, 0)
                rcCell = WordUtils.Offset(rcCell, rcCell.Width, 0)
        Next

        ' 四角形を更新して返します
        Return WordUtils.Offset(rc, 0, rcCell.Height)
End Function
static Rect RenderTableHeader(C1WordDocument word, Font font, Rect rc, string[] fields)
{
// セルの幅を計算します(すべての列で同じ)
Rect rcCell = rc;
rcCell.Width = rc.Width / fields.Length;
rcCell.Height = 0;

// セルの高さを計算します(すべての列の最大値)
foreach (string field in fields)
{
     var height = word.MeasureString(field, font, rcCell.Width).Height;
     rcCell.Height = Math.Max(rcCell.Height, height);
}
rcCell.Height += 6; // 6 ポイントのマージンを追加します

// ヘッダーセルをレンダリングします
var fmt = new StringFormat();
fmt.LineAlignment = VerticalAlignment.Center;
foreach (string field in fields)
{
     word.FillRectangle(Colors.Black, rcCell);
     word.DrawString(field, font, Colors.White, rcCell, fmt);
     rcCell = WordUtils.Offset(rcCell, rcCell.Width, 0);
}

// 四角形を更新して返します
      return WordUtils.Offset(rc, 0, rcCell.Height);
}

static Rect RenderTableRow(C1WordDocument word, Font font, Font hdrFont, Rect rcPage, Rect rc, string[] fields, DataRow dr)
{
// セルの幅を計算します(すべての列で同じ)
Rect rcCell = rc;
rcCell.Width = rc.Width / fields.Length;
rcCell.Height = 0;

// セルの高さを計算します(すべての列の最大値)
rcCell = WordUtils.Inflate(rcCell, -4, 0);
foreach (string field in fields)
{
     string text = dr[field].ToString();
     var height = word.MeasureString(text, font, rcCell.Width).Height;
     rcCell.Height = Math.Max(rcCell.Height, height);
}
rcCell = WordUtils.Inflate(rcCell, 4, 0); // 4 ポイントのマージンを追加します
rcCell.Height += 2;

// 必要なら、改行します
if (rcCell.Bottom > rcPage.Bottom)
{
     word.PageBreak();
     rc = RenderTableHeader(word, hdrFont, rcPage, fields);
     rcCell.Y = rc.Y;
}

// 垂直方向に中央揃えにします
StringFormat fmt = new StringFormat();
fmt.LineAlignment = VerticalAlignment.Center;

// データセルをレンダリングします
foreach (string field in fields)
{
     
        // コンテンツを取得します
    string text = dr[field].ToString();

    // 水平方向の配置を設定します
    double d;
    fmt.Alignment = (double.TryParse(text, NumberStyles.Any, CultureInfo.CurrentCulture, out d))
    ? HorizontalAlignment.Right
    : HorizontalAlignment.Left;

// セルをレンダリングします
word.DrawRectangle(Colors.LightGray, rcCell);
rcCell = WordUtils.Inflate(rcCell, -4, 0);
word.DrawString(text, font, Colors.Black, rcCell, fmt);
rcCell = WordUtils.Inflate(rcCell, 4, 0);
rcCell = WordUtils.Offset(rcCell, rcCell.Width, 0);
}

// 四角形を更新して返します
return WordUtils.Offset(rc, 0, rcCell.Height);
}

上記のコードは Nwind データベースから取得した情報に基づき、適切なインデントと配置を使用して Word ドキュメントにテーブルを作成します。

上記のコードの出力は、次の図のようになります。