SHOEISHA iD

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

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

ComponentZine(ComponentOne)

入力データをExcelブック形式で保存する.NETアプリケーションを作る

PowerTools XLS for .NETコンポーネントでMicrosoft Excelファイルの書き込み機能を組み込む

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

フォームに入力したデータを、PowerTools XLS for .NETコンポーネントを使ってExcelのブック形式でファイルに保存するアプリケーションを作成します。

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

はじめに

 VBAを使わずに、自作のプログラムで入力データをExcelのブック形式で保存する機能を持たせたいと思ったことはありませんか?

 通常、Excelのデータをプログラムから操作する場合は、Excelのインスタンスを作成し、Excelのオブジェクトを使ってワークシートやセルを操作しますが、それにはExcelのオブジェクト構造とプロパティ・メソッドといったExcel VBAの知識が必要になります。

 しかし、PowerTools XLS for .NETの「C1XLBook」コンポーネントを使うと、独自のクラスを使ってExcelのブックと同じ形式でデータを作成し保存する機能を組み込むことができます。しかも、動作するコンピュータにExcelがインストールされていなくても、このコンポーネントがあればいいのです。

 そこで、今回はこのC1XLBookコンポーネントを使って、簡単なデータ入力プログラムを作成してみました。

フォームに入力したデータを
フォームに入力したデータを
Excelのブック形式で保存する
Excelのブック形式で保存する

対象読者

 Visual Basic 2005またはVisual C# 2005を使ってプログラムを作ったことのある人。

必要な環境

 Visual Basic 2005またはVisual C# 2005、Visual Studio 2005でプログラムが作れる環境。

プログラム実行時の注意事項

 本稿の実行ファイル(バイナリファイル)を動かすには、zipファイルに同梱してある以下のファイルが必要になります。

  • C1.C1Excel.2.dll…C1XLS コントロール(.NET Framework 2.0 用)

 このファイルを、実行プログラムと同じフォルダに格納します。 .NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。

コンポーネントのインストール

 はじめてPowerTools XLS for .NETコンポーネントを使用する方は、プロジェクトにComponentOne Studio 2007 WinForms Editionをインストールする必要があります。

 インストーラは、グレープシティのWebページからダウンロードできますので、ここからダウンロードしてインストールしてください。製品ページ左側の[ダウンロード]-[トライアル版]をクリックし、ダウンロード方法([FTP]または[HTTP])を選択すれば入手できます。ファイルはLZH形式で圧縮されています。

 有償のコンポーネントですが、プロダクトキーを入力せずにインストールすることで、トライアル版として使用できます。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。

コントロールの追加

 ComponentOne Studio 2007 WinForms Editionをインストールしたら、ツールボックスに専用のタブを作成し、PowerTools XLS for .NETコンポーネントを追加します。追加するコンポーネントは、「.NET Frameworkコンポーネント」の「名前空間」が「C1.C1Excel」で始まる名前空間のコンポーネント「C1XLBook」です。

「名前空間」が「C1.C1Excel」で始まる名前空間のコンポーネント「C1XLBook」を選択する
「名前空間」が「C1.C1Excel」で始まる名前空間のコンポーネント「C1XLBook」を選択する
注意
 Visual Studio .NET 2002/2003用コンポーネントとVisual Studio 2005用コンポーネントは、コンポーネント名や名前空間がほとんど同じですが、Visual Studio .NET 2002/2003用コンポーネントをVisual Studio 2005環境で使うことはできないので、間違えないようにしてください。
 Visual Studio 2005用コンポーネントは、アセンブリ名が「C1.C1Excel.2」と末尾に「.2」が付いているので、必ずアセンブリ名を確認しコンポーネントを選択してください。

GUIの作成

 入力画面は、すべてVisual Studioの標準コントロールの、リストボックス、ラベル、テキストボックス、ボタンで組み立てています。

 C1XLBookコンポーネントは、ユーザーとのインターフェースは持たず、プロセスだけを提供するコンポーネントなので、フォームの外に配置されます。

GUIデザイン
GUIデザイン

