afei_liuge 发表于 2023-7-31 16:59:02

Column 中 访求 GetPreferredWidth() 性能问题


背景:数据列不固定,需要动态增加,列名称大小不一样,有的列名5个字符,有的20个字符等,所有需要有一个自适应的列宽的方法。

问题:已知 Column类中方法GetPreferredWidth() 可以调整宽度大小 ,但是当 有100列时 10000行时,此方法速度巨慢,程序直接卡死。

请问有什么办法可以解决这个问题。

Richard.Ma 发表于 2023-7-31 18:08:05

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);

afei_liuge 发表于 2023-7-31 18:15:18

等二行是 的作用是?

Richard.Ma 发表于 2023-8-1 10:40:58

根据你们的需求,把代码改了一下
可以用来计算适应列头文本的列宽

            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);//还原原有数据

afei_liuge 发表于 2023-8-1 14:00:54

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秒时间。

Richard.Ma 发表于 2023-8-1 14:51:01


Stopwatch stopwatch = Stopwatch.StartNew();

设置数据源的话,可以用sheet.ColumnHeader.Columns.Label来获取列头值
速度你可以参考这个demo,你那边速度比较慢的话,请上传demo,否则没法判断原因




页: [1]
查看完整版本: Column 中 访求 GetPreferredWidth() 性能问题