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 ドキュメントにテーブルを作成します。
上記のコードの出力は、次の図のようになります。