C1XLBookコンポーネントについて

 C1XLBookコンポーネントは、Excelのブック形式のファイルを読み書きできるコンポーネントです。ファイルの読み書きには、Excel 8.0(Excel97)以降で採用されているBIFF8形式を利用しています。

 ファイルの書き出しでは、Excelで開くことができる、ファイルの拡張子が「xls」のファイルを作成できます。また、ファイルの読み込みでは、複数のワークシートで構成されるxlsファイルにある、すべてのセルの内容と書式をそのままロードできるようになっています。ただし、セルの罫線やセルに設定された数式を読み込んだり、グラフなどの画像ファイルを読み書きすることができません。

 C1XLBookコンポーネント(C1XLBookオブジェクト)は、1つのオブジェクトで1つのブックを表します。ブックには、複数のシート(XLSheetオブジェクト)で構成され、各シート内にはセル(XLCellオブジェクト)があります。

 また、セルにはValue プロパティとStyleプロパティがあり、Valueプロパティはセルの値を格納し、StyleプロパティはXLStyleオブジェクトを使ってセルの書式を設定します。ブック形式での保存や読み込みは、C1XLBookオブジェクトのメソッドを使用して行います。

列見出しの作成

 では、フォームに入力されたデータをExcelのブック形式(xlsファイル)で書き出す処理を作成します。

表の内容

 入力データは、「品名」「数量」「単価」「合計」で、合計以外はユーザーからの入力を受け付け、合計は計算で導き出すようにします。データは下図のような表にします。見てわかるように、ブックには1枚のシートが追加され、行方向に入力データが追加されていきます。

 列見出しは、フォントのスタイルを太字にし、文字色を青色にします。そして、A列から順番に「品名」「数量」「単価」「合計」を入力します。

列見出しの入力

 フォームのLoadイベントハンドラで、列見出しを作成する処理を実行します。

 まず、ブックにワークシートを1枚追加します。これは、C1XLBookオブジェクトのSheetsプロパティを使ってXLSheetsコレクション内のXLSheetオブジェクトを1つ、オブジェクト変数に格納します。

 このワークシートは、C1XLBookを新規作成したときに自動的に作成されます。

Visual Basic
Imports C1.C1Excel

Public Class Form1
    Dim sheet As XLSheet
    Dim rowpos As Integer = 0

    Private Sub Form1_Load(ByVal sender As System.Object, _
                    ByVal e As System.EventArgs) Handles MyBase.Load
        sheet = Me.C1XLBook1.Sheets(0)
C#
using C1.C1Excel;

namespace xlsapp_cs
{
    public partial class Form1 : Form
    {
        XLSheet sheet;
        int rowpos = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            sheet = c1XLBook1.Sheets[0];

 次に、セルに列見出しの文字列を代入します。セルを操作する場合は、XlSheetオブジェクトのインデクサ(引数のようなもの)で、セルの行列番号を指定すると、その位置のXLCellオブジェクトを返してきます。番号は、ワークシートの先頭行(1行目)が0、先頭列(A列)が0から始まります。

 最初は、セルA1と同じ位置のXLCellオブジェクトへの参照を作成し、その値に「品名」という文字を代入します。

Visual Basic
Dim cell As XLCell = sheet(rowpos, 0)
cell.Value = "品名"
C#
XLCell cell = sheet[rowpos, 0];
cell.Value = "品名";

 同じように、lSheetオブジェクトのインデクサの列番号を変えて、残りのセルに列見出しの文字列を代入します。

Visual Basic
cell = sheet(rowpos, 1)
cell.Value = "数量"

cell = sheet(rowpos, 2)
cell.Value = "単価"

cell = sheet(rowpos, 3)
cell.Value = "合計"
C#
cell = sheet[rowpos, 1];
cell.Value = "数量";

cell = sheet[rowpos, 2];
cell.Value = "単価";

cell = sheet[rowpos, 3];
cell.Value = "合計";

セルの書式設定

 列見出しを代入したら、この文字の書式を変更します。といっても、使い方は簡単です。

