Column 中 访求 GetPreferredWidth() 性能问题
背景:数据列不固定,需要动态增加,列名称大小不一样,有的列名5个字符,有的20个字符等,所有需要有一个自适应的列宽的方法。
问题:已知 Column类中方法GetPreferredWidth() 可以调整宽度大小 ,但是当 有100列时 10000行时,此方法速度巨慢,程序直接卡死。
请问有什么办法可以解决这个问题。
GetPreferredWidth会遍历所有行,所以行数多了速度自然慢
可以参考下面的代码思路,
在需要获取时先把其他行删掉,获取后再设置回来
var array = sheet.GetArray(0, 0, 120000, 9);
sheet.RowCount = 1;
for (int c = 0; c < 9; c++)
{
sheet.Columns.Width = sheet.Columns.GetPreferredWidth();
}
sheet.RowCount = 120000;
sheet.SetArray(0, 0, array); 等二行是 的作用是? 根据你们的需求,把代码改了一下
可以用来计算适应列头文本的列宽
var array = sheet.GetArray(0, 0, 120000, 9);//保存原有数据
sheet.RowCount = 1;//设置行数为1
for (int c = 0; c < 9; c++)
{
sheet.SetValue(0, c, sheet.ColumnHeader.Cells.Value);//拷贝列头到第一行
sheet.Columns.Width = sheet.Columns.GetPreferredWidth() + 1;//计算适应列头的列宽
}
sheet.RowCount = 120000;
sheet.SetArray(0, 0, array);//还原原有数据 Richard.Ma 发表于 2023-8-1 10:40
根据你们的需求,把代码改了一下
可以用来计算适应列头文本的列宽
试过了,有两个问题: 1、sheet.SetValue(0, c, sheet.ColumnHeader.Cells.Value);这段代码sheet.ColumnHeader.Cells.Value 获取的值是 null .
2、当有10W行 100列的时候 时间还是需要 18-20秒时间。
Stopwatch stopwatch = Stopwatch.StartNew();
设置数据源的话,可以用sheet.ColumnHeader.Columns.Label来获取列头值
速度你可以参考这个demo,你那边速度比较慢的话,请上传demo,否则没法判断原因
页:
[1]