コードの作成
フォームのデザインができあがったら、コードを作成します。コードは、TimerコントロールのTickイベントハンドラがメインの処理になりますが、データの保存処理は独自のプロシージャ(メソッド)「write_xls」を作成してここに記述します。
タイマーのイベント処理
TimerコントロールのTickイベントハンドラでは、乱数を作成しその値を10個のLabelコントロールに表示する処理を行います。Tickイベントが発生する1000ミリ秒(1秒)ごとに1つのデータを作成し、LabelコントロールのTextプロパティにセットします。
併せて、ステータスバーに作成したプログレスバー(RibbonProgressBarコントロール)のValueプロパティを1つ増やし、プログレスバーを表示させます。
10個のデータを作成し終わった時点で、ステータスバーのラベル(RibbonLabelコントロール)に計測終了のメッセージを表示し、データをExcelブック形式で保存する処理を呼び出します。なお、名前空間「C1.C1Excel」を宣言しておいてください。
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
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」にセットします。
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
private void button1_Click(object sender, EventArgs e) { timer1.Enabled = true; //タイマースタート ribbonLabel1.Text = "計測中"; //ステータスバーの表示 //計測リスタート時のリセット処理 ribbonProgressBar1.Value = 0; cnt = 2; }
データの保存処理
Labelコントロールで表示したデータを、Excelのブック形式で保存する処理を作成します。これは、専用のプロシージャ(メソッド)「write_xls」を作成して記述します。このプロシージャ(メソッド)は戻り値も引数も持ちません。処理を実行するだけです。
最初に、データを保存するフォルダ名を作成します。これは、アプリケーションが実行するフォルダと同じフォルダに格納するようにします。この変数は、2つのプロシージャ(メソッド)で共有するので、クラス変数として宣言します。
Private savefname As String = Application.StartupPath + "\MeasureData.xls"
private string savefname = Application.StartupPath + "/MeasureData.xls";
プロシージャ(メソッド)「write_xls」では、最初にC1XLBookコントロールのワークシートへの参照を作成します。ワークシートは「XLSheetCollection」というコレクションオブジェクトになっており、C1XLBookコントロールの「Sheets」プロパティを使い、0から始まるインデクサを引数に指定して個々のシートを指定します。
Dim sheet As XLSheet = C1XLBook1.Sheets(0) 'ワークシートへの参照を作成
XLSheet sheet = c1XLBook1.Sheets[0]; //ワークシートへの参照を作成
個々のワークシートは「XLSheet」というオブジェクトになっており、セルは「XLCell」オブジェクトで操作します。セルへのアクセスはワークシートの参照を格納している変数に、行列番号のインデクサを指定して行います。
行列番号は一番左上のセルを(0,0)とし、列は右方向に、行は下方向に番号が増えていきます。このセルへのアクセスは、実はXLSheetオブジェクトのGetCellメソッドを呼び出しており、引数は(行番号,列番号)の順番で指定するようになっています。
ここでは、先頭のセルに「計測結果」という文字列を代入し、その隣の列のセルに作成日時を格納します。
sheet(0, 0).Value = "計測結果" sheet(0, 1).Value = System.DateTime.Now.ToString()
sheet[0, 0].Value = "計測結果"; sheet[0, 1].Value = System.DateTime.Now.ToString();
そして、For...Nextステートメントを使って、Labelコントロールで表示しているデータをセルの2列目に代入していきます。1列目のセルには、「Data1, Data2, Data3...」とデータの位置を表す文字列を代入します。セルに値を代入するには、セルを表すオブジェクトの「XLCell」クラスのValueプロパティに値を代入します。
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
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)メソッドを用いて単位変換します。
'セルのスタイル設定 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
//セルのスタイル設定 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で表示]ボタンを表示状態にします。
C1XLBook1.Save(savefname) 'ブック保存処理 RibbonButton1.Visible = True 'ステータスバーのボタンを表示
c1XLBook1.Save(savefname); //ブック保存処理 ribbonButton1.Visible = true; //ステータスバーのボタンを表示
データの保存が完了したら、Excelでブックを開きます。これは、ProcessクラスのStartメソッドを実行します。
Dim rtn As DialogResult = MessageBox.Show("Excelで表示しますか?", "データの表示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) If rtn = DialogResult.Yes Then System.Diagnostics.Process.Start(savefname) End If
DialogResult rtn = MessageBox.Show("Excelで表示しますか?", "データの表示", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if(rtn == DialogResult.Yes) { System.Diagnostics.Process.Start(savefname); }
ステータスバーの[データをExcelで表示]ボタンがクリックされた時も、同じようにExcelを起動して保存したブックを表示します。
Private Sub RibbonButton1_Click(sender As System.Object, e As System.EventArgs) Handles RibbonButton1.Click System.Diagnostics.Process.Start(savefname) End Sub
private void ribbonButton1_Click(object sender, EventArgs e) { System.Diagnostics.Process.Start(savefname); }
write_xlsのコードをまとめると、次のようになります。
'アプリケーションと同じフォルダに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
//アプリケーションと同じフォルダに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を使ったことがある人ならすぐに使えるオブジェクト構成になっています。アプリケーションのデータ保存に頭を悩ませている方は、ぜひ導入を検討してみてはいかがでしょうか。