 まず、XLStyleクラスのインスタンスを作成します。そして、Fontクラスのインスタンスを作成し、フォントの属性を設定します。また、文字色はXLStyleクラスのForeColorプロパティの値を変えるだけです。ここでは、フォントを「Arial」のサイズ「10」で「Bold」になるようにし、文字色を「Blue」に設定します。

Visual Basic
Dim styleBlue As New XLStyle(Me.C1XLBook1)

styleBlue.Font = New Font("Arial", 10, FontStyle.Bold)
styleBlue.ForeColor = Color.Blue
C#
XLStyle styleBlue = new XLStyle(c1XLBook1);

styleBlue.Font = new Font("Arial", 10, FontStyle.Bold);
styleBlue.ForeColor = Color.Blue;

 XLStyleオブジェクトが作成できたら、XLCellオブジェクトのStylleプロパティにこのXLStyleオブジェクトを設定するだけです。

 なお、変数「rowpos」は、データを入力する行番号を指定する変数です。

Visual Basic
Dim i As Integer
For i = 0 To 3
    sheet(0, i).Style = styleBlue
Next

rowpos += 1
C#
int i ;
for(i=0;i <=3; i++){
    sheet[0, i].Style = styleBlue;
}

rowpos += 1;

入力データの転送

 「データ転送」ボタンのイベントハンドラで、各入力コントロールに入力されたデータをセルに転送する処理です。

 これは、列見出しの文字列転送と同じように、XLSheetオブジェクトのインデクサでセル番地を指定し、データをValueプロパティに転送します。この時、ConvertクラスのToInt32メソッドで文字列を整数に変換しておきます。

 また、現在何件のデータを入力したのかもフォームに表示するようにします。

Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, _
               ByVal e As System.EventArgs) Handles Button1.Click
    Dim data1 As Integer = 0
    Dim data2 As Integer = 0

    Dim cell As XLCell = sheet(rowpos, 0)

    cell.Value = Me.ListBox1.SelectedItem

    data1 = Convert.ToInt32(Me.TextBox1.Text)
    cell = sheet(rowpos, 1)
    cell.Value = data1

    data2 = Convert.ToInt32(Me.TextBox2.Text)
    cell = sheet(rowpos, 2)
    cell.Value = data2

    cell = sheet(rowpos, 3)
    cell.Value = data1 * data2

    Me.Label5.Text = cell.Value
    Me.Label6.Text = "現在の入力件数:" & rowpos & " 件"
    rowpos += 1
End Sub
C#
private void button1_Click(object sender, EventArgs e)
{
    int data1 = 0;
    int data2 = 0;

    XLCell cell = sheet[rowpos, 0];

    cell.Value = listBox1.SelectedItem;

    data1 = Convert.ToInt32(textBox1.Text);
    cell = sheet[rowpos, 1];
    cell.Value = data1;

    data2 = Convert.ToInt32(textBox2.Text);
    cell = sheet[rowpos, 2];
    cell.Value = data2;

    cell = sheet[rowpos, 3];
    cell.Value = data1 * data2;

    label5.Text = cell.Value.ToString();
    label6.Text = "現在の入力件数:" + rowpos.ToString() + " 件";
    rowpos += 1;
}

ブックを保存する処理

 「保存して終了」ボタンのClickイベントハンドラで、ブック形式のファイルに保存する処理を実行します。

 これは、C1XLBookオブジェクトのSaveメソッドを使用します。引数は、保存するファイル名とパス名です。

Visual Basic
Private Sub Button2_Click(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles Button2.Click
    Me.C1XLBook1.Save("c:\data\hello.xls")
    Me.Close()
End Sub
C#
private void button2_Click(object sender, EventArgs e)
{
    c1XLBook1.Save("c:/data/hello.xls");
    this.Close();
}

まとめ

 自作のプログラムで取得したデータをExcelのブックに保存したいと思っているプログラマの方は多いと思います。

 VBAがわかっていればExcelのオブジェクトを操作すればよいのですが、それでもアプリケーションが走るコンピュータにExcelがインストールされていなければなりません。C1XLBookコンポーネントは、コンポーネント自身でExcelのブック形式のファイルを読み書きしますので、VBAを覚える必要もないですし、アプリケーションが走るコンピュータにExcelがインストールされていなくても構いません。

 今回は、データの書き出しを行いましたが、次回はxlsファイルからデータを読み出すアプリケーションを作成したいと思います。

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

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

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

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1924 2008/06/24 15:07

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング