SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(ComponentOne)

テキストデータから印刷ドキュメントを作成する.NETアプリケーションに表機能を追加する

続・ComponentOne StudioのReports for Windows Formsを使ったWindowsアプリケーションの作成

  • このエントリーをはてなブックマークに追加

 前回の記事では、C1PrintDocumentコントロールを使って、2つのテキストファイルの内容から文書ドキュメントを作成するアプリケーションを作成してみました。今回は続きとして、改ページとイメージ画像を挿入し、テキストファイルのデータをテーブルにして表示してみます。

  • このエントリーをはてなブックマークに追加

はじめに

 前回の記事では、C1PrintDocumentコントロールを使って、2つのテキストファイルの内容から文書ドキュメントを作成するアプリケーションを作成しました。今回はその続きとして、改ページとイメージ画像を挿入し、テキストファイルのデータをテーブルにして表示する方法を紹介します。

次ページにGDI+のメソッドでグラフィックスを描画しイメージを組み込む
次ページにGDI+のメソッドでグラフィックスを描画しイメージを組み込む
テキストデータをテーブルにする
テキストデータをテーブルにする

対象読者

 Visual Basic/Visual C# 2005/2008/2010を使ってプログラムを作ったことのある人。

必要な環境

 Visual Basic 2005/2008/2010、Visual C# 2005/2008/2010、Visual Studio 2005/2008/2010でプログラムが作れる環境。なお、本プログラムはWindows Vista上で動作するVisual Studio 2008を使用して作成し、動作確認を行っています。

プログラム実行時の注意事項

 Reports for Windows Formsを使って作成したアプリケーションを配布する場合、Reports for Windows Formsのアセンブリファイルを添付する必要があります。これは、Common Language RuntimeのDLLをアプリケーションと一緒に配布するのと同じです。アプリケーションを正常に動作させるためには、次のファイルをインストールする必要があります。

ファイル名 説明
C1.C1Report.2.dll 本体アセンブリ
C1.Win.C1Report.2.dll 本体アセンブリ

 これらのファイルを、プログラムを実行するフォルダに格納します。.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。

※サンプルプログラム実行時の注意

 サンプルプログラムを実行する際は、次のデータファイルも一緒に実行プログラムと同じフォルダに入れてください。

  • sample.txt
  • sample2.txt
  • sample3.txt
  • sample.jpg
  • sample_data.txt

コンポーネントのインストール

 Reports for Windows Formsを使用する方は、Visual Studio、Visual Basic、Visual C#の開発環境にComponentOne Studio Enterprise 2010Jまたは、ComponentOne Studio for Windows Forms 2010Jをインストールする必要があります。

 インストーラは、グレープシティのWebページからダウンロードできます。製品ページの[申込フォーム]をクリックし、グレープシティのWebサイトへ必要情報を登録すると、添付トライアルライセンスキーファイルとダウンロードサイトを記載したE-Mailが送られるので、ここからダウンロードします。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。

※注意

 Reports for Windows FormsはComponentOne Studio Enterprise/for Windows Formsでのみ開発に利用できます。その他の製品ではReports for Windows Formsを開発に利用することはできないので注意してください。

コントロールの追加

 ComponentOne Studio Enterprise 2010J/ComponentOne Studio for Windows Forms 2010Jをインストールしたら、ツールボックスに専用のタブを作成し、使用するコントロールを追加します。追加するコンポーネントは、「.NET Frameworkコントロール」のアセンブリ名が「C1.Win.C1Report.2」で始まるコンポーネント「C1PrintPreviewControl」と「C1.C1Report.2」で始まるコンポーネント「C1PrintDocument」です。

アセンブリ名が「C1.Win.C1Report.2」「C1.C1Report.2」で始まるコンポーネント「C1PrintPreviewControl」「C1PrintDocument」を追加する
アセンブリ名が「C1.Win.C1Report.2」「C1.C1Report.2」で始まるコンポーネント「C1PrintPreviewControl」「C1PrintDocument」を追加する

グラフィックスの描画について

 C1PrintDocumentコントロールでは、すべてのコンテンツは描画オブジェクトによって表されます。さまざまなタイプのコンテンツを表すために、豊富な描画オブジェクト(RenderObjectクラスに基づく)が階層化されて提供されています。

 特に、RenderGraphicsクラスは.NET FrameworkクラスライブラリのGraphicsクラスを使うことができるので、ドキュメント内にGDI+で図形を描画することもできます。次のコードは、ドキュメント内にFillEllipseメソッドで楕円を描画します。

