このドキュメントでは、遅延読み込みを使用してReoGridに大規模なデータセットを効率的に読み込む方法を説明します。遅延読み込みの実装方法を示す具体的なコード例を提供します。
ステップ1:ワークシートの初期化
まず、ワークシートを初期化し、ユーザーインターフェースコンポーネントを設定します。
public partial class LazyLoadPerformanceDemo : UserControl
{
private Worksheet worksheet;
public LazyLoadPerformanceDemo()
{
InitializeComponent();
}
public static int RECORD_COUNT = 1000000;
public static int COLUMN_COUNT = 12;
List<FlightLog> logs;
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
// Generate data
logs = FlightLogGenerator.GenerateFlightLogs(RECORD_COUNT);
}
}
ステップ2:データの生成
大規模なデータセットを生成するメソッドを作成します。この例では、フライトログデータを生成します。
public class FlightLogGenerator
{
public static List<FlightLog> GenerateFlightLogs(int numRows = 10000)
{
Random rand = new Random();
DateTime startTime = DateTime.Now;
List<FlightLog> logs = new List<FlightLog>();
string[] weatherOptions = { "Sunny", "Cloudy", "Rain", "Snow" };
for (int i = 0; i < numRows; i++)
{
logs.Add(new FlightLog
{
Timestamp = startTime.AddMilliseconds(200 * i),
Speed = Math.Round(rand.NextDouble() * 180, 2),
Distance = Math.Round(rand.NextDouble() * 1000, 2),
Throttle = rand.Next(0, 101),
EngineBrake = rand.Next(0, 101),
Fuel = Math.Round(rand.NextDouble() * 100, 2),
DoorStatus = rand.Next(0, 2) == 1,
GPSLatitude = Math.Round(35.0 + rand.NextDouble() * 10, 6),
GPSLongitude = Math.Round(135.0 + rand.NextDouble() * 10, 6),
Weather = weatherOptions[rand.Next(weatherOptions.Length)]
});
}
return logs;
}
}
ステップ3:データソースの作成
ワークシートにデータを提供するデータソースクラスを実装します。
// Data source
public class FlightLogDataSource : IDataSource<FlightlogDataRecord>
{
public List<FlightLog> Logs { get; private set; }
private FlightlogDataRecord[] initedRecords;
public FlightLogDataSource(List<FlightLog> logs)
{
this.Worksheet = worksheet;
this.Logs = logs;
this.initedRecords = new FlightlogDataRecord[logs.Count];
}
public int RecordCount => Logs.Count;
public int ColumnCount => LazyLoadPerformanceDemo.COLUMN_COUNT;
public bool SuspendDataChangeEvent { get; set; }
public event EventHandler<DataSourceChangedEventArgs> OnInputDataChanged;
// Get data for the specified row
public FlightlogDataRecord GetRecord(int row)
{
FlightlogDataRecord record = initedRecords[row];
if (record == null)
{
record = new FlightlogDataRecord(this, row, Logs[row]);
}
// Return row data
return record;
}
}
// Data record
public class FlightlogDataRecord : IDataRecord
{
private FlightLogDataSource source;
private int row;
public FlightLog LogData { get; private set; }
public FlightlogDataRecord(FlightLogDataSource source, int row, FlightLog logData)
{
this.source = source;
this.row = row;
this.LogData = logData;
}
public object GetData(int columnIndex) {
switch (columnIndex)
{
case 0: return $"No. {row + 1}";
case 1: return LogData.Timestamp;
case 2: return LogData.Speed;
case 3: return LogData.Distance;
case 4: return LogData.Throttle;
case 5: return LogData.EngineBrake;
case 6: return LogData.Fuel;
case 7: return LogData.DoorStatus;
case 8: return LogData.GPSLatitude;
case 9: return LogData.GPSLongitude;
case 10: return LogData.Weather;
case 11: return $"=ROUND({new CellPosition(row, 4).ToAbsoluteAddress()} / {new CellPosition(row, 5).ToAbsoluteAddress()}, 1)";
}
return null;
}
}
ステップ4:遅延読み込みでデータを読み込む
データソースを使用して、遅延読み込みモードでワークシートにデータを読み込み、パフォーマンスを向上させます。
private void button1_Click(object sender, EventArgs e)
{
// Change the number of worksheet rows
worksheet.SetRows(logs.Count);
// Set the data source in lazy loading mode
worksheet.AddDataSource(
new RangePosition(0, 0, logs.Count, COLUMN_COUNT),
new FlightLogDataSource(logs),
// Enable lazy loading
DataSourceLoadMode.LazyLoading);
}
これらの手順に従うことで、データソースと遅延読み込みモードを使用して、大規模なデータセットをReoGridワークシートに効率的に読み込むことができます。
罫線とセルの書式設定の適用
GetRecordメソッドが呼び出された際に、罫線とセルの書式設定を設定できます。以下の例では、ワークシートインスタンスを使用して罫線を設定します。
public class FlightLogDataSource : IDataSource<FlightlogDataRecord>
{
public Worksheet Worksheet { get; private set; }
private FlightlogDataRecord[] initedRecords;
...
public FlightLogDataSource(Worksheet worksheet, List<FlightLog> logs)
{
this.Worksheet = worksheet;
this.Logs = logs;
this.initedRecords = new FlightlogDataRecord[logs.Count];
}
...
// Modify the GetRecord method as follows
public FlightlogDataRecord GetRecord(int row)
{
FlightlogDataRecord record = initedRecords[row];
if (record == null)
{
record = new FlightlogDataRecord(this, row, Logs[row]);
initedRecords[row] = record;
// Set row borders when the row is accessed for the first time
Worksheet.SetRangeBorders(row, 0, 1, ColumnCount, BorderPositions.Outside, RangeBorderStyle.BlackSolid);
Worksheet.SetRangeBorders(row, 0, 1, ColumnCount, BorderPositions.InsideVertical, RangeBorderStyle.GrayDotted);
}
// Return row data
return record;
}
...
}
遅延読み込みの原理と注意事項
遅延読み込みは、大規模なデータセットを効率的に扱うための技術です。セルに初めてアクセスされた時(レンダリング、数式参照、コードによるクエリなど)、そのデータがデータセットから読み込まれます。例えば、100万行のデータがある場合、最初に表示される約30行のみが読み込まれます。ユーザーがスクロールすると、必要に応じてさらにデータが読み込まれます。
数式とセル参照のサポート
遅延読み込みは数式もサポートしています。セルがまだレンダリングされていなくても、数式によって参照されている場合、アクセス時に対応するセルが自動的に読み込まれます。
遅延読み込みに関する注意事項
遅延読み込みは1回だけ実行されます。既に読み込まれたワークシートでデータを削除して再読み込みした場合、読み込み済み状態がリセットされないため、遅延読み込みは再度機能しません。そのため、データを再読み込みする必要がある場合は、ワークシートを再作成するなどのアプローチを取る必要があります。