快速和轻量级一直是 ReoGrid 的开发目标。即使现在已经支持许多功能,ReoGrid 仍然采用多种技术来优化性能并提升用户体验。
ReoGrid 是一个 .NET 组件。 在 aardio 中调用 .NET 很方便,ReoGrid 官方文档中的 C# 示例我们几乎不需要太多修改就可以直接将其用于 aardio 。
但是我们需要了解 aardio 调用 .NET 这中间要经过跨语言的接口交互,当然这过程依然很快,但如何在循环中大量、快速、密集调用,积少成多可能就会影响到程序性能。
例如下面这样循环写入大量数据将会非常慢:
//快速扩展行数
var sheet1 = grid.CurrentWorksheet;
sheet1.Rows = 100000; // 扩展到10万行
//循环写数据
for(i=1;100000;1){
sheet1.SetCellData(i-1, 0, "数据"+i);
}
优化的方法其实非常简单,我们应当在 aardio 中处理数据,再用数组一次性传给表格,那么即使写入上万行,速度也会快如闪电。
优化后的 aardio 代码如下
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio 调用 ReoGrid 性能优化演示")
/*}}*/
import dotNet.ReoGrid;
var grid = ReoGrid.ReoGridControl(winform);
var sheet1 = grid.CurrentWorksheet;
// 快速扩展到10万行
sheet1.Rows = 100000;
var data = []
for(i=1;100000;1){
table.push(data,"数据"+i);
}
// 定义范围:A1:A100000 参数 (起始行, 起始列, 行数, 列数)
var rangePos = ReoGrid.RangePosition(0, 0, 100000, 1);
sheet1.SetRangeData(rangePos, data);
//也可以用下标直接赋值
//sheet1[rangePos] = data;
// 固定单元格到 C6 (冻结单元格)
sheet1.FreezeToCell(5, 2);
winform.show();
win.loopMessage();
可以通过下标直接赋值,例如 sheet1[rangePos] = data 。不过使用 sheet1[rangePos] 获取值时返回的是 System.Object 数组,需要用 sheet1[rangePos].Value 解包为纯 aardio 数组。
所以这个的关键不是优化 ReoGrid 控件本身的速度,其实它已经很快了,而是要调整写程序的思路。
这就好比要把 100000 个人从上海运送到北京,用高铁循环运送 100000 次当然是不必要且低效的做法,在一瞬间读写控件 100000 次当然也是完全没有必要的。
类似的,在 aardio 调用 .NET 控件 DataGridView 的 示例 中也可以看到类似的技巧:
//一次读取所有数据到 aardio 数组
var data = dataTable.ExtractToArray();
//输出结果
for(i=1;#data;1){
winform.edit.dump( data[i] )
}
//修改数据
data[1][2]= 999;
//替换并更新原来的数据
dataTable.FillFromArray(data,true)
ReoGrid 将工作表从 100 行扩展到 100,000 行仅需 8 毫秒(0.008 秒)。
更新 100,000 个单元格数据仅需一秒,这意味着更新单个单元格只需 0.01 毫秒,速度非常快。

以下技术被用于提升和优化性能:
优化的内存管理
ReoGrid 采用优化的内存管理技术来提高单元格内存使用效率。该技术将大型电子表格在内存中分割为多个小型工作表,形成树状结构。内存分配和释放操作在这些分页的小型工作表上进行,从而在内存使用时间和大小之间取得良好平衡。

优化的边框算法
通常电子表格包含大量需要管理和显示的单元格边框。为了最大化渲染性能,ReoGrid 仅绘制可视区域内的边框。通过特殊算法可以快速建立可视区域与边框之间的映射关系,从而极速定位绘制起点。

优化的视口算法
ReoGrid 采用独特算法管理和渲染可视区域,实现冻结窗口、大纲和打印功能。每个视口独立工作,可单独缩放或滚动。该算法能最大化计算渲染区域的性能,优化文本渲染和图形绘制效率。

说明:
- 在 aardio 中通过 dotNet.ReoGrid 调用时,性能表现与原生 C# 版本完全一致
- 大规模数据操作建议使用数组作为参数批量读写 Excel,避免频繁跨语言调用
- 冻结窗格等高级功能通过优化算法保证流畅体验