找回密码
 立即注册

QQ登录

只需一步,快速开始

afei_liuge
金牌服务用户   /  发表于:2023-7-31 16:59  /   查看:2530  /  回复:5

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

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

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

5 个回复

倒序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-7-31 18:08:05
沙发
GetPreferredWidth会遍历所有行,所以行数多了速度自然慢
可以参考下面的代码思路,
在需要获取时先把其他行删掉,获取后再设置回来

  1. var array = sheet.GetArray(0, 0, 120000, 9);
  2.             sheet.RowCount = 1;
  3.             for (int c = 0; c < 9; c++)
  4.             {
  5.                 sheet.Columns[c].Width = sheet.Columns[c].GetPreferredWidth();

  6.             }
  7.             sheet.RowCount = 120000;
  8.             sheet.SetArray(0, 0, array);
复制代码
回复 使用道具 举报
afei_liuge
金牌服务用户   /  发表于:2023-7-31 18:15:18
板凳
等二行是 的作用是?
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-8-1 10:40:58
地板
根据你们的需求,把代码改了一下
可以用来计算适应列头文本的列宽

  1.             var array = sheet.GetArray(0, 0, 120000, 9);//保存原有数据
  2.             sheet.RowCount = 1;//设置行数为1
  3.             for (int c = 0; c < 9; c++)
  4.             {
  5.                 sheet.SetValue(0, c, sheet.ColumnHeader.Cells[0, c].Value);//拷贝列头到第一行
  6.                 sheet.Columns[c].Width = sheet.Columns[c].GetPreferredWidth() + 1;//计算适应列头的列宽

  7.             }
  8.             sheet.RowCount = 120000;
  9.             sheet.SetArray(0, 0, array);//还原原有数据
复制代码
回复 使用道具 举报
afei_liuge
金牌服务用户   /  发表于:2023-8-1 14:00:54
5#
Richard.Ma 发表于 2023-8-1 10:40
根据你们的需求,把代码改了一下
可以用来计算适应列头文本的列宽

试过了,有两个问题: 1、  sheet.SetValue(0, c, sheet.ColumnHeader.Cells[0, c].Value);  这段代码sheet.ColumnHeader.Cells[0, c].Value 获取的值是 null .
2、当有10W行 100列的时候 时间还是需要 18-20秒时间。
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-8-1 14:51:01
6#

  1. Stopwatch stopwatch = Stopwatch.StartNew();
复制代码


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


WinFormsNET6Test.zip (21.97 KB, 下载次数: 507)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部