-
SPREADのアクティブシートへのデータを設定する場合は一般的にアクティブシートのセルへ直接行います。
以下のソースは、フォームロード時にSPREADの初期化を行っています。 アクティブシートのカラム数を6に設定し、ヘッダ行数を0でクリア設定しています。
フォーム表示後、ボタンをクリックすると、 クリックイベント内で宣言された固定的なテストデータをSPREADに設定し表示させます。
データの1行分毎の処理で、「RowCount」プロパティを+1して行を追加します。 行の追加した後で、6個のセルに対して別々の値を設定しています。
SPREADへの描画を早くする為に、行データを全て処理する前後で、「FpSpread1.SuspendLayout()」と 「FpSpread1.ResumeLayout(True)」を行います。これらではさまれた処理は描画がリアルタイムでは 反映されないので、描画が早くなります。
今回の例では10000行のデータを設定しています。 この処理の時間はだいたい14秒前後掛かりました。 (私のPCのOSはWindows7SP1で、CPUはCorei5の3.2GHzです)
Public Class Form1 'フォームロード時にSPREADの初期化 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Me.FpSpread1.ActiveSheet 'SPREADのアクティブシートのカラム数を3に設定 .ColumnCount = 6 'SPREADの行クリア .RowCount = 0 End With End Sub 'ボタンクリックでカラム連結処理 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '時間計測用 Dim dt As DateTime = Now 'ボタン不可設定 sender.Enabled = False 'ソースが長くなるのでWith宣言 With Me.FpSpread1.ActiveSheet 'SPREADの行クリア .RowCount = 0 '描画を停止させる Me.FpSpread1.SuspendLayout() 'データの行数分の処理 For i As Integer = 0 To 9999 '行数を増やす .RowCount += 1 '各セルへのデータ設定 .SetText(i, 0, "C1-" & i.ToString("0000")) .SetText(i, 1, "C2-" & i.ToString("0000")) .SetText(i, 2, "C3-" & i.ToString("0000")) .SetText(i, 3, "C4-" & i.ToString("0000")) .SetText(i, 4, "C5-" & i.ToString("0000")) .SetText(i, 5, "C6-" & i.ToString("0000")) Next End With '描画を再開させる Me.FpSpread1.ResumeLayout(True) '経過時間の表示 MsgBox("経過時間 = " & (Now - dt).TotalSeconds & "秒") 'ボタン許可設定 sender.Enabled = True End Sub End Class
下図は、最初、フォームが表示後、「Button1」をクリックした結果が以下の図です。
(今回の移行で、画像が見つからなかったので、割愛します...)
データが10000件も描画することは稀なので、このままでもいいのですが、 14秒はさすがに掛かり過ぎなので、他の方法で行ってみます。
以下のソースは、SPREADのアクティブシートのデータモデルを取得し、 そのデータモデルを使ってデータを設定しています。 ソース的にはほとんど変わりが無いのですが、 アクティブシートへの直接セル設定のところをデータモデル経由に変更しています。
この方法で行うと、0.2秒以下で処理が終わります。14秒から0.2秒への劇的な速度アップが見られました。
Public Class Form1 'フォームロード時にSPREADの初期化 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Me.FpSpread1.ActiveSheet 'SPREADのアクティブシートのカラム数を3に設定 .ColumnCount = 6 'SPREADの行クリア .RowCount = 0 End With End Sub 'ボタンクリックでカラム連結処理 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '時間計測用 Dim dt As DateTime = Now 'ボタン不可設定 sender.Enabled = False 'データモデルを取得する Dim datamodel As FarPoint.Win.Spread.Model.DefaultSheetDataModel = _ CType(FpSpread1.ActiveSheet.Models.Data, FarPoint.Win.Spread.Model.DefaultSheetDataModel) 'SPREADの行クリア Me.FpSpread1.ActiveSheet.RowCount = 0 '描画を停止させる Me.FpSpread1.SuspendLayout() '10000行のデータの処理 For i As Integer = 0 To 9999 '行数を増やす Me.FpSpread1.ActiveSheet.RowCount += 1 'データモデルでのデータ設定 datamodel.SetValue(i, 0, "C1-" & i.ToString("0000")) datamodel.SetValue(i, 1, "C2-" & i.ToString("0000")) datamodel.SetValue(i, 2, "C3-" & i.ToString("0000")) datamodel.SetValue(i, 3, "C4-" & i.ToString("0000")) datamodel.SetValue(i, 4, "C5-" & i.ToString("0000")) datamodel.SetValue(i, 5, "C6-" & i.ToString("0000")) Next '描画を再開させる Me.FpSpread1.ResumeLayout(True) '経過時間の表示 MsgBox("経過時間 = " & (Now - dt).TotalSeconds & "秒") 'ボタン許可設定 sender.Enabled = True End Sub End Class
=====
2016/02/29:の時の情報
PR -
SPREADのアクティブシートのセルにボタンセルタイプ(ButtonCellType)を設定した時の、 クリック時イベントの処理についてです。
以下のソースは、フォームロード時にSPREADの初期化を行っています。 アクティブシートのカラム数を3に設定し、ヘッダ行数を0でクリア設定しています。
フォーム表示後、ボタンをクリックすると、 クリックイベント内で宣言された固定的なテストデータをSPREADに設定し表示させます。
データの1行分毎の処理で、「RowCount」プロパティを+1して行を追加します。
追加された行の1カラム目にはボタンセルタイプ(ButtonCellType)を設定します。 ボタンのキャプションの設定は、ButtonCellTypeの「Text」プロパティに設定します。
2カラム目はテキストセルタイプ(TextCellType)を設定します。 データを設定するには、セルの「Text」プロパティに設定します。 TextCellTypeは先頭ゼロが省かれることなく、5個目のデータの"0000005"がそのまま表示されます。
3カラム目はチェックボックスセルタイプ(CheckBoxCellType)を設定します。 CheckBoxCellTypeの場合、データのチェックの状態を設定するには「Value」プロパティに設定します。
ボタンクリック時のイベントとしては、SPREADコントロールの「ButtonClicked」に処理を記述します。 「ButtonClicked」は「ButtonCellType」だけではなく以下のセルタイプでイベントが発生します。
・ButtonCellType ・CheckBoxCellType ・HyperlinkCellType ・MultiOptionCellType
Public Class Form1 'フォームロード時にSPREADの初期化 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Me.FpSpread1.ActiveSheet 'SPREADのアクティブシートのカラム数を3に設定 .ColumnCount = 3 'SPREADの行クリア .RowCount = 0 End With End Sub 'ボタンクリックでカラム連結処理 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '仮に4行分のデータ Dim ArrData(,) As String = { _ {"001", "Test001", "True"}, _ {"002", "Test002", "False"}, _ {"003", "Test003", "True"}, _ {"004", "Test004", "False"}, _ {"005", "0000005", "False"} _ } 'ソースが長くなるのでWith宣言 With Me.FpSpread1.ActiveSheet 'データの行数分の処理 For i As Integer = 0 To ArrData.GetLength(0) - 1 '行数を増やす .RowCount += 1 '第1カラムはボタン(ButtonCellType) Dim buttonCell As New FarPoint.Win.Spread.CellType.ButtonCellType buttonCell.Text = ArrData(i, 0) 'ボタンのキャプション .Cells(i, 0).CellType = buttonCell '第2カラムはテキスト(TextCellType) Dim textCell As New FarPoint.Win.Spread.CellType.TextCellType .Cells(i, 1).CellType = textCell .Cells(i, 1).Text = ArrData(i, 1) '第3カラムはチェックボックス(CheckBoxCellType) Dim chkCell As New FarPoint.Win.Spread.CellType.CheckBoxCellType .Cells(i, 2).CellType = chkCell .Cells(i, 2).HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center .Cells(i, 2).Value = CBool(ArrData(i, 2)) '値はValueに設定 Next End With End Sub 'ボタンクリック時処理 Private Sub FpSpread1_ButtonClicked(ByVal sender As Object, _ ByVal e As FarPoint.Win.Spread.EditorNotifyEventArgs) _ Handles FpSpread1.ButtonClicked Dim str As String = "" With Me.FpSpread1.ActiveSheet str &= "行(e.Row) = " & e.Row & vbCrLf str &= "列(e.Column) = " & e.Column & vbCrLf str &= "2カラム目 = " & .Cells(e.Row, 1).Text & vbCrLf str &= "3カラム目 = " & CBool(.Cells(e.Row, 2).Value).ToString & vbCrLf MsgBox(str) End With End Sub End Class
下図は、最初、フォームが表示後、「Button1」をクリックした結果が以下の図です。
1行目の「001」ボタンをクリックした結果が以下の図です。 (メッセージBOXの表示をForm1の上に移動して画面キャプチャしていますので実際の表示位置とは異なります)
「ButtonClicked」イベントの引数である「e」のプロパティ「Row」「Column」で クリック時の行、カラム位置が分かります。このプロパティを使ってセルの情報を取得します。
5行目のチェックボックスをクリックした結果が以下の図です。
「ButtonClicked」がチェックボックスにも対応していることが分かります。 この時の3カラム目の値を見ると、チェックボックスが変化した後のチェックの状態を返す様です。 この点は注意が必要だと思います。
もし、セル上に各種のセルタイプのものが存在する場合は、カラム位置かもしくは、 イベントを発生させたControlオブジェクト(「e」のプロパティ「EditingControl」)で処理を分ける必要があります。
=====
2016/02/29:の時の情報
-
前回の続きでSPREADのアクティブシートのセルに、 ボタン、テキスト、チェックボックスの各セルタイプを設定します。
以下のソースは、フォームロード時にSPREADの初期化を行っています。 アクティブシートのカラム数を3に設定し、ヘッダ行数を0でクリア設定しています。
フォーム表示後、ボタンをクリックすると、 クリックイベント内で宣言された固定的なテストデータをSPREADに設定し表示させます。
データの1行分毎の処理で、「RowCount」プロパティを+1して行を追加します。
追加された行の1カラム目にはボタンセルタイプ(ButtonCellType)を設定します。 ボタンのキャプションの設定は、ButtonCellTypeの「Text」プロパティに設定します。
2カラム目はテキストセルタイプ(TextCellType)を設定します。 データを設定するには、セルの「Text」プロパティに設定します。 TextCellTypeは先頭ゼロが省かれることなく、5個目のデータの"0000005"がそのまま表示されます。
3カラム目はチェックボックスセルタイプ(CheckBoxCellType)を設定します。 CheckBoxCellTypeの場合、データのチェックの状態を設定するには「Value」プロパティに設定します。
Public Class Form1 'フォームロード時にSPREADの初期化 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Me.FpSpread1.ActiveSheet 'SPREADのアクティブシートのカラム数を3に設定 .ColumnCount = 3 'SPREADの行クリア .RowCount = 0 End With End Sub 'ボタンクリックでカラム連結処理 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '仮に4行分のデータ Dim ArrData(,) As String = { _ {"001", "Test001", "True"}, _ {"002", "Test002", "False"}, _ {"003", "Test003", "True"}, _ {"004", "Test004", "False"}, _ {"005", "0000005", "False"} _ } 'ソースが長くなるのでWith宣言 With Me.FpSpread1.ActiveSheet 'データの行数分の処理 For i As Integer = 0 To ArrData.GetLength(0) - 1 '行数を増やす .RowCount += 1 '第1カラムはボタン(ButtonCellType) Dim buttonCell As New FarPoint.Win.Spread.CellType.ButtonCellType buttonCell.Text = ArrData(i, 0) 'ボタンのキャプション .Cells(i, 0).CellType = buttonCell '第2カラムはテキスト(TextCellType) Dim textCell As New FarPoint.Win.Spread.CellType.TextCellType .Cells(i, 1).CellType = textCell .Cells(i, 1).Text = ArrData(i, 1) '第3カラムはチェックボックス(CheckBoxCellType) Dim chkCell As New FarPoint.Win.Spread.CellType.CheckBoxCellType .Cells(i, 2).CellType = chkCell .Cells(i, 2).HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center .Cells(i, 2).Value = CBool(ArrData(i, 2)) '値はValueに設定 Next End With End Sub End Class
下図は、最初、フォームが表示された時の様子です。
その後、ボタンをクリックした結果が以下の図です。
=====
2016/02/29:の時の情報
-
SPREADを使って一覧データを表示することはよくあります。今回は、簡単なデータを一覧表示させる方法です。
以下のソースは、フォームロード時にSPREADの初期化を行っています。 アクティブシートのカラム数を3に設定し、ヘッダ行数を0でクリア設定しています。
フォーム表示後、ボタンをクリックすると、 クリックイベント内で宣言された固定的なテストデータをSPREADに設定し表示させます。
データの1行分毎の処理で、「RowCount」プロパティを+1して行を追加します。 次に、追加された行にカラムデータを1セル毎に「Value」プロパティに設定します。 セルの「Text」プロパティでもほぼ同じ結果になりますが、 第1セルの"001"の値の先頭ゼロが省かれて"1"となってしまいます。
1カラム目のCellTypeが何も設定されていませんので、 「Text」プロパティでデータ設定するとデフォルトでは先頭ゼロは省かれる様です。
もし、「Text」プロパティを使うのであれば、CellTypeを「TextCellType」に設定する必要があります。 (各セル毎にCellTypeを設定する方がいいのですが)
「Value」プロパティの場合は、そのままのデータが設定されるので"001”と表示される様です。
Public Class Form1 'フォームロード時にSPREADの初期化 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Me.FpSpread1.ActiveSheet 'SPREADのアクティブシートのカラム数を3に設定 .ColumnCount = 3 'SPREADの行クリア .RowCount = 0 End With End Sub 'ボタンクリックでカラム連結処理 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '仮に4行分のデータ Dim ArrData(,) As String = { _ {"001", "Content001", "Test001"}, _ {"002", "Content002", "Test002"}, _ {"003", "Content003", "Test003"}, _ {"004", "Content004", "Test004"} _ } 'ソースが長くなるのでWith宣言 With Me.FpSpread1.ActiveSheet 'データの行数分の処理 For i As Integer = 0 To ArrData.GetLength(0) - 1 '行数を増やす .RowCount += 1 'カラム数分をセルに設定 For j As Integer = 0 To ArrData.GetLength(1) - 1 '.Cells(i, j).Text = ArrData(i, j) 'こちらは"001"⇒"1"と表示される .Cells(i, j).Value = ArrData(i, j) '書式無しで生のデータを設定 Next Next End With End Sub End Class
下図は、最初、フォームが表示された時の様子です。
その後、ボタンをクリックした結果が以下の図です。
尚、ソースの中で使っている「ArrData.GetLength(0)」ですが、これは1次元目の個数を取得するものです。 「ArrData.GetLength(1)」は2次元目の個数です。
=====
2016/02/29:の時の情報
-
今回は、SPREADのヘッダカラム及び、通常のシート上のセルの連結方法についてです。
ヘッダカラムのプロパティ「ColumnHeader」の「Cells」で連結するセルの「ColumnSpan」プロパティに そのカラムから右方向に連結するセル数を指定します。
通常のシート上のカラムも同様に「Cells」で指定したセルの「ColumnSpan」を設定します。
以下のソースは、フォームロード時にSPREADの初期化を行っています。 アクティブシートのカラム数、ヘッダ行数を設定した後で、 ヘッダカラムに、行位置とカラム位置を文字列化したものを設定しています。
フォーム表示後、ボタンをクリックすると、ヘッダの1行目のカラムを1個置きに連結します。 また、シート上のカラムを1行置きに、2個ずつ連結しています。
Public Class Form1 'フォームロード時にSPREADの初期化 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'SPREADがフォーカスを持っていないときにセル枠の表示をしない設定 Me.FpSpread1.RetainSelectionBlock = False 'SPREADのアクティブシートのカラム数を6に設定 Me.FpSpread1.ActiveSheet.ColumnCount = 6 'SPREADのアクティブシートのヘッダ行数を2に設定 Me.FpSpread1.ActiveSheet.ColumnHeaderRowCount = 2 'ヘッダカラムに文字列設定 For row As Integer = 0 To Me.FpSpread1.ActiveSheet.ColumnHeaderRowCount - 1 For i As Integer = 0 To Me.FpSpread1.ActiveSheet.ColumnCount - 1 '行位置 + " - " + カラム位置 Me.FpSpread1.ActiveSheet.ColumnHeader.Cells(row, i).Value = row & " - " & i Next Next End Sub 'ボタンクリックでカラム連結処理 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'ヘッダーのカラムを2個ずつ連結する For i As Integer = 0 To Me.FpSpread1.ActiveSheet.ColumnCount / 2 - 1 Me.FpSpread1.ActiveSheet.ColumnHeader.Cells(0, i * 2).ColumnSpan = 2 Next 'シート上のカラムを1行おきに、2個ずつ連結する For row As Integer = 0 To Me.FpSpread1.ActiveSheet.RowCount - 1 '行番号が偶数?? If row Mod 2 = 0 Then 'カラムを2個ずつ連結する For i As Integer = 0 To Me.FpSpread1.ActiveSheet.ColumnCount / 2 - 1 Me.FpSpread1.ActiveSheet.Cells(row, i * 2).ColumnSpan = 2 Next End If Next End Sub End Class
下図は、最初、フォームが表示された時の様子です。
その後、ボタンをクリックした結果が以下の図です。
尚、ActiveSheetのメソッドである「AddColumnHeaderSpanCell」「AddSpanCell」を使っても同様のことができます。 このメソッドは上記の、「ColumnSpan」プロパティへの設定を行っているだけだとは思いますが。
'ボタンクリックでカラム連結処理 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '行ヘッダーのカラムを2個ずつ連結する For i As Integer = 0 To Me.FpSpread1.ActiveSheet.ColumnCount / 2 - 1 Me.FpSpread1.ActiveSheet.AddColumnHeaderSpanCell(0, i * 2, 1, 2) Next 'シート上のカラムを1行おきに、2個ずつ連結する For row As Integer = 0 To Me.FpSpread1.ActiveSheet.RowCount - 1 '行番号が偶数?? If row Mod 2 = 0 Then 'カラムを2個ずつ連結する For i As Integer = 0 To Me.FpSpread1.ActiveSheet.ColumnCount / 2 - 1 Me.FpSpread1.ActiveSheet.AddSpanCell(row, i * 2, 1, 2) Next End If Next End Sub
=====
2016/02/29:の時の情報