Visual Basic
Dim rg1 As New RenderGraphics()
rg1.Graphics.FillEllipse(Brushes.Aqua, 100, 100, 50, 50)
C#
RenderGraphics rg1 =  new RenderGraphics();
rg1.Graphics.FillEllipse(Brushes.Aqua, 100, 100, 50, 50);
描画オブジェクトの階層
オブジェクト 説明
RenderObject 階層全体の基本クラス
RenderArea 他のオブジェクトの汎用コンテナ
RenderToc 目次を表します
RenderC1Printable C1PrintDocumentにシームレスに挿入できる外部コントロールを表します
RenderEmpty 空の描画オブジェクト。ページ区切りなど、コンテンツをレンダリングする必要がない部分に便利なプレースホルダを提供します
RenderGraphics .NET Graphicsオブジェクト内の描画を表します
RenderImage 画像を表します
RenderInputBase 入力コントロール(ドキュメントに埋め込まれ、プレビューで表示/処理されるコントロール)の基本クラス
RenderInputButtonBase ボタン形式の入力コントロールの基本クラス
RenderInputCheckBox チェックボックスを表します
RenderInputRadioButton ラジオボタンを表します
RenderInputComboBox コンボボックスを表します
RenderInputText テキストボックスコントロールを表します
RenderRichText リッチテキストを表します
RenderShapeBase 図形(線、多角形など)の基本クラス
RenderLineBase 線および多角形の基本クラス
RenderLine 線を表します
RenderPolygon 多角形を表します
RenderRectangle 四角形を表します
RenderTable テーブルを表します
RenderTextBase テキストおよび段落オブジェクトの基本クラス
RenderParagraph 段落を表します。段落は、さまざまなスタイルのテキストフラグメントとインライン画像を含むことができます
RenderTocItem 目次に挿入される段落を表します
RenderText 単純な単一スタイルのテキストを表します

C1PrintDocumentコントロールのテーブル機能について

 C1PrintDocumentコントロールのテーブルは、ドキュメントを作成する際に最も便利な機能の1つで、論理的に無限の列数と行数を持つExcelスタイルのオブジェクトモデルをサポートします。

 テーブルを使うことでデータを表形式で表したり、イメージ画像や図形などドキュメント内の他の要素をレイアウトするために使用できます。テーブルはセルで構成され、テーブル内のすべてのセルはTableCellCollection型を持つCellsコレクションによって表され、行列番号を使ってアクセスできます。

Visual Basic
Dim tc as TableCell = table1.Cells(10, 4)
C#
TableCell tc = table1.Cells[10, 4];

 テーブルのセル、列、および行は、表示オブジェクトではありませんが、表示オブジェクトのプロパティに類似したいくつかのプロパティを備えています。セルの背景色やフォント、文字色、枠線などの属性を設定するには、StyleプロパティやCellStyleプロパティを使用し、それぞれの属性に該当するプロパティを変更します。

Visual Basic
table1.Cells(0, 1).CellStyle.BackColor = Color.BlueViolet
table1.Cells(0, 1).Style.TextColor = Color.Beige
C#
table1.Cells[0, 1].CellStyle.BackColor = Color.BlueViolet;
table1.Cells[0, 1].Style.TextColor = Color.Beige;

 また、デフォルトではテーブルにグリッド線はなく、その都度設定します。

 作成されるテーブルのサイズですが、幅はドキュメントの幅と同じ幅になり、デフォルトではすべての列の幅が同じになります。行の高さは、セルに入力されるデータによって自動的に設定されます。もちろん、列幅や行の高さを任意のサイズに設定できますが、テーブル全体の幅はドキュメントの幅を超えることはありません。

アプリケーションの構成

 では、さっそくアプリケーションを作成していきましょう。今回は、前回の記事で作成したプロジェクトにページを追加して図形描画とテーブルを作成するので、Windowsフォームに変更はありません。使用するコントロールは、C1PrintDocument/C1PrintPreviewControlコントロールだけです。

作成するWindowsフォーム
作成するWindowsフォーム

改ページの挿入

 まず、ドキュメントに改ページを挿入して新しいページを追加し、そこにページのタイトルを図形描画で設定します。

 改ページは、RenderObjectクラスの「BreakBefore」「BreakAfter」プロパティを使用します。「BreakBefore」プロパティはオブジェクトの前に、「BreakAfter」はオブジェクトの後ろにページ区切りを挿入します。各プロパティには、以下のBreakEnum列挙体のメンバを指定します。

