CodeZine(コードジン)

特集ページ一覧

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

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

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

 ComponentOne Studio Enterprise 2008Jに同梱されているFlexGridコンポーネントに入力されたデータを、Excel形式のブックに保存するアプリケーションを作ります。ワークシートでは、セルの背景色や文字色、高さや幅の調節、罫線の設定を行ってデータを保存します。

はじめに

 前回は、XLS for .NETコンポーネントを使って、フォームからExcelのブックを開いてデータを読み込んだり、書き込んだりするアプリケーションを作成しました。

 今回は、テキストボックスに入力されたデータを、ラベルの文字とともに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コンポーネントとFlexGrid for .NETコンポーネントを追加します。

 追加するコンポーネントは、「.NET Frameworkコントロール」の「名前空間」が「C1.C1.Excel」で始まる名前空間のコンポーネント「C1XLBook」です。

名前空間がC1.C1.Excelで始まる名前空間のコンポーネントC1XLBookを選択する
名前空間がC1.C1.Excelで始まる名前空間のコンポーネントC1XLBookを選択する

フォームのデザイン

 フォームは、Label、TextBox、Buttonコントロール、C1XLBookコンポーネントで構成します。C1XLBookコンポーネントは、プロセスを提供するコンポーネントのため、ユーザーとの対話機能は持ちませんので、フォームの外に配置されます。Excelのブックにアクセスする機能はすべてコードから行います。

 なお、説明の都合上、LabelとTextBoxはフォームのLoadイベントハンドラであらかじめデータを入力しています。C1XLBookコンポーネントの特徴や機能については、前回の記事を参照ください。

フォームのデザイン
フォームのデザイン

データの転送

 このプログラムでは、ボタン「書き出し」をクリックすると、Labelの文字とTextBoxの入力データをExcel形式のブックに保存します。

 データの転送はとても簡単で、前回行ったようにワークシート「Sheet1」をXLSheetオブジェクトのインスタンスとして作成し、行列番号を指定してデータをセルに入力していくだけです。セルの行列番号はいわゆる「セルA1」が(0, 0)となり、最初の引数が行番号、2番目の引数が列番号になります。

 ブックは、毎回新しいブックを作成し、ファイル名を付けて上書き保存します。ファイルのパス名は適当に合わせてください。

Visual Basic
Imports C1.C1Excel
Public Class Form1
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Label3.Text = "りんご"
        Label4.Text = "バナナ"
        Label5.Text = "ミカン"
        Label6.Text = "イチゴ"
        Label7.Text = "パパイヤ"
        Label8.Text = "メロン"

        TextBox1.Text = "100"
        TextBox2.Text = "200"
        TextBox3.Text = "300"
        TextBox4.Text = "400"
        TextBox5.Text = "500"
        TextBox6.Text = "600"
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim wb As New C1XLBook()
        Dim sheet1 As XLSheet = wb.Sheets(0)

        'データの書き出し
        sheet1(0, 0).Value = "品名"
        sheet1(0, 1).Value = "数量"

        sheet1(1, 0).Value = Label3.Text
        sheet1(2, 0).Value = Label4.Text
        sheet1(3, 0).Value = Label5.Text
        sheet1(4, 0).Value = Label6.Text
        sheet1(5, 0).Value = Label7.Text
        sheet1(6, 0).Value = Label8.Text

        sheet1(1, 1).Value = CInt(TextBox1.Text)
        sheet1(2, 1).Value = CInt(TextBox2.Text)
        sheet1(3, 1).Value = CInt(TextBox3.Text)
        sheet1(4, 1).Value = CInt(TextBox4.Text)
        sheet1(5, 1).Value = CInt(TextBox5.Text)
        sheet1(6, 1).Value = CInt(TextBox6.Text)

        'ブックの保存とExcelの起動
        wb.Save("c:\data\グリッドデータ.xls")
        System.Diagnostics.Process.Start("c:\data\グリッドデータ.xls")

    End Sub
End Class
C#
using C1.C1Excel;
namespace myxls_cs
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            label3.Text = "りんご";
            label4.Text = "バナナ";
            label5.Text = "ミカン";
            label6.Text = "イチゴ";
            label7.Text = "パパイヤ";
            label8.Text = "メロン";

            textBox1.Text = "100";
            textBox2.Text = "200";
            textBox3.Text = "300";
            textBox4.Text = "400";
            textBox5.Text = "500";
            textBox6.Text = "600"; 
        }

        private void button1_Click(object sender, EventArgs e)
        {
            C1XLBook wb = new C1XLBook();
            XLSheet sheet1 = wb.Sheets["Sheet1"];

           //データの書き出し
            sheet1[0, 0].Value = "品名";
            sheet1[0, 1].Value = "数量";

            sheet1[1, 0].Value = label3.Text;
            sheet1[2, 0].Value = label4.Text;
            sheet1[3, 0].Value = label5.Text;
            sheet1[4, 0].Value = label6.Text;
            sheet1[5, 0].Value = label7.Text;
            sheet1[6, 0].Value = label8.Text;

            sheet1[1, 1].Value = int.Parse(textBox1.Text);
            sheet1[2, 1].Value = int.Parse(textBox2.Text);
            sheet1[3, 1].Value = int.Parse(textBox3.Text);
            sheet1[4, 1].Value = int.Parse(textBox4.Text);
            sheet1[5, 1].Value = int.Parse(textBox5.Text);
            sheet1[6, 1].Value = int.Parse(textBox6.Text);

            //ブックの保存とExcelの起動
            wb.Save("c:/data/グリッドデータ.xls");
            System.Diagnostics.Process.Start("c:/data/グリッドデータ.xls");
        }
    }

