Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

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

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

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

フォームのデザイン

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

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

著者プロフィール

  • 瀬戸 遥(セト ハルカ)

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

バックナンバー

連載:ComponentZine(ComponentOne Studio)

もっと読む

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