BreakEnum列挙体のメンバ
メンバ名 説明
None 0 区切りなし
Page 1 新しいページが開始されます
Column 2 新しい列が開始されます
Line 3 インラインフローで新しい行が開始されます

 ここでは、空白のRenderTextオブジェクトを作成し、BreakBeforeプロパティを使ってこのオブジェクトの前にページ区切りを挿入します。設定値は、「BreakEnum.Page」です。次に、作成したRenderTextオブジェクトをドキュメントのBodyセクションに追加します。

Visual Basic
'*************** 2ページ目を追加 ***************************

'ページ区切りの作成
Dim rt1 As New RenderText
rt1.Text = ""
rt1.BreakBefore = BreakEnum.Page
Me.C1PrintDocument1.Body.Children.Add(rt1)
C#
//*************** 2ページ目を追加 **************************

//ページ区切りの作成
RenderText rt1 = new RenderText();
rt1.Text = "";
rt1.BreakBefore = BreakEnum.Page;
c1PrintDocument1.Body.Children.Add(rt1);

グラフィックスの描画

 続いて、ページのタイトルをグラフィックスメソッドで描画します。

 まず、RenderGraphicsクラスのコンストラクタを実行して、RenderGraphicsオブジェクトを作成します。次に、.NET FrameworkクラスライブラリのSystem.Drawing名前空間にあるGraphicsクラスの、FillEllipseメソッドで楕円を、DrawStringメソッドで見出しの文字を描画します。見出し文字は、楕円にかぶさるように配置します。

FillEllipseメソッドで楕円を、DrawStringメソッドで見出しの文字を描画する
FillEllipseメソッドで楕円を、DrawStringメソッドで見出しの文字を描画する

 そして、前回の記事で紹介した方法で、テキストファイル「sample3.txt」の中身をドキュメントに流し込みます。

Visual Basic
' グラフィックスを作成
C1PrintDocument1.StartDoc()
Dim rg1 As New RenderGraphics()
rg1.Graphics.FillEllipse(Brushes.Aqua, 100, 100, 50, 50)
rg1.Graphics.DrawString("ComponentOne ColorPicker for Silverlight について",
						New Font("MSゴシック", 14, FontStyle.Bold), Brushes.Blue, 120, 110)
C1PrintDocument1.EndDoc()
Visual Basic
' 段落 para3 を作成
Dim para3 As New RenderParagraph()
fname = Application.StartupPath & "\sample3.txt"
data = ""

'ファイルから文字列を読み込む
Try
    Dim sr As StreamReader = New StreamReader(fname, System.Text.Encoding.Default)
    Do
        data = sr.ReadLine()
        para3.Content.AddText(data)
    Loop Until data Is Nothing
    sr.Close()
Catch ex As Exception
    MessageBox.Show(ex.Message)
End Try
C#
// グラフィックスを作成
c1PrintDocument1.StartDoc();
RenderGraphics rg1 =  new RenderGraphics();
rg1.Graphics.FillEllipse(Brushes.Aqua, 100, 100, 50, 50);
rg1.Graphics.DrawString("ComponentOne ColorPicker for Silverlight について", 
                                    new Font("MSゴシック", 14, FontStyle.Bold), Brushes.Blue, 120, 110);
c1PrintDocument1.EndDoc();

// 段落 para3 を作成
RenderParagraph para3 =  new RenderParagraph();
fname = Application.StartupPath + "/sample3.txt";
data = "";

//ファイルから文字列を読み込む
try
{
    StreamReader sr = new StreamReader(fname, System.Text.Encoding.Default);
    while (data != null)
    {
        data = sr.ReadLine();
        para3.Content.AddText(data);
    }
sr.Close();
}
catch (Exception ex)
{
	MessageBox.Show(ex.Message);
}

イメージ画像の挿入

 続いて、ファイルにあるイメージ画像を読み込み、ドキュメントに挿入します。これは、RenderImageクラスをオブジェクト化し、Imageプロパティにファイルの画像を指定するだけです。作成したグラフィックス、段落、イメージをそれぞれBodyセクションに追加し、Generateメソッドでドキュメントを作成すればページのできあがりです。

Visual Basic
' RenderImage を作成します。
C1PrintDocument1.StartDoc()
Dim img As New RenderImage
fname = Application.StartupPath & "\sample.jpg"
img.Image = System.Drawing.Image.FromFile(fname)
img.Width = "100%"
C1PrintDocument1.EndDoc()

