Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Excelブックを読み書きする.NET アプリケーションを作る

.NETコンポーネントを使ったExcelのブックを操作するアプリケーションの作成

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/01/28 14:00

PowerTools XLS for .NETコンポーネントは、Excelのブックを直接読み書きすることのできるコンポーネントで、Visual C#でも他のコントロールと同様のコードでブックやワークシート、セルを操作することができます。

はじめに

 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」です。

名前空間が「C1.C1Excel」で始まる名前空間のコンポーネント「C1XLBook」を選択する
名前空間が「C1.C1.Excel」で始まる名前空間のコンポーネント「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メソッドを使用します。引数は開くブック名のパスです。

Visual Basic
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
C#
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型の変数に格納します。

Visual Basic
Dim sheet1 As XLSheet = wb.Sheets("Sheet1")
C#
XLSheet sheet1 = wb.Sheets["Sheet1"];

 セルへのアクセスは、このオブジェクトの参照に()で行番号と列番号を「,」で区切って指定します。

sheet1(行番号, 列番号)

 行列番号は、1行目が「0」、1列目が「0」から始まります。従って、セルA1は(0, 0)となります。

セルを参照する際の行列番号
セルを参照する際の行列番号

 セルのデータは、Valueプロパティに格納されるので、このプロパティを参照して取り出します。

 ここでは、Do...Whileステートメントを使用して、A列のデータを空白のセルに出会うまで順番に取り出してListBoxコントロールに組み込みます。

data = sheet1(i, 0).Value

 また、この後の処理でデータをワークシートに追加したときに、もう一度ブックを読み込みなおすために、このイベントハンドラ内でもブックを読み込む処理を実行するようにしています。

A列のデータを空白のセルに出会うまで順番に取り出してListBoxコントロールに組み込む
A列のデータを空白のセルに出会うまで順番に取り出してListBoxコントロールに組み込む
Visual Basic
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
C#
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メソッドを使ってブックを上書き保存します。

Visual Basic
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
C#
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で表示したりグラフなどでさらにデータを加工できますので、データファイルの汎用性がぐっと高くなるのではないでしょうか。

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 瀬戸 遥(セト ハルカ)

    8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5