はじめに
前回は、XLS for .NETコンポーネントを使って、フォームからExcelのブックを開いてデータを読み込んだり、書き込んだりするアプリケーションを作成しました。
今回は、テキストボックスに入力されたデータを、ラベルの文字とともにExcel形式のブックに保存するアプリケーションを作ってみました。この時、セルの背景色や文字色、高さや幅の調節、罫線の設定を行うようにしています。


対象読者
Visual Basic 2005・2008、Visual C# 2005・2008を使ってプログラムを作ったことのある人。
必要な環境
Visual Basic 2005・2008またはVisual C# 2005・2008、Visual Studio 2005・2008でプログラムが作れる環境。
.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。なお、本プログラムはWindows Vista上で動作するVisual Studioを使用して作成し、動作確認を行っています。
サンプルプログラム実行時の注意事項
本稿の実行ファイル(バイナリファイル)を動かすには、zipファイルに同梱してある以下のファイルが必要になります。
- C1.C1Excel.2.dll…C1Excelコントロール(Visual Studio 2005/2008用)
このファイルを実行プログラムと同じフォルダに格納します。.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。
コントロールのインストール
はじめてXLS for .NETコンポーネントを使用する方は、プロジェクトにComponentOne Studio 2008Jのいずれかのエディション(Enterprise/for Windows Forms/for ASP.NET)をインストールする必要があります。
インストーラは、グレープシティのWebページからダウンロードできますので、ここからダウンロードしてインストールしてください。製品ページの[申込フォーム]をクリックし、必要な情報を入力して送信すると、ダウンロードのURLが記載されたメールが送られてきますので、そこからダウンロードできます。
有償のコンポーネントですが、プロダクトキーを入力せずにインストールすることで、トライアル版として使用できます。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
コントロールの追加
ComponentOne Studio Enterprise 2008Jをインストールしたら、ツールボックスに専用のタブを作成し、XLS for .NETコンポーネントとFlexGrid for .NETコンポーネントを追加します。
追加するコンポーネントは、「.NET Frameworkコントロール」の「名前空間」が「C1.C1.Excel」で始まる名前空間のコンポーネント「C1XLBook」です。
フォームのデザイン
フォームは、Label、TextBox、Buttonコントロール、C1XLBookコンポーネントで構成します。C1XLBookコンポーネントは、プロセスを提供するコンポーネントのため、ユーザーとの対話機能は持ちませんので、フォームの外に配置されます。Excelのブックにアクセスする機能はすべてコードから行います。
なお、説明の都合上、LabelとTextBoxはフォームのLoadイベントハンドラであらかじめデータを入力しています。C1XLBookコンポーネントの特徴や機能については、前回の記事を参照ください。

データの転送
このプログラムでは、ボタン「書き出し」をクリックすると、Labelの文字とTextBoxの入力データをExcel形式のブックに保存します。
データの転送はとても簡単で、前回行ったようにワークシート「Sheet1」をXLSheetオブジェクトのインスタンスとして作成し、行列番号を指定してデータをセルに入力していくだけです。セルの行列番号はいわゆる「セルA1」が(0, 0)となり、最初の引数が行番号、2番目の引数が列番号になります。
ブックは、毎回新しいブックを作成し、ファイル名を付けて上書き保存します。ファイルのパス名は適当に合わせてください。
Imports C1.C1Excel Public Class Form1 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Label3.Text = "りんご" Label4.Text = "バナナ" Label5.Text = "ミカン" Label6.Text = "イチゴ" Label7.Text = "パパイヤ" Label8.Text = "メロン" TextBox1.Text = "100" TextBox2.Text = "200" TextBox3.Text = "300" TextBox4.Text = "400" TextBox5.Text = "500" TextBox6.Text = "600" End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim wb As New C1XLBook() Dim sheet1 As XLSheet = wb.Sheets(0) 'データの書き出し sheet1(0, 0).Value = "品名" sheet1(0, 1).Value = "数量" sheet1(1, 0).Value = Label3.Text sheet1(2, 0).Value = Label4.Text sheet1(3, 0).Value = Label5.Text sheet1(4, 0).Value = Label6.Text sheet1(5, 0).Value = Label7.Text sheet1(6, 0).Value = Label8.Text sheet1(1, 1).Value = CInt(TextBox1.Text) sheet1(2, 1).Value = CInt(TextBox2.Text) sheet1(3, 1).Value = CInt(TextBox3.Text) sheet1(4, 1).Value = CInt(TextBox4.Text) sheet1(5, 1).Value = CInt(TextBox5.Text) sheet1(6, 1).Value = CInt(TextBox6.Text) 'ブックの保存とExcelの起動 wb.Save("c:\data\グリッドデータ.xls") System.Diagnostics.Process.Start("c:\data\グリッドデータ.xls") End Sub End Class
using C1.C1Excel; namespace myxls_cs { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { label3.Text = "りんご"; label4.Text = "バナナ"; label5.Text = "ミカン"; label6.Text = "イチゴ"; label7.Text = "パパイヤ"; label8.Text = "メロン"; textBox1.Text = "100"; textBox2.Text = "200"; textBox3.Text = "300"; textBox4.Text = "400"; textBox5.Text = "500"; textBox6.Text = "600"; } private void button1_Click(object sender, EventArgs e) { C1XLBook wb = new C1XLBook(); XLSheet sheet1 = wb.Sheets["Sheet1"]; //データの書き出し sheet1[0, 0].Value = "品名"; sheet1[0, 1].Value = "数量"; sheet1[1, 0].Value = label3.Text; sheet1[2, 0].Value = label4.Text; sheet1[3, 0].Value = label5.Text; sheet1[4, 0].Value = label6.Text; sheet1[5, 0].Value = label7.Text; sheet1[6, 0].Value = label8.Text; sheet1[1, 1].Value = int.Parse(textBox1.Text); sheet1[2, 1].Value = int.Parse(textBox2.Text); sheet1[3, 1].Value = int.Parse(textBox3.Text); sheet1[4, 1].Value = int.Parse(textBox4.Text); sheet1[5, 1].Value = int.Parse(textBox5.Text); sheet1[6, 1].Value = int.Parse(textBox6.Text); //ブックの保存とExcelの起動 wb.Save("c:/data/グリッドデータ.xls"); System.Diagnostics.Process.Start("c:/data/グリッドデータ.xls"); } }
XLStyleクラスのインスタンスの作成
今回は、セルのスタイルを設定しています。XLStyleというオブジェクトを作成し、このオブジェクトのプロパティを使って文字色やセルの塗りつぶし色、罫線の設定を行い、XLStyleオブジェクトをセルに適用するという方法です。セルのスタイルはセル単位で設定し、列幅の設定は列単位で行うようにします。これらの処理は、データ転送のClickイベントハンドラの中で行い、データの書き出しを行うコードの前に記述します。
データを取り出す処理
作成するスタイルは2つで、各列ごとに文字色と背景色を変えます。
まず、XLStyleクラスのコンストラクタを使って、インスタンスを作成します。引数は、スタイルを設定するC1XLBookオブジェクトです。そして、XLStyleクラスのプロパティを使用してセルのスタイルを設定します。
罫線を設定する場合は、SetBorderStyleメソッドを使用すると、一括して罫線を設定できます。引数には、罫線の線種を表すXLLineStyleEnum列挙体のメンバを指定します。罫線の色はSetBorderColorメソッドで設定します。引数は罫線の色を表すColorクラスのメンバです。
ここでは、セルの塗りつぶしと文字色が違う2種類のXLStyleオブジェクトを作成します。
'セルのスタイルと罫線の設定 Dim style1 As New XLStyle(C1XLBook1) style1.ForeColor = Color.Yellow style1.BackColor = Color.Blue style1.SetBorderStyle(XLLineStyleEnum.Thin) style1.SetBorderColor(Color.Cyan) Dim style2 As New XLStyle(C1XLBook1) style2.ForeColor = Color.Black style2.BackColor = Color.LightSalmon style2.SetBorderStyle(XLLineStyleEnum.Thin) style2.SetBorderColor(Color.Cyan)
//セルのスタイルと罫線の設定 XLStyle style1 = new XLStyle(c1XLBook1); style1.ForeColor = Color.Yellow; style1.BackColor = Color.Blue; style1.SetBorderStyle(XLLineStyleEnum.Thin); style1.SetBorderColor(Color.Cyan); XLStyle style2 = new XLStyle(c1XLBook1); style2.ForeColor = Color.Black; style2.BackColor = Color.LightSalmon; style2.SetBorderStyle(XLLineStyleEnum.Thin); style2.SetBorderColor(Color.Cyan);
セルのサイズの調節とスタイルの設定
セルの列幅は、個別のセルには設定できず列単位の設定になります。XLSheetクラスのColumnsプロパティを使うと、列全体をオブジェクトとして指定でき、Widthプロパティで列幅を設定できます(単位はTwips(1/20 point)なので、数字が大きくなっています)。
セルの高さは、行単位で設定します。同じくXLSheetクラスのRowsプロパティを使うと、行全体をオブジェクトとして指定でき、Heightプロパティで高さを設定できます(同じく単位はTwips(1/20 point))。
また、作成したXLStyleオブジェクトは各セル単位で指定できます。これは、セルを行列番号で指定し、Styleプロパティに作成したXLStyleオブジェクトを設定するだけで可能です。ここでは1列目と2列目のセルに、それぞれのXLStyleオブジェクトを設定しています。
sheet1.Columns(0).Width = 1300 Dim i As Integer For i = 1 To 6 sheet1.Rows(i).Height = 400 sheet1(i, 0).Style = style1 sheet1(i, 1).Style = style2 Next
sheet1.Columns[0].Width = 1300; for(int i=1;i<=6;i++){ sheet1.Rows[i].Height = 400; sheet1[i, 0].Style = style1; sheet1[i, 1].Style = style2; }


Clickイベントハンドラのコード全文
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim wb As New C1XLBook() Dim sheet1 As XLSheet = wb.Sheets(0) 'セルのスタイルと罫線の設定 Dim style1 As New XLStyle(C1XLBook1) style1.ForeColor = Color.Yellow style1.BackColor = Color.Blue style1.SetBorderStyle(XLLineStyleEnum.Thin) style1.SetBorderColor(Color.Cyan) Dim style2 As New XLStyle(C1XLBook1) style2.ForeColor = Color.Black style2.BackColor = Color.LightSalmon style2.SetBorderStyle(XLLineStyleEnum.Thin) style2.SetBorderColor(Color.Cyan) sheet1.Columns(0).Width = 1300 Dim i As Integer For i = 1 To 6 sheet1.Rows(i).Height = 400 sheet1(i, 0).Style = style1 sheet1(i, 1).Style = style2 Next 'データの書き出し sheet1(0, 0).Value = "品名" sheet1(0, 1).Value = "数量" sheet1(1, 0).Value = Label3.Text sheet1(2, 0).Value = Label4.Text sheet1(3, 0).Value = Label5.Text sheet1(4, 0).Value = Label6.Text sheet1(5, 0).Value = Label7.Text sheet1(6, 0).Value = Label8.Text sheet1(1, 1).Value = CInt(TextBox1.Text) sheet1(2, 1).Value = CInt(TextBox2.Text) sheet1(3, 1).Value = CInt(TextBox3.Text) sheet1(4, 1).Value = CInt(TextBox4.Text) sheet1(5, 1).Value = CInt(TextBox5.Text) sheet1(6, 1).Value = CInt(TextBox6.Text) 'ブックの保存とExcelの起動 wb.Save("c:\data\グリッドデータ.xls") System.Diagnostics.Process.Start("c:\data\グリッドデータ.xls") End Sub End Class
private void button1_Click(object sender, EventArgs e) { C1XLBook wb = new C1XLBook(); XLSheet sheet1 = wb.Sheets["Sheet1"]; //セルのスタイルと罫線の設定 XLStyle style1 = new XLStyle(c1XLBook1); style1.ForeColor = Color.Yellow; style1.BackColor = Color.Blue; style1.SetBorderStyle(XLLineStyleEnum.Thin); style1.SetBorderColor(Color.Cyan); XLStyle style2 = new XLStyle(c1XLBook1); style2.ForeColor = Color.Black; style2.BackColor = Color.LightSalmon; style2.SetBorderStyle(XLLineStyleEnum.Thin); style2.SetBorderColor(Color.Cyan); sheet1.Columns[0].Width = 1300; for(int i=1;i<=6;i++){ sheet1.Rows[i].Height = 400; sheet1[i, 0].Style = style1; sheet1[i, 1].Style = style2; } //データの書き出し sheet1[0, 0].Value = "品名"; sheet1[0, 1].Value = "数量"; sheet1[1, 0].Value = label3.Text; sheet1[2, 0].Value = label4.Text; sheet1[3, 0].Value = label5.Text; sheet1[4, 0].Value = label6.Text; sheet1[5, 0].Value = label7.Text; sheet1[6, 0].Value = label8.Text; sheet1[1, 1].Value = int.Parse(textBox1.Text); sheet1[2, 1].Value = int.Parse(textBox2.Text); sheet1[3, 1].Value = int.Parse(textBox3.Text); sheet1[4, 1].Value = int.Parse(textBox4.Text); sheet1[5, 1].Value = int.Parse(textBox5.Text); sheet1[6, 1].Value = int.Parse(textBox6.Text); //ブックの保存とExcelの起動 wb.Save("c:/data/グリッドデータ.xls"); System.Diagnostics.Process.Start("c:/data/グリッドデータ.xls"); } } }
まとめ
C1XLBookコンポーネントでは、ただ単にデータをExcel形式で保存できるだけでなく、セルの書式設定や罫線の作成までもプログラム側で行うことができます。
計測プログラムや独自のデータ入力アプリケーションを作成する場合、データをファイルに保存するのはかなり手間のかかる作業です。また、データファイルを市販のアプリケーションと互換性を持たせようとすると、CSV形式など見づらいデータ形式になってしまいます。Excel形式でデータを保存できれば、Excelで読み書きできるようになるのはもちろんのこと、他のOfficeアプリケーションでAccessなどのデータベースファイルでも使えるデータファイルになります。