SHOEISHA iD

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

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

ComponentZine(ComponentOne)

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

PowerTools XLS for .NETのC1XLBookコントロール、Ribbon for Windows FormsのC1StatusBarコントロールを使ったアプリケーションの作成

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

コードの作成

 フォームのデザインができあがったら、コードを作成します。コードは、TimerコントロールのTickイベントハンドラがメインの処理になりますが、データの保存処理は独自のプロシージャ(メソッド)「write_xls」を作成してここに記述します。

タイマーのイベント処理

 TimerコントロールのTickイベントハンドラでは、乱数を作成しその値を10個のLabelコントロールに表示する処理を行います。Tickイベントが発生する1000ミリ秒(1秒)ごとに1つのデータを作成し、LabelコントロールのTextプロパティにセットします。

 併せて、ステータスバーに作成したプログレスバー(RibbonProgressBarコントロール)のValueプロパティを1つ増やし、プログレスバーを表示させます。

 10個のデータを作成し終わった時点で、ステータスバーのラベル(RibbonLabelコントロール)に計測終了のメッセージを表示し、データをExcelブック形式で保存する処理を呼び出します。なお、名前空間「C1.C1Excel」を宣言しておいてください。

Visual Basic
Imports C1.C1Excel

Public Class Form1

    Private rd As Double = 0
    Private cnt As Integer = 0

    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick

        '乱数の作成
        Dim rdm As Random = New Random()
        rd = rdm.NextDouble()

        Dim cntlname As String = "Label" + cnt.ToString 'Labelコントロールへのアクセス用コントロール名の作成

        Me.Controls(cntlname).Text = rd.ToString        'Labelコントロールに乱数を代入
        RibbonProgressBar1.Value += 1                   ' プログレスバーを表示

        cnt += 2                                        '次のLabelコントロール名の作成

        '計測終了処理
        If cnt > 20 Then
            Timer1.Enabled = False
            RibbonLabel1.Text = "計測が終了しました。"
            write_xls()                                 'Excelブック形式の保存処理を呼び出す
            Exit Sub
        End If
    End Sub
C#
using C1.C1Excel;
namespace data_xlsave_cs
{
    public partial class Form1 : Form
    {
 
        public Form1()
        {
            InitializeComponent();
        }

        private double rd = 0;
        private int cnt = 0;

        private void timer1_Tick(object sender, EventArgs e)
        {
            //乱数の作成
            Random rdm = new Random();
            rd = rdm.NextDouble();

            string cntlname = "Label" + cnt.ToString(); //Labelコントロールへのアクセス用コントロール名の作成

            this.Controls[cntlname].Text = rd.ToString();        //Labelコントロールに乱数を代入
            ribbonProgressBar1.Value += 1;                   // プログレスバーを表示

            cnt += 2;                                        //次のLabelコントロール名の作成

            //計測終了処理
            if (cnt > 20)
            {
                timer1.Enabled = false;
                ribbonLabel1.Text = "計測が終了しました。";
                write_xls();                                 //Excelブック形式の保存処理を呼び出す
                return;
            }
        }

計測開始・リセット処理