' 段落をドキュメントに追加
C1PrintDocument1.Body.Children.Add(rg1)
C1PrintDocument1.Body.Children.Add(para3)
C1PrintDocument1.Body.Children.Add(img)

C1PrintDocument1.Generate()
C#
// RenderImage を作成します。
c1PrintDocument1.StartDoc();
RenderImage img =  new RenderImage();
fname = Application.StartupPath + "/sample.jpg";
img.Image = System.Drawing.Image.FromFile(fname);
img.Width = "100%";
c1PrintDocument1.EndDoc();

// 段落をドキュメントに追加
c1PrintDocument1.Body.Children.Add(rg1);
c1PrintDocument1.Body.Children.Add(para3);
c1PrintDocument1.Body.Children.Add(img);

c1PrintDocument1.Generate();

テーブルの作成

 今度は新しいページを追加し、テーブル機能を使ってテキストデータを表にします。

 元データは「sample_data.txt」というファイルに格納してあり、「No」「メーカー名」「ギター名」という3種類のデータを1行ずつ改行して保存しています。データは、列見出しを含め全部で11行分あります。このデータを1行ずつ読み込み、3列11行の表を作成してそこに挿入します。

テキストファイルの元データ
テキストファイルの元データ
作成した表
作成した表

3列11行のテーブルの作成

 最初に空のセルを持ったテーブルを作成し、そこにテキストデータを読み込んでセルに挿入していきます。

 テーブルの作成は、RenderTableクラスのコンストラクタを実行し、RenderTextオブジェクトを作成して、テーブルのセルに追加します。この処理を3列11行分繰り返します。

Visual Basic
 '*************** 3ページ目を追加 **************************

'ページ区切りの作成
Dim rt2 As New RenderText
rt2.Text = ""
rt2.BreakBefore = BreakEnum.Page
Me.C1PrintDocument1.Body.Children.Add(rt2)

'テーブルの作成-3列11行
Dim table1 As RenderTable = New RenderTable(Me.C1PrintDocument1)

Dim row As Integer
Dim col As Integer

For row = 0 To 10
	For col = 0 To 2
        Dim celltext As RenderText = New RenderText(Me.C1PrintDocument1)
        ' 空のセルを追加
        table1.Cells(row, col).RenderObject = celltext
    Next
Next
C#
 //*************** 3ページ目を追加 *************************

//ページ区切りの作成
RenderText rt2 =  new RenderText();
rt2.Text = "";
rt2.BreakBefore = BreakEnum.Page;
c1PrintDocument1.Body.Children.Add(rt2);

//テーブルの作成-3列11行
RenderTable table1 = new RenderTable(c1PrintDocument1);

int row, col;

for(row=0; row<=10; row++)
{
    for(col=0; col<=2; col++)
    {
        RenderText celltext = new RenderText(c1PrintDocument1);
        // 空のセルを追加します
        table1.Cells[row, col].RenderObject = celltext;
    }
}

 これでテーブルは完成ですが、このままではプログラムを実行してもドキュメントに表示されないので、グリッド線を付けて表全体が見えるようにします。これは、Styleオブジェクトを取得し、GridLinesオブジェクトのAllプロパティに、LineDefオブジェクトを作成して設定します。

 また、テーブル作成の時点では3列とも同じセル幅なので、1列目のセルだけ幅を狭くします。これは、テーブルのColsプロパティで1列目(インデックス番号は0)を指定し、Widthプロパティを設定します。設定値の単位はUnitで、ここでは1cmの幅になるようにします。

 併せて、セルの高さも設定します。これは、Rowsプロパティで行を指定し、Heightプロパティを設定します。同じく設定値はUnitで、0.5cmの高さになるように指定しています。これを行数分実行し、1行ずつ高さを指定していきます。

Visual Basic
'グリッド線の追加
table1.Style.GridLines.All = New LineDef(Color.DarkGray)

'セルのサイズを設定
Dim i As Integer
For i = 0 To 10
    table1.Rows(i).Height = New Unit(0.5, UnitTypeEnum.Cm)
Next

table1.Cols(0).Width = New Unit(1, UnitTypeEnum.Cm)
C#
//グリッド線の追加
table1.Style.GridLines.All = new LineDef(Color.DarkGray);

