SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(ComponentOne)

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

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

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

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

この記事は参考になりましたか?

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

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3504 2009/01/28 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング