はじめに
Excelのブックを操作するプログラムを作成するには、Excelのインスタンスを作成し階層オブジェクトを操作する必要があります。これには、Excelのオブジェクト構造とクラスを理解していないとできない上に、VBAで操作するのを前提にクラスが定義されているため、Visual C#からExcelのオブジェクトを操作するには、Visual Basicよりも多くのコードを書かなければなりません。
PowerTools XLS for .NETコンポーネント(コントロール名C1XLBook)は、Excelのブックを直接読み書きすることのできるコンポーネントで、Visual C#でも他のコントロールと同様のコードでブックやワークシート、セルを操作できます。
今回は、このXLS for .NETコンポーネントを使って、フォームから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コンポーネントを追加します。追加するコンポーネントは、「.NET Frameworkコントロール」の「名前空間」が「C1.C1Excel」で始まる名前空間のコンポーネント「C1XLBook」です。
フォームのデザイン
フォームは、標準コントロールで作成します。C1XLBookコンポーネントは、プロセスを提供するコンポーネントで、ユーザーとの対話機能は持ちませんので、フォームの外に配置されます。Excelのブックにアクセスする機能は、すべてコードから行います。
C1XLBookコンポーネントとプログラムの機能
C1XLBookコンポーネントは、アプリケーションにMicrosoft Excelファイルの読み書き機能を追加するためのコンポーネントです。操作できるファイルフォーマットは、Excel97以降で採用されているBIFF8形式(ファイルの拡張子がxlsのブック)です。さらに、Excel 2007で使用されているOpen XML形式のファイル(ファイルの拡張子がxlsxのブック)も利用可能になっています。
このコンポーネントの利点は、ブックやワークシート、セルをコンポーネントのオブジェクト(クラス)で操作できることです。通常Excelのインスタンスを使う場合は、Excelを通してブックを開く操作をしますが、C1XLBookコンポーネントはExcelを使わずに直接ブックを開きます。従って、C1XLBookコンポーネントを使ったプログラムでは、Excelがコンピュータにインストールされていなくても、ブックを開いてデータを操作できます。
また、VBAに依存する形で作成されているExcelのオブジェクトモデルを操作する場合は、Visual Basicでは簡単ですがC#では特別なコード処理が必要になってきます。C1XLBookコンポーネントを使えば他のコンポーネントと同様に、C#の構文でコンポーネントに所属するクラスを使って処理を組み立てていくことができます。
今回作成するプログラムは、このC1XLBookコンポーネントを使ってサンプルのExcelブックを開き、ワークシートSheet1のA列に格納されているデータを取り出して、リストボックスに組み込む処理を実行します。また、テキストボックスに入力されたデータを、同じワークシートのA列にあるデータの最後に追加し、ブックを上書き保存する処理を実行します。
セルデータの読み込み
最初に、セルデータを読み込みリストボックスに組み込む処理を作成します。
前処理
ImportsまたはUsingで「C1.C1Excel」名前空間への参照を設定しておいてください。
また、2つの変数をクラス変数で宣言します。1つは、C1XLBookクラスのインスタンスへの参照を格納する変数で、もう1つはワークシートの行番号を格納する変数です。
そして、フォームのLoadイベントハンドラで、ブックを開きます。これは、C1XLBookクラスのLoadメソッドを使用します。引数は開くブック名のパスです。
Imports C1.C1Excel Public Class Form1 Private wb As New C1XLBook() Private i As Integer = 0 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load wb.Load("j:\data\winelist.xls") End Sub
using C1.C1Excel;
namespace myxls_cs
{
public partial class Form1 : Form
{
C1XLBook wb = new C1XLBook();
int i = 0;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
wb.Load("j:/data/winelist.xls");
}
データを取り出す処理
データを取り出しリストに組み込む処理を、「読み込み」ボタンのClickイベントハンドラに作成します。
まず、ワークシートにアクセスするための参照を作成します。開いたブックのワークシートは、「Sheets」コレクションと「Sheet」オブジェクトとして扱います。シートは、Sheetsプロパティの引数に0から始まるインデックス番号または、シート名を指定すると参照できますので、これをXLSheet型の変数に格納します。
Dim sheet1 As XLSheet = wb.Sheets("Sheet1")
XLSheet sheet1 = wb.Sheets["Sheet1"];
セルへのアクセスは、このオブジェクトの参照に()で行番号と列番号を「,」で区切って指定します。
sheet1(行番号, 列番号)
行列番号は、1行目が「0」、1列目が「0」から始まります。従って、セルA1は(0, 0)となります。
セルのデータは、Valueプロパティに格納されるので、このプロパティを参照して取り出します。
ここでは、Do...Whileステートメントを使用して、A列のデータを空白のセルに出会うまで順番に取り出してListBoxコントロールに組み込みます。
data = sheet1(i, 0).Value
また、この後の処理でデータをワークシートに追加したときに、もう一度ブックを読み込みなおすために、このイベントハンドラ内でもブックを読み込む処理を実行するようにしています。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim sheet1 As XLSheet = wb.Sheets("Sheet1") Dim data As String Me.ListBox1.Items.Clear() wb.Load("j:\data\winelist.xls") i = 1 Do i += 1 data = sheet1(i, 0).Value If data <> "" Then Me.ListBox1.Items.Add(data) End If Loop While data <> "" End Sub
private void button1_Click(object sender, EventArgs e) { XLSheet sheet1 = wb.Sheets["Sheet1"]; string data = ""; listBox1.Items.Clear(); wb.Load("j:/data/winelist.xls"); i = 1; do { i += 1; data = (String)sheet1[i, 0].Value; if (data != null) { listBox1.Items.Add(data); } } while (data != null); }
データの書き込み処理
C1XLBookコンポーネントは、ワークシートへのデータの書き込みもできます。このプログラムでは、TextBoxコントロールに入力されたデータを、ワークシートSheet1にあるデータの最後尾に追加するようにします。そのため、まず最初に「読み込み」ボタンを使ってワークシートSheet1のデータを読み込んでおく必要があります。
まず、ワークシートSheet1への参照を作成します。そして、データを書き込むセルを参照し、そのValueプロパティにTextBoxコントロールのTextプロパティの値を代入します。
なお、このプログラムでは、データの最後尾のセルの行番号は、変数iの値を使用しています。この変数には、データを読み込んだ時の最後の行番号の次の番号が格納されているので、これを使います。
もし、この変数iの値が0であれば、データの読み込みが行われていませんから、メッセージを表示して処理を終了します。
すでにデータが読み込まれていれば、TextBoxコントロールに入力されているデータをワークシートに書き込み、Saveメソッドを使ってブックを上書き保存します。
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sheet1 As XLSheet = wb.Sheets(0) If i = 0 Then MessageBox.Show("データを読み込んでください") Exit Sub End If sheet1(i, 0).Value = Me.TextBox1.Text wb.Save("j:\data\winelist.xls") End Sub
private void button2_Click(object sender, EventArgs e) { XLSheet sheet1 = wb.Sheets[0]; if(i == 0){ MessageBox.Show("データを読み込んでください"); return; } sheet1[i, 0].Value = textBox1.Text; wb.Save("j:/data/winelist.xls"); }
以上で、できあがりです。データを書き込んだら、もう一度「読み込み」ボタンを押すと、データが追加されていることを把握できます。
まとめ
C1XLBookコンポーネントは、VBAを使うことなくコンポーネントのクラスをVisual BasicやC#の構文で操作することができますから、VBAの知識がなくてもExcelのブックを操作できます。
プログラムのデータを、独自のファイルに保存するのではなくExcelのブック形式で保存できると、Excelで表示したりグラフなどでさらにデータを加工できますので、データファイルの汎用性がぐっと高くなるのではないでしょうか。