はじめに
VBAを使わずに、自作のプログラムで入力データをExcelのブック形式で保存する機能を持たせたいと思ったことはありませんか?
通常、Excelのデータをプログラムから操作する場合は、Excelのインスタンスを作成し、Excelのオブジェクトを使ってワークシートやセルを操作しますが、それにはExcelのオブジェクト構造とプロパティ・メソッドといったExcel VBAの知識が必要になります。
しかし、PowerTools XLS for .NETの「C1XLBook」コンポーネントを使うと、独自のクラスを使ってExcelのブックと同じ形式でデータを作成し保存する機能を組み込むことができます。しかも、動作するコンピュータにExcelがインストールされていなくても、このコンポーネントがあればいいのです。
そこで、今回はこのC1XLBookコンポーネントを使って、簡単なデータ入力プログラムを作成してみました。
対象読者
Visual Basic 2005またはVisual C# 2005を使ってプログラムを作ったことのある人。
必要な環境
Visual Basic 2005またはVisual C# 2005、Visual Studio 2005でプログラムが作れる環境。
プログラム実行時の注意事項
本稿の実行ファイル(バイナリファイル)を動かすには、zipファイルに同梱してある以下のファイルが必要になります。
- C1.C1Excel.2.dll…C1XLS コントロール(.NET Framework 2.0 用)
このファイルを、実行プログラムと同じフォルダに格納します。 .NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。
コンポーネントのインストール
はじめてPowerTools XLS for .NETコンポーネントを使用する方は、プロジェクトにComponentOne Studio 2007 WinForms Editionをインストールする必要があります。
インストーラは、グレープシティのWebページからダウンロードできますので、ここからダウンロードしてインストールしてください。製品ページ左側の[ダウンロード]-[トライアル版]をクリックし、ダウンロード方法([FTP]または[HTTP])を選択すれば入手できます。ファイルはLZH形式で圧縮されています。
有償のコンポーネントですが、プロダクトキーを入力せずにインストールすることで、トライアル版として使用できます。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
コントロールの追加
ComponentOne Studio 2007 WinForms Editionをインストールしたら、ツールボックスに専用のタブを作成し、PowerTools XLS for .NETコンポーネントを追加します。追加するコンポーネントは、「.NET Frameworkコンポーネント」の「名前空間」が「C1.C1Excel」で始まる名前空間のコンポーネント「C1XLBook」です。
Visual Studio 2005用コンポーネントは、アセンブリ名が「C1.C1Excel.2」と末尾に「.2」が付いているので、必ずアセンブリ名を確認しコンポーネントを選択してください。
GUIの作成
入力画面は、すべてVisual Studioの標準コントロールの、リストボックス、ラベル、テキストボックス、ボタンで組み立てています。
C1XLBookコンポーネントは、ユーザーとのインターフェースは持たず、プロセスだけを提供するコンポーネントなので、フォームの外に配置されます。
C1XLBookコンポーネントについて
C1XLBookコンポーネントは、Excelのブック形式のファイルを読み書きできるコンポーネントです。ファイルの読み書きには、Excel 8.0(Excel97)以降で採用されているBIFF8形式を利用しています。
ファイルの書き出しでは、Excelで開くことができる、ファイルの拡張子が「xls」のファイルを作成できます。また、ファイルの読み込みでは、複数のワークシートで構成されるxlsファイルにある、すべてのセルの内容と書式をそのままロードできるようになっています。ただし、セルの罫線やセルに設定された数式を読み込んだり、グラフなどの画像ファイルを読み書きすることができません。
C1XLBookコンポーネント(C1XLBookオブジェクト)は、1つのオブジェクトで1つのブックを表します。ブックには、複数のシート(XLSheetオブジェクト)で構成され、各シート内にはセル(XLCellオブジェクト)があります。
また、セルにはValue プロパティとStyleプロパティがあり、Valueプロパティはセルの値を格納し、StyleプロパティはXLStyleオブジェクトを使ってセルの書式を設定します。ブック形式での保存や読み込みは、C1XLBookオブジェクトのメソッドを使用して行います。
列見出しの作成
では、フォームに入力されたデータをExcelのブック形式(xlsファイル)で書き出す処理を作成します。
表の内容
入力データは、「品名」「数量」「単価」「合計」で、合計以外はユーザーからの入力を受け付け、合計は計算で導き出すようにします。データは下図のような表にします。見てわかるように、ブックには1枚のシートが追加され、行方向に入力データが追加されていきます。
列見出しは、フォントのスタイルを太字にし、文字色を青色にします。そして、A列から順番に「品名」「数量」「単価」「合計」を入力します。
列見出しの入力
フォームのLoadイベントハンドラで、列見出しを作成する処理を実行します。
まず、ブックにワークシートを1枚追加します。これは、C1XLBookオブジェクトのSheetsプロパティを使ってXLSheetsコレクション内のXLSheetオブジェクトを1つ、オブジェクト変数に格納します。
このワークシートは、C1XLBookを新規作成したときに自動的に作成されます。
Imports C1.C1Excel Public Class Form1 Dim sheet As XLSheet Dim rowpos As Integer = 0 Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load sheet = Me.C1XLBook1.Sheets(0)
using C1.C1Excel; namespace xlsapp_cs { public partial class Form1 : Form { XLSheet sheet; int rowpos = 0; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { sheet = c1XLBook1.Sheets[0];
次に、セルに列見出しの文字列を代入します。セルを操作する場合は、XlSheetオブジェクトのインデクサ(引数のようなもの)で、セルの行列番号を指定すると、その位置のXLCellオブジェクトを返してきます。番号は、ワークシートの先頭行(1行目)が0、先頭列(A列)が0から始まります。
最初は、セルA1と同じ位置のXLCellオブジェクトへの参照を作成し、その値に「品名」という文字を代入します。
Dim cell As XLCell = sheet(rowpos, 0) cell.Value = "品名"
XLCell cell = sheet[rowpos, 0];
cell.Value = "品名";
同じように、lSheetオブジェクトのインデクサの列番号を変えて、残りのセルに列見出しの文字列を代入します。
cell = sheet(rowpos, 1) cell.Value = "数量" cell = sheet(rowpos, 2) cell.Value = "単価" cell = sheet(rowpos, 3) cell.Value = "合計"
cell = sheet[rowpos, 1]; cell.Value = "数量"; cell = sheet[rowpos, 2]; cell.Value = "単価"; cell = sheet[rowpos, 3]; cell.Value = "合計";
セルの書式設定
列見出しを代入したら、この文字の書式を変更します。といっても、使い方は簡単です。
まず、XLStyleクラスのインスタンスを作成します。そして、Fontクラスのインスタンスを作成し、フォントの属性を設定します。また、文字色はXLStyleクラスのForeColorプロパティの値を変えるだけです。ここでは、フォントを「Arial」のサイズ「10」で「Bold」になるようにし、文字色を「Blue」に設定します。
Dim styleBlue As New XLStyle(Me.C1XLBook1) styleBlue.Font = New Font("Arial", 10, FontStyle.Bold) styleBlue.ForeColor = Color.Blue
XLStyle styleBlue = new XLStyle(c1XLBook1); styleBlue.Font = new Font("Arial", 10, FontStyle.Bold); styleBlue.ForeColor = Color.Blue;
XLStyleオブジェクトが作成できたら、XLCellオブジェクトのStylleプロパティにこのXLStyleオブジェクトを設定するだけです。
なお、変数「rowpos」は、データを入力する行番号を指定する変数です。
Dim i As Integer For i = 0 To 3 sheet(0, i).Style = styleBlue Next rowpos += 1
int i ; for(i=0;i <=3; i++){ sheet[0, i].Style = styleBlue; } rowpos += 1;
入力データの転送
「データ転送」ボタンのイベントハンドラで、各入力コントロールに入力されたデータをセルに転送する処理です。
これは、列見出しの文字列転送と同じように、XLSheetオブジェクトのインデクサでセル番地を指定し、データをValueプロパティに転送します。この時、ConvertクラスのToInt32メソッドで文字列を整数に変換しておきます。
また、現在何件のデータを入力したのかもフォームに表示するようにします。
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim data1 As Integer = 0 Dim data2 As Integer = 0 Dim cell As XLCell = sheet(rowpos, 0) cell.Value = Me.ListBox1.SelectedItem data1 = Convert.ToInt32(Me.TextBox1.Text) cell = sheet(rowpos, 1) cell.Value = data1 data2 = Convert.ToInt32(Me.TextBox2.Text) cell = sheet(rowpos, 2) cell.Value = data2 cell = sheet(rowpos, 3) cell.Value = data1 * data2 Me.Label5.Text = cell.Value Me.Label6.Text = "現在の入力件数:" & rowpos & " 件" rowpos += 1 End Sub
private void button1_Click(object sender, EventArgs e) { int data1 = 0; int data2 = 0; XLCell cell = sheet[rowpos, 0]; cell.Value = listBox1.SelectedItem; data1 = Convert.ToInt32(textBox1.Text); cell = sheet[rowpos, 1]; cell.Value = data1; data2 = Convert.ToInt32(textBox2.Text); cell = sheet[rowpos, 2]; cell.Value = data2; cell = sheet[rowpos, 3]; cell.Value = data1 * data2; label5.Text = cell.Value.ToString(); label6.Text = "現在の入力件数:" + rowpos.ToString() + " 件"; rowpos += 1; }
ブックを保存する処理
「保存して終了」ボタンのClickイベントハンドラで、ブック形式のファイルに保存する処理を実行します。
これは、C1XLBookオブジェクトのSaveメソッドを使用します。引数は、保存するファイル名とパス名です。
Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click Me.C1XLBook1.Save("c:\data\hello.xls") Me.Close() End Sub
private void button2_Click(object sender, EventArgs e) { c1XLBook1.Save("c:/data/hello.xls"); this.Close(); }
まとめ
自作のプログラムで取得したデータをExcelのブックに保存したいと思っているプログラマの方は多いと思います。
VBAがわかっていればExcelのオブジェクトを操作すればよいのですが、それでもアプリケーションが走るコンピュータにExcelがインストールされていなければなりません。C1XLBookコンポーネントは、コンポーネント自身でExcelのブック形式のファイルを読み書きしますので、VBAを覚える必要もないですし、アプリケーションが走るコンピュータにExcelがインストールされていなくても構いません。
今回は、データの書き出しを行いましたが、次回はxlsファイルからデータを読み出すアプリケーションを作成したいと思います。