SPREADのアクティブシートへのデータを設定する場合は一般的にアクティブシートのセルへ直接行います。
以下のソースは、フォームロード時にSPREADの初期化を行っています。 アクティブシートのカラム数を6に設定し、ヘッダ行数を0でクリア設定しています。
フォーム表示後、ボタンをクリックすると、 クリックイベント内で宣言された固定的なテストデータをSPREADに設定し表示させます。
データの1行分毎の処理で、「RowCount」プロパティを+1して行を追加します。 行の追加した後で、6個のセルに対して別々の値を設定しています。
SPREADへの描画を早くする為に、行データを全て処理する前後で、「FpSpread1.SuspendLayout()」と 「FpSpread1.ResumeLayout(True)」を行います。これらではさまれた処理は描画がリアルタイムでは 反映されないので、描画が早くなります。
今回の例では10000行のデータを設定しています。 この処理の時間はだいたい14秒前後掛かりました。 (私のPCのOSはWindows7SP1で、CPUはCorei5の3.2GHzです)
下図は、最初、フォームが表示後、「Button1」をクリックした結果が以下の図です。
(今回の移行で、画像が見つからなかったので、割愛します...)
データが10000件も描画することは稀なので、このままでもいいのですが、 14秒はさすがに掛かり過ぎなので、他の方法で行ってみます。
以下のソースは、SPREADのアクティブシートのデータモデルを取得し、 そのデータモデルを使ってデータを設定しています。 ソース的にはほとんど変わりが無いのですが、 アクティブシートへの直接セル設定のところをデータモデル経由に変更しています。
この方法で行うと、0.2秒以下で処理が終わります。14秒から0.2秒への劇的な速度アップが見られました。
=====
2016/02/29:の時の情報
以下のソースは、フォームロード時に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
コメント