はじめに
前回の記事では、C1PrintDocumentコントロールを使って、2つのテキストファイルの内容から文書ドキュメントを作成するアプリケーションを作成しました。今回はその続きとして、改ページとイメージ画像を挿入し、テキストファイルのデータをテーブルにして表示する方法を紹介します。
対象読者
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」です。
グラフィックスの描画について
C1PrintDocumentコントロールでは、すべてのコンテンツは描画オブジェクトによって表されます。さまざまなタイプのコンテンツを表すために、豊富な描画オブジェクト(RenderObjectクラスに基づく)が階層化されて提供されています。
特に、RenderGraphicsクラスは.NET FrameworkクラスライブラリのGraphicsクラスを使うことができるので、ドキュメント内にGDI+で図形を描画することもできます。次のコードは、ドキュメント内にFillEllipseメソッドで楕円を描画します。
Dim rg1 As New RenderGraphics() rg1.Graphics.FillEllipse(Brushes.Aqua, 100, 100, 50, 50)
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コレクションによって表され、行列番号を使ってアクセスできます。
Dim tc as TableCell = table1.Cells(10, 4)
TableCell tc = table1.Cells[10, 4];
テーブルのセル、列、および行は、表示オブジェクトではありませんが、表示オブジェクトのプロパティに類似したいくつかのプロパティを備えています。セルの背景色やフォント、文字色、枠線などの属性を設定するには、StyleプロパティやCellStyleプロパティを使用し、それぞれの属性に該当するプロパティを変更します。
table1.Cells(0, 1).CellStyle.BackColor = Color.BlueViolet table1.Cells(0, 1).Style.TextColor = Color.Beige
table1.Cells[0, 1].CellStyle.BackColor = Color.BlueViolet; table1.Cells[0, 1].Style.TextColor = Color.Beige;
また、デフォルトではテーブルにグリッド線はなく、その都度設定します。
作成されるテーブルのサイズですが、幅はドキュメントの幅と同じ幅になり、デフォルトではすべての列の幅が同じになります。行の高さは、セルに入力されるデータによって自動的に設定されます。もちろん、列幅や行の高さを任意のサイズに設定できますが、テーブル全体の幅はドキュメントの幅を超えることはありません。
アプリケーションの構成
では、さっそくアプリケーションを作成していきましょう。今回は、前回の記事で作成したプロジェクトにページを追加して図形描画とテーブルを作成するので、Windowsフォームに変更はありません。使用するコントロールは、C1PrintDocument/C1PrintPreviewControlコントロールだけです。
改ページの挿入
まず、ドキュメントに改ページを挿入して新しいページを追加し、そこにページのタイトルを図形描画で設定します。
改ページは、RenderObjectクラスの「BreakBefore」「BreakAfter」プロパティを使用します。「BreakBefore」プロパティはオブジェクトの前に、「BreakAfter」はオブジェクトの後ろにページ区切りを挿入します。各プロパティには、以下のBreakEnum列挙体のメンバを指定します。
メンバ名 | 値 | 説明 |
None | 0 | 区切りなし |
Page | 1 | 新しいページが開始されます |
Column | 2 | 新しい列が開始されます |
Line | 3 | インラインフローで新しい行が開始されます |
ここでは、空白のRenderTextオブジェクトを作成し、BreakBeforeプロパティを使ってこのオブジェクトの前にページ区切りを挿入します。設定値は、「BreakEnum.Page」です。次に、作成したRenderTextオブジェクトをドキュメントのBodyセクションに追加します。
'*************** 2ページ目を追加 *************************** 'ページ区切りの作成 Dim rt1 As New RenderText rt1.Text = "" rt1.BreakBefore = BreakEnum.Page Me.C1PrintDocument1.Body.Children.Add(rt1)
//*************** 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メソッドで見出しの文字を描画します。見出し文字は、楕円にかぶさるように配置します。
そして、前回の記事で紹介した方法で、テキストファイル「sample3.txt」の中身をドキュメントに流し込みます。
' グラフィックスを作成 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()
' 段落 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
// グラフィックスを作成 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メソッドでドキュメントを作成すればページのできあがりです。
' 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()
// 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行分繰り返します。
'*************** 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
//*************** 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行ずつ高さを指定していきます。
'グリッド線の追加 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)
//グリッド線の追加 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オブジェクトを設定していきます。
'セルにデータを入れる 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
//セルにデータを入れる 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セクションに追加し、ドキュメントを生成してできあがりです。
table1.Rows(0).CellStyle.BackColor = Color.BlueViolet table1.Rows(0).Style.TextColor = Color.Beige ' テーブルをドキュメントに追加 Me.C1PrintDocument1.Body.Children.Add(table1) Me.C1PrintDocument1.Generate()
//見出しのセルを塗りつぶす table1.Rows[0].CellStyle.BackColor = Color.BlueViolet; table1.Rows[0].Style.TextColor = Color.Beige; // テーブルをドキュメントに追加 c1PrintDocument1.Body.Children.Add(table1); c1PrintDocument1.Generate();
まとめ
テーブルはデータを分かりやすく見せるための常套手段です。特に、日本人は表組が大好きなようで、ドキュメント作成には欠かせないものになっています。
C1PrintDocumentコントロールは、このように簡単にテーブルを作成できます。列幅や行の高さの設定、セルの塗りつぶし、文字色、罫線設定などを自在に行うことができるので、独自のスタイルの表をドキュメントに組み込むことができます。
また、GDI+を使ったグラフィックス描画機能を使うことができるため、例えば角度の付いた文字やグラデーションブラシによる塗りつぶしなど、ドキュメントをグラフィックスで装飾する操作も自在に行えます。
アプリケーションにドキュメント作成機能を組み込みたいという方はぜひ、C1PrintDocumentコントロールの導入を検討してみてはいかがでしょうか。