//セルのサイズを設定
int i;
for(i=0; i<=10; i++)
{
    table1.Rows[i].Height = new Unit(0.5, UnitTypeEnum.Cm);
}

table1.Cols[0].Width = new Unit(1, UnitTypeEnum.Cm);
作成したテーブル
作成したテーブル

なお、高さや幅は次のように文字列を設定することも可能です。

table1.Rows(i).Height = “0.5cm”
table1.Cols(0).Width = “1cm”

セルにデータを入れる処理

 テーブルができたら、各セルにテキストデータを入れていきます。StreamReaderクラスを使ってテキストファイルから1行ずつ読み込み、左の列のセルから順番に行を変えながら挿入していきます。

 まず、RenderTextオブジェクトを作成します。そして、ファイルからデータを1行読み込んでこのオブジェクトのTextプロパティに代入します。Cellsプロパティの引数に行列番号を指定し、RenderObjectプロパティにRenderTextオブジェクトを代入します。これで、指定したセルにテキストデータを持ったRenderTextオブジェクトが設定されます。あとは、セルの位置を移動させながら、RenderTextオブジェクトを設定していきます。

Visual Basic
'セルにデータを入れる
fname = Application.StartupPath & "\sample_data.txt"
Try
    Dim sr As StreamReader = New StreamReader(fname, System.Text.Encoding.Default)
    For row = 0 To 10
        For col = 0 To 2
            Dim celltext As RenderText = New RenderText(Me.C1PrintDocument1)
            celltext.Text = sr.ReadLine()

            ' テキストを含むセルを追加
            table1.Cells(row, col).RenderObject = celltext
        Next
    Next
    sr.Close()
Catch ex As Exception
    MessageBox.Show(ex.Message)
End Try
C#
//セルにデータを入れる
fname = Application.StartupPath + "/sample_data.txt";
try
{
    StreamReader sr = new StreamReader(fname, System.Text.Encoding.Default);
    for(row=0; row<=10; row++)
    {
        for(col=0; col<=2; col++)
        {
            RenderText celltext = new RenderText(c1PrintDocument1);
            celltext.Text = sr.ReadLine();

            // テキストを含むセルを追加します。
            table1.Cells[row, col].RenderObject = celltext;
        }
    }
    sr.Close();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
セルにデータが入る
セルにデータが入る

見出し行の装飾

 最後に、見出しの行の文字色を変えます。見出しのセルを塗りつぶすには、Rowsプロパティで11行目全体のセルのスタイルを表すCellStyleオブジェクトを取得し、BackColorプロパティに色情報を設定します。セルの文字はRenderObjectプロパティでRenderTextオブジェクトを指定し、そのStyleオブジェクトを取得してTextColorプロパティに色情報を設定します。セルとセルの中にあるテキストは、それぞれ違うオブジェクトになっている点に注意してください。

見出し行の背景色と文字色が設定された
見出し行の背景色と文字色が設定された

 作成したテーブルをBodyセクションに追加し、ドキュメントを生成してできあがりです。

Visual Basic
table1.Rows(0).CellStyle.BackColor = Color.BlueViolet
table1.Rows(0).Style.TextColor = Color.Beige

' テーブルをドキュメントに追加
Me.C1PrintDocument1.Body.Children.Add(table1)
Me.C1PrintDocument1.Generate()
C#
//見出しのセルを塗りつぶす
table1.Rows[0].CellStyle.BackColor = Color.BlueViolet;
table1.Rows[0].Style.TextColor = Color.Beige;

// テーブルをドキュメントに追加
c1PrintDocument1.Body.Children.Add(table1);
c1PrintDocument1.Generate();

まとめ

 テーブルはデータを分かりやすく見せるための常套手段です。特に、日本人は表組が大好きなようで、ドキュメント作成には欠かせないものになっています。

 C1PrintDocumentコントロールは、このように簡単にテーブルを作成できます。列幅や行の高さの設定、セルの塗りつぶし、文字色、罫線設定などを自在に行うことができるので、独自のスタイルの表をドキュメントに組み込むことができます。

 また、GDI+を使ったグラフィックス描画機能を使うことができるため、例えば角度の付いた文字やグラデーションブラシによる塗りつぶしなど、ドキュメントをグラフィックスで装飾する操作も自在に行えます。

 アプリケーションにドキュメント作成機能を組み込みたいという方はぜひ、C1PrintDocumentコントロールの導入を検討してみてはいかがでしょうか。

製品情報

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5525 2010/10/26 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング