描画速度(パフォーマンス)を向上させる方法(2)

文書番号 : 33628     文書種別 : 使用方法     登録日 : 2012/11/14     最終更新日 : 2014/09/11
文書を印刷する
対象製品
SPREAD for Windows Forms 7.0J
詳細
表示速度の高速化の手段としては、スプレッドのモデルクラスを使用する方法があります。

例えばセルにデータを設定する場合は、Cells(row, Col).Value またはCells(row, Col).Text または、SheetのSetText、SetValueメソッドを使用するよりも、データモデルを使用したほうが処理が高速になります。

同様に、セルの罫線やセル型などの設定を行う場合も、セルのCellTypeプロパティやBorderプロパティを設定するよりも、スタイルモデルを使用したほうが高速になります。また、大量のセルにスタイルを設定する場合は、名前付きスタイルオブジェクトを使用することで、リソースの消費も最小限に抑え、更に高速な処理を行うことができます。

例えば、日付時刻型セル、罫線、現在日付時刻をセルに設定する場合、次のような結果となります。
【セルの数】500列×500行
【PCスペック】CPU:Intel Core i7-3770 3.40GHz 3.40GHz メモリ:12.0GB
------------------------------------------------------- 
◎セルに直接設定した場合:9002ミリ秒
◎スタイルモデルおよびデータモデルを使用した場合:2079ミリ秒

下記サンプルコードでは、Button1でセルに直接設定し、Button2ではスプレッドのモデルクラスを使用しています。また、スプレッドのモデルクラスには、下記で使用したデータモデル、スタイルモデルのほか、セルの連結を管理するスパンモデル等があります。

◎サンプルコード(VB)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  ' 名前付きスタイルオブジェクトを作成し、セル型/罫線を設定
  Dim ns As New FarPoint.Win.Spread.NamedStyle("MyStyle")
  ns.CellType = New FarPoint.Win.Spread.CellType.DateTimeCellType
  ns.Border = New FarPoint.Win.ComplexBorder(New FarPoint.Win.ComplexBorderSide(FarPoint.Win.ComplexBorderSideStyle.Dashed))
  ' スプレッドのコレクションに登録
  FpSpread1.NamedStyles.Add(ns)
End Sub

'=====================================
' セルに直接設定する場合
'=====================================
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Dim i As Integer
  Dim j As Integer
  Dim start As DateTime = Now

  'ループ処理で全てのセルにセル型、罫線、値を設定
  With FpSpread1.ActiveSheet
    For i = 0 To 499
      For j = 0 To 499
        .Cells(i, j).CellType = New FarPoint.Win.Spread.CellType.DateTimeCellType
        .Cells(i, j).Border = New FarPoint.Win.ComplexBorder(New FarPoint.Win.ComplexBorderSide(FarPoint.Win.ComplexBorderSideStyle.Dashed))
        .Cells(i, j).Value = Now
      Next
    Next
  End With

  Me.Text = String.Format("{0:###,###}ミリ秒", DateTime.Now.Subtract(start).TotalMilliseconds)
End Sub

'=====================================
' モデルクラスを使用する場合
'=====================================
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  Dim i, j As Integer
  Dim start As DateTime = Now

  'データモデルを取得
  Dim datamodel As FarPoint.Win.Spread.Model.DefaultSheetDataModel = CType(FpSpread1.ActiveSheet.Models.Data, FarPoint.Win.Spread.Model.DefaultSheetDataModel)
  'スタイルモデルを取得
  Dim stylemodel As FarPoint.Win.Spread.Model.DefaultSheetStyleModel = CType(FpSpread1.ActiveSheet.Models.Style, FarPoint.Win.Spread.Model.DefaultSheetStyleModel)

  'コレクションから名前付きスタイルオブジェクトを取得
  Dim style As FarPoint.Win.Spread.StyleInfo = FpSpread1.NamedStyles.Find("MyStyle")

  'ループ処理で全てのセルにスタイルと値を設定
  For i = 0 To 499
    For j = 0 To 499
      stylemodel.SetDirectInfo(i, j, style)
      datamodel.SetValue(i, j, Now)
    Next
  Next

  Me.Text = String.Format("{0:###,###}ミリ秒", DateTime.Now.Subtract(start).TotalMilliseconds)
End Sub

'=====================================
' スプレッドシートをリセット
'=====================================
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
  FpSpread1.ActiveSheet.Reset()
End Sub


◎サンプルコード(C#)
private void Form1_Load(object sender, EventArgs e)
{
  // 名前付きスタイルオブジェクトを作成し、セル型/罫線を設定
  FarPoint.Win.Spread.NamedStyle ns = new FarPoint.Win.Spread.NamedStyle("MyStyle");
  ns.CellType = new FarPoint.Win.Spread.CellType.DateTimeCellType();
  ns.Border = new FarPoint.Win.ComplexBorder(new FarPoint.Win.ComplexBorderSide(FarPoint.Win.ComplexBorderSideStyle.Dashed));
  // スプレッドのコレクションに登録
  fpSpread1.NamedStyles.Add(ns);
}

//=====================================
// セルに直接設定する場合
//=====================================
private void button1_Click(object sender, EventArgs e)
{
  int i = 0;
  int j = 0;
  DateTime start = DateTime.Now;

  //ループ処理で全てのセルにセル型、罫線、値を設定
  for (i = 0; i <= 499; i++)
  {
    for (j = 0; j <= 499; j++)
    {
      fpSpread1.ActiveSheet.Cells[i, j].CellType = new FarPoint.Win.Spread.CellType.DateTimeCellType();
      fpSpread1.ActiveSheet.Cells[i, j].Border = new FarPoint.Win.ComplexBorder(new FarPoint.Win.ComplexBorderSide(FarPoint.Win.ComplexBorderSideStyle.Dashed));
      fpSpread1.ActiveSheet.Cells[i, j].Value = DateTime.Now;
    }
  }

  this.Text = string.Format("{0:###,###}ミリ秒", DateTime.Now.Subtract(start).TotalMilliseconds);
}


//=====================================
// モデルクラスを使用する場合
//=====================================
private void button2_Click(object sender, EventArgs e)
{
  int i = 0;
  int j = 0;
  DateTime start = DateTime.Now;

  //データモデルを取得
  FarPoint.Win.Spread.Model.DefaultSheetDataModel datamodel = (FarPoint.Win.Spread.Model.DefaultSheetDataModel)fpSpread1.ActiveSheet.Models.Data;
  //スタイルモデルを取得
  FarPoint.Win.Spread.Model.DefaultSheetStyleModel stylemodel = (FarPoint.Win.Spread.Model.DefaultSheetStyleModel)fpSpread1.ActiveSheet.Models.Style;

  //コレクションから名前付きスタイルオブジェクトを取得
  FarPoint.Win.Spread.StyleInfo style = fpSpread1.NamedStyles.Find("MyStyle");

  //ループ処理で全てのセルにスタイルと値を設定
  for (i = 0; i <= 499; i++)
  {
    for (j = 0; j <= 499; j++)
    {
      stylemodel.SetDirectInfo(i, j, style);
      datamodel.SetValue(i, j, DateTime.Now);
    }
  }

  this.Text = string.Format("{0:###,###}ミリ秒", DateTime.Now.Subtract(start).TotalMilliseconds);
}


//=====================================
// スプレッドシートをリセット
//=====================================
private void button3_Click(object sender, EventArgs e)
{
  fpSpread1.ActiveSheet.Reset();
}
関連情報
キーワード
「パフォーマンス」