XLStyleクラスのインスタンスの作成

 今回は、セルのスタイルを設定しています。XLStyleというオブジェクトを作成し、このオブジェクトのプロパティを使って文字色やセルの塗りつぶし色、罫線の設定を行い、XLStyleオブジェクトをセルに適用するという方法です。セルのスタイルはセル単位で設定し、列幅の設定は列単位で行うようにします。これらの処理は、データ転送のClickイベントハンドラの中で行い、データの書き出しを行うコードの前に記述します。

データを取り出す処理

 作成するスタイルは2つで、各列ごとに文字色と背景色を変えます。

 まず、XLStyleクラスのコンストラクタを使って、インスタンスを作成します。引数は、スタイルを設定するC1XLBookオブジェクトです。そして、XLStyleクラスのプロパティを使用してセルのスタイルを設定します。

 罫線を設定する場合は、SetBorderStyleメソッドを使用すると、一括して罫線を設定できます。引数には、罫線の線種を表すXLLineStyleEnum列挙体のメンバを指定します。罫線の色はSetBorderColorメソッドで設定します。引数は罫線の色を表すColorクラスのメンバです。

 ここでは、セルの塗りつぶしと文字色が違う2種類のXLStyleオブジェクトを作成します。

Visual Basic
'セルのスタイルと罫線の設定
Dim style1 As New XLStyle(C1XLBook1)
style1.ForeColor = Color.Yellow
style1.BackColor = Color.Blue
style1.SetBorderStyle(XLLineStyleEnum.Thin)
style1.SetBorderColor(Color.Cyan)

Dim style2 As New XLStyle(C1XLBook1)
style2.ForeColor = Color.Black
style2.BackColor = Color.LightSalmon
style2.SetBorderStyle(XLLineStyleEnum.Thin)
style2.SetBorderColor(Color.Cyan)
C#
//セルのスタイルと罫線の設定
XLStyle style1 = new XLStyle(c1XLBook1);
style1.ForeColor = Color.Yellow;
style1.BackColor = Color.Blue;
style1.SetBorderStyle(XLLineStyleEnum.Thin);
style1.SetBorderColor(Color.Cyan);

XLStyle style2 = new XLStyle(c1XLBook1);
style2.ForeColor = Color.Black;
style2.BackColor = Color.LightSalmon;
style2.SetBorderStyle(XLLineStyleEnum.Thin);
style2.SetBorderColor(Color.Cyan);

セルのサイズの調節とスタイルの設定

 セルの列幅は、個別のセルには設定できず列単位の設定になります。XLSheetクラスのColumnsプロパティを使うと、列全体をオブジェクトとして指定でき、Widthプロパティで列幅を設定できます(単位はTwips(1/20 point)なので、数字が大きくなっています)。

 セルの高さは、行単位で設定します。同じくXLSheetクラスのRowsプロパティを使うと、行全体をオブジェクトとして指定でき、Heightプロパティで高さを設定できます(同じく単位はTwips(1/20 point))。

 また、作成したXLStyleオブジェクトは各セル単位で指定できます。これは、セルを行列番号で指定し、Styleプロパティに作成したXLStyleオブジェクトを設定するだけで可能です。ここでは1列目と2列目のセルに、それぞれのXLStyleオブジェクトを設定しています。

Visual Basic
sheet1.Columns(0).Width = 1300
Dim i As Integer 
For i = 1 To 6
    sheet1.Rows(i).Height = 400
    sheet1(i, 0).Style = style1
    sheet1(i, 1).Style = style2
Next
C#
sheet1.Columns[0].Width = 1300;
for(int i=1;i<=6;i++){
    sheet1.Rows[i].Height = 400;
    sheet1[i, 0].Style = style1;
    sheet1[i, 1].Style = style2;
}
書式設定をしていないセル
書式設定をしていないセル
書式設定後のセル
書式設定後のセル

Clickイベントハンドラのコード全文