 計測を開始する処理と、一度計測が終了したあとに再度計測を行う時のリセット処理を、[計測開始」ボタンのClickイベントハンドラに作成します。

 ここでは、タイマーを開始してステータスバーのラベルに「計測中」の文字を表示し、プログレスバーの値を「0」にセットします。

Visual Basic
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Timer1.Enabled = True           'タイマースタート
    RibbonLabel1.Text = "計測中"    'ステータスバーの表示

    '計測リスタート時のリセット処理
    RibbonProgressBar1.Value = 0
    cnt = 2
End Sub
C#
private void button1_Click(object sender, EventArgs e)
{
    timer1.Enabled = true;           //タイマースタート
    ribbonLabel1.Text = "計測中";    //ステータスバーの表示

    //計測リスタート時のリセット処理
    ribbonProgressBar1.Value = 0;
    cnt = 2;
}

データの保存処理

 Labelコントロールで表示したデータを、Excelのブック形式で保存する処理を作成します。これは、専用のプロシージャ(メソッド)「write_xls」を作成して記述します。このプロシージャ(メソッド)は戻り値も引数も持ちません。処理を実行するだけです。

 最初に、データを保存するフォルダ名を作成します。これは、アプリケーションが実行するフォルダと同じフォルダに格納するようにします。この変数は、2つのプロシージャ(メソッド)で共有するので、クラス変数として宣言します。

Visual Basic
Private savefname As String = Application.StartupPath + "\MeasureData.xls"
C#
private string savefname = Application.StartupPath + "/MeasureData.xls";

 プロシージャ(メソッド)「write_xls」では、最初にC1XLBookコントロールのワークシートへの参照を作成します。ワークシートは「XLSheetCollection」というコレクションオブジェクトになっており、C1XLBookコントロールの「Sheets」プロパティを使い、0から始まるインデクサを引数に指定して個々のシートを指定します。

Visual Basic
Dim sheet As XLSheet = C1XLBook1.Sheets(0) 'ワークシートへの参照を作成
C#
XLSheet sheet = c1XLBook1.Sheets[0]; //ワークシートへの参照を作成

 個々のワークシートは「XLSheet」というオブジェクトになっており、セルは「XLCell」オブジェクトで操作します。セルへのアクセスはワークシートの参照を格納している変数に、行列番号のインデクサを指定して行います。

 行列番号は一番左上のセルを(0,0)とし、列は右方向に、行は下方向に番号が増えていきます。このセルへのアクセスは、実はXLSheetオブジェクトのGetCellメソッドを呼び出しており、引数は(行番号,列番号)の順番で指定するようになっています。

セルのアクセスインデクサ
セルのアクセスインデクサ

 ここでは、先頭のセルに「計測結果」という文字列を代入し、その隣の列のセルに作成日時を格納します。

Visual Basic
sheet(0, 0).Value = "計測結果"
sheet(0, 1).Value = System.DateTime.Now.ToString()
C#
sheet[0, 0].Value = "計測結果";
sheet[0, 1].Value = System.DateTime.Now.ToString();

 そして、For...Nextステートメントを使って、Labelコントロールで表示しているデータをセルの2列目に代入していきます。1列目のセルには、「Data1, Data2, Data3...」とデータの位置を表す文字列を代入します。セルに値を代入するには、セルを表すオブジェクトの「XLCell」クラスのValueプロパティに値を代入します。

Visual Basic
For i = 1 To 10
     sheet(i, 0).Value = "Data" + i.ToString()
     cntlname = "Label" + (i * 2).ToString()
     sheet(i, 1).Value = Convert.ToDouble(Me.Controls(cntlname).Text)
Next i
C#
for(i=1; i<=10; i++)
{
     sheet[i, 0].Value = "Data" + i.ToString();
     cntlname = "Label" + (i * 2).ToString();
     sheet[i, 1].Value = Convert.ToDouble(this.Controls[cntlname].Text);
}

 セルに値を代入したら、セルの文字装飾を行います。まず、セルの装飾は「XLStyle」クラスのインスタンスを作成してメンバプロパティを操作し、「XLStyle」オブジェクトをセルのStyleプロパティにセットします。

 スタイルはいくつも作成できるため、セルごとや行列ごとに違うスタイルを設定することが可能です。ここでは、データ表示用に文字色が「DarkBlue」でセルの値を右詰めで表示するスタイルと、データ番号のラベル用に文字色を「MediumSeaGreen」にセットするスタイルの2つを作成します。そして、このスタイルをColumnsプロパティを使用して、1列目と2列目のセルそれぞれに適用します。

 また、XLColumnクラスのWidthプロパティを使用して列幅を設定します。Widthプロパティは列の幅をtwips単位で取得または設定するプロパティです。設定値をピクセルで行いたい場合は、TwipsToPixels(Double)とPixelsToTwips(Double)メソッドを用いて単位変換します。

Visual Basic
'セルのスタイル設定
Dim style1 As New XLStyle(C1XLBook1)
style1.ForeColor = Color.DarkBlue
style1.AlignHorz = XLAlignHorzEnum.Right 'セルの値を右詰で表示
Dim style2 As New XLStyle(C1XLBook1)
style2.ForeColor = Color.MediumSeaGreen

sheet.Columns(0).Style = style1
sheet.Columns(0).Width = 1000
sheet.Columns(1).Style = style2
sheet.Columns(1).Width = 1500
C#
//セルのスタイル設定
XLStyle style1 = new XLStyle(c1XLBook1);
style1.ForeColor = Color.DarkBlue;
style1.AlignHorz = XLAlignHorzEnum.Right; //セルの値を右詰で表示
XLStyle style2 = new XLStyle(c1XLBook1);
style2.ForeColor = Color.MediumSeaGreen;

sheet.Columns[0].Style = style1;
sheet.Columns[0].Width = 1000;
sheet.Columns[1].Style = style2;
sheet.Columns[1].Width = 1500;

 データをセルに代入したら、ブックを保存します。これは、C1XLBookコントロールのSaveメソッドを実行します。引数はファイル名をフルパスで指定します。

 そして、保存が完了したらステータスバーに組み込んで非表示にしていた[データをExcelで表示]ボタンを表示状態にします。

Visual Basic
C1XLBook1.Save(savefname)       'ブック保存処理
RibbonButton1.Visible = True    'ステータスバーのボタンを表示
C#
c1XLBook1.Save(savefname);       //ブック保存処理
ribbonButton1.Visible = true;    //ステータスバーのボタンを表示

 データの保存が完了したら、Excelでブックを開きます。これは、ProcessクラスのStartメソッドを実行します。

Visual Basic
Dim rtn As DialogResult = MessageBox.Show("Excelで表示しますか?", "データの表示", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    If rtn = DialogResult.Yes Then
    System.Diagnostics.Process.Start(savefname)
End If
C#
DialogResult rtn = MessageBox.Show("Excelで表示しますか?", "データの表示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if(rtn == DialogResult.Yes)
{
    System.Diagnostics.Process.Start(savefname);
}

 ステータスバーの[データをExcelで表示]ボタンがクリックされた時も、同じようにExcelを起動して保存したブックを表示します。

Visual Basic
Private Sub RibbonButton1_Click(sender As System.Object, e As System.EventArgs) Handles RibbonButton1.Click
    System.Diagnostics.Process.Start(savefname)
End Sub
C#
private void ribbonButton1_Click(object sender, EventArgs e)
{
	System.Diagnostics.Process.Start(savefname);
}

 write_xlsのコードをまとめると、次のようになります。

Visual Basic
'アプリケーションと同じフォルダにXLSファイルを保存
Private savefname As String = Application.StartupPath + "\MeasureData.xls"

  Private Sub write_xls()     'Excelブック形式の保存処理
      Dim i As Integer
      Dim sheet As XLSheet = C1XLBook1.Sheets(0) 'ワークシートへの参照を作成
      Dim cntlname As String = ""

      'セルへの入力処理
      sheet(0, 0).Value = "計測結果"
      sheet(0, 1).Value = System.DateTime.Now.ToString()
      For i = 1 To 10
          sheet(i, 0).Value = "Data" + i.ToString()
          cntlname = "Label" + (i * 2).ToString()
          sheet(i, 1).Value = Convert.ToDouble(Me.Controls(cntlname).Text)
      Next i

      'セルのスタイル設定
      Dim style1 As New XLStyle(C1XLBook1)
      style1.ForeColor = Color.DarkBlue
      style1.AlignHorz = XLAlignHorzEnum.Right 'セルの値を右詰で表示
      Dim style2 As New XLStyle(C1XLBook1)
      style2.ForeColor = Color.MediumSeaGreen

      sheet.Columns(0).Style = style1
      sheet.Columns(0).Width = 1000
      sheet.Columns(1).Style = style2
      sheet.Columns(1).Width = 1500

      C1XLBook1.Save(savefname)       'ブック保存処理 
      RibbonButton1.Visible = True    'ステータスバーのボタンを表示

      Dim rtn As DialogResult = MessageBox.Show("Excelで表示しますか?", "データの表示", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
      If rtn = DialogResult.Yes Then
          System.Diagnostics.Process.Start(savefname)
      End If
  End Sub

  Private Sub RibbonButton1_Click(sender As System.Object, e As System.EventArgs) Handles RibbonButton1.Click
      System.Diagnostics.Process.Start(savefname)
  End Sub
End Class
C#
//アプリケーションと同じフォルダにXLSファイルを保存
private string savefname = Application.StartupPath + "/MeasureData.xls";
private void write_xls()
{
  int i=0;
  XLSheet sheet = c1XLBook1.Sheets[0]; //ワークシートへの参照を作成
  string cntlname = "";

  //セルへの入力処理
  sheet[0, 0].Value = "計測結果";
  sheet[0, 1].Value = System.DateTime.Now.ToString();
  for(i=1; i<=10; i++)
  {
      sheet[i, 0].Value = "Data" + i.ToString();
      cntlname = "Label" + (i * 2).ToString();
      sheet[i, 1].Value = Convert.ToDouble(this.Controls[cntlname].Text);
  }

  //セルのスタイル設定
  XLStyle style1 = new XLStyle(c1XLBook1);
  style1.ForeColor = Color.DarkBlue;
  style1.AlignHorz = XLAlignHorzEnum.Right; //セルの値を右詰で表示
  XLStyle style2 = new XLStyle(c1XLBook1);
  style2.ForeColor = Color.MediumSeaGreen;

  sheet.Columns[0].Style = style1;
  sheet.Columns[0].Width = 1000;
  sheet.Columns[1].Style = style2;
  sheet.Columns[1].Width = 1500;

  c1XLBook1.Save(savefname);       //ブック保存処理
  ribbonButton1.Visible = true;    //ステータスバーのボタンを表示

  DialogResult rtn = MessageBox.Show("Excelで表示しますか?", "データの表示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
  if(rtn == DialogResult.Yes)
  {
      System.Diagnostics.Process.Start(savefname);
  }
}

private void ribbonButton1_Click(object sender, EventArgs e)
{
  System.Diagnostics.Process.Start(savefname);
}

まとめ

 データの保存フォーマットに、Windows PCではもはや定番となっているExcel形式を取り入れることで、データの加工やポータビリティ性が高くなります。現代では、ブラックボックス化されたバイナリデータよりも、誰でも閲覧可能なデータ形式のほうが受け入れられやすくなってきています。

 一方、C1StatusBarコントロールは、ただ単に情報を表示するだけでなく、ボタンやラベル、プログレスバーなど多くのコントロールをペインに組み込むことができるため、すっきりと情報整理ができ、フォームの視覚効果も高くなります。

 C1XLBookコントロールは、Excelを使ったことがある人ならすぐに使えるオブジェクト構成になっています。アプリケーションのデータ保存に頭を悩ませている方は、ぜひ導入を検討してみてはいかがでしょうか。

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

  • このエントリーをはてなブックマークに追加
ComponentZine(ComponentOne)連載記事一覧

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6743 2012/09/11 15:10

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング