フォームのデザイン
フォームは、標準コントロールで作成します。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); }