Visual Basic
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim wb As New C1XLBook()
        Dim sheet1 As XLSheet = wb.Sheets(0)

        'セルのスタイルと罫線の設定
        Dim style1 As New XLStyle(C1XLBook1)
        style1.ForeColor = Color.Yellow
        style1.BackColor = Color.Blue
        style1.SetBorderStyle(XLLineStyleEnum.Thin)
        style1.SetBorderColor(Color.Cyan)


        Dim style2 As New XLStyle(C1XLBook1)
        style2.ForeColor = Color.Black
        style2.BackColor = Color.LightSalmon
        style2.SetBorderStyle(XLLineStyleEnum.Thin)
        style2.SetBorderColor(Color.Cyan)

        sheet1.Columns(0).Width = 1300
        Dim i As Integer
        For i = 1 To 6
            sheet1.Rows(i).Height = 400
            sheet1(i, 0).Style = style1
            sheet1(i, 1).Style = style2
        Next

        'データの書き出し
        sheet1(0, 0).Value = "品名"
        sheet1(0, 1).Value = "数量"

        sheet1(1, 0).Value = Label3.Text
        sheet1(2, 0).Value = Label4.Text
        sheet1(3, 0).Value = Label5.Text
        sheet1(4, 0).Value = Label6.Text
        sheet1(5, 0).Value = Label7.Text
        sheet1(6, 0).Value = Label8.Text

        sheet1(1, 1).Value = CInt(TextBox1.Text)
        sheet1(2, 1).Value = CInt(TextBox2.Text)
        sheet1(3, 1).Value = CInt(TextBox3.Text)
        sheet1(4, 1).Value = CInt(TextBox4.Text)
        sheet1(5, 1).Value = CInt(TextBox5.Text)
        sheet1(6, 1).Value = CInt(TextBox6.Text)

        'ブックの保存とExcelの起動
        wb.Save("c:\data\グリッドデータ.xls")
        System.Diagnostics.Process.Start("c:\data\グリッドデータ.xls")
    End Sub
End Class
C#
        private void button1_Click(object sender, EventArgs e)
        {
            C1XLBook wb = new C1XLBook();
            XLSheet sheet1 = wb.Sheets["Sheet1"];
            
            //セルのスタイルと罫線の設定
            XLStyle style1 = new XLStyle(c1XLBook1);
            style1.ForeColor = Color.Yellow;
            style1.BackColor = Color.Blue;
            style1.SetBorderStyle(XLLineStyleEnum.Thin);
            style1.SetBorderColor(Color.Cyan);


            XLStyle style2 = new XLStyle(c1XLBook1);
            style2.ForeColor = Color.Black;
            style2.BackColor = Color.LightSalmon;
            style2.SetBorderStyle(XLLineStyleEnum.Thin);
            style2.SetBorderColor(Color.Cyan);

            sheet1.Columns[0].Width = 1300;
            for(int i=1;i<=6;i++){
                sheet1.Rows[i].Height = 400;
                sheet1[i, 0].Style = style1;
                sheet1[i, 1].Style = style2;
            }

           //データの書き出し
            sheet1[0, 0].Value = "品名";
            sheet1[0, 1].Value = "数量";

            sheet1[1, 0].Value = label3.Text;
            sheet1[2, 0].Value = label4.Text;
            sheet1[3, 0].Value = label5.Text;
            sheet1[4, 0].Value = label6.Text;
            sheet1[5, 0].Value = label7.Text;
            sheet1[6, 0].Value = label8.Text;

            sheet1[1, 1].Value = int.Parse(textBox1.Text);
            sheet1[2, 1].Value = int.Parse(textBox2.Text);
            sheet1[3, 1].Value = int.Parse(textBox3.Text);
            sheet1[4, 1].Value = int.Parse(textBox4.Text);
            sheet1[5, 1].Value = int.Parse(textBox5.Text);
            sheet1[6, 1].Value = int.Parse(textBox6.Text);

            //ブックの保存とExcelの起動
            wb.Save("c:/data/グリッドデータ.xls");
            System.Diagnostics.Process.Start("c:/data/グリッドデータ.xls");
        }
    }
}

まとめ

 C1XLBookコンポーネントでは、ただ単にデータをExcel形式で保存できるだけでなく、セルの書式設定や罫線の作成までもプログラム側で行うことができます。

 計測プログラムや独自のデータ入力アプリケーションを作成する場合、データをファイルに保存するのはかなり手間のかかる作業です。また、データファイルを市販のアプリケーションと互換性を持たせようとすると、CSV形式など見づらいデータ形式になってしまいます。Excel形式でデータを保存できれば、Excelで読み書きできるようになるのはもちろんのこと、他のOfficeアプリケーションでAccessなどのデータベースファイルでも使えるデータファイルになります。

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

修正履歴

  • 2009/03/02 10:18 記事のタイトルを修正しました。

著者プロフィール

  • 瀬戸 遥(セト ハルカ)

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

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