请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

Funo-TSC

金牌服务用户

10

主题

40

帖子

106

积分

金牌服务用户

积分
106
Funo-TSC
金牌服务用户   /  发表于:2025-3-7 08:57  /   查看:81  /  回复:7
10金币

问题: 什么原因导致导入文件后空白区域较多,是excel文件自身的原因还是控件的问题
image.png475935668.png

7 个回复

倒序浏览
Wilson.Zhang
超级版主   /  发表于:2025-3-7 10:13:20
沙发
您好!Microsoft Excel 2003及之前的版本中一个sheet的行数上限是65536行,2007及之后的版本中sheet行数上限是1048576行。由于行数上限较多,在Excel中向下拖动垂直滚动条,给人的观感是可以一直拖动,好像无限制。

与此不同的是,SpreadJS sheet是canvas元素,初始时默认设置行数和列数分别为200和20,如下图所示:
1741313165570.png309253844.png

在实际使用过程中,可以根据需要自行设置行数和列数。也就是说S得益于canvas绘制SpreadJS支持对sheet内行列数的扩展,也因为这样的扩展性,在sheet底行下会有空白区域以容纳更多行。

当一个Excel文件被导入至SpreadJS中时,SpreadJS将仅提取原sheet中被使用的区域,如果活动单元格(也就是被选中的单元格)在使用区域外,将以活动单元格所在位置为边界,未被使用的区域均以空白区域显示,如下动图所示:
sheet区域.gif
回复 使用道具 举报
Funo-TSC
金牌服务用户   /  发表于:2025-3-7 10:23:22
板凳
Wilson.Zhang 发表于 2025-3-7 10:13
您好!Microsoft Excel 2003及之前的版本中一个sheet的行数上限是65536行,2007及之后的版本中sheet行数上 ...

如何去掉这些空白区域,因为空白区域太多导致操作时用户体验不佳
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-3-7 12:12:07
地板
Funo-TSC 发表于 2025-3-7 10:23
如何去掉这些空白区域,因为空白区域太多导致操作时用户体验不佳

去掉空白区域,是想呈现当前单元格铺满可视窗口呢还是让空白区域中也绘制出来单元格?

对于前者,先取消水平和垂直滚动条(因为要铺满的话,所有数据都在可视窗口内了,不需要再滚动了),然后对每行设置动态行高、对每列设置动态列宽,如下动图所示:
动态行高列宽.gif

可以参考如下代码:
  1. //  隐藏垂直滚动条
  2. spread.options.showVerticalScrollbar = false;
  3. //  隐藏水平滚动条
  4. spread.options.showHorizontalScrollbar = false;
  5. //  或在显示滚动条的情况下使用这行代码,以基于sheet内全部行高列宽总数显示滚动条
  6. spread.options.scrollbarMaxAlign = true;
  7. //  动态行高
  8. for (var i = 0; i < sheet.getRowCount(); i++) {
  9.     sheet.setRowHeight(i, '*');
  10. }
  11. //  动态列宽
  12. for (var j = 0; j < sheet.getColumnCount(); j++) {
  13.     sheet.setColumnWidth(j, '*');
  14. }
复制代码

对于后者,先计算当前sheet中总行高和总列宽,再获取viewport高度和列宽,以首行首列的行高和列宽分别为依据计算需要填满viewport区域所需的新增行数和列数,然后扩展行数和列数即可,如下动图所示:
铺满行列.gif

参考如下代码:
  1. //  获取viewport行高
  2. var viewportHeight = sheet.getViewportHeight(1);
  3. //  获取viewport列宽
  4. var viewportWidth = sheet.getViewportWidth(1);
  5. //  获取当前sheet总行高
  6. var heightSum = 0;
  7. for (var i = 0; i < sheet.getRowCount(); i++) {
  8.     heightSum += sheet.getRowHeight(i);
  9. }
  10. //  获取当前sheet总列宽
  11. var widthSum = 0;
  12. for (var j = 0; j < sheet.getColumnCount(); j++) {
  13.     widthSum += sheet.getColumnWidth(j);
  14. }
  15. //  计算填满空白区域所需新增行数
  16. var addedRowCount = Math.floor((viewportHeight - heightSum) / sheet.getRowHeight(0));
  17. //  计算填满空白区域所需新增列数
  18. var addedColCount = Math.floor((viewportWidth - widthSum) / sheet.getColumnWidth(0));
  19. //  扩展行数
  20. sheet.setRowCount(sheet.getRowCount() + addedRowCount);
  21. //  扩展列数
  22. sheet.setColumnCount(sheet.getColumnCount() + addedColCount);
复制代码

回复 使用道具 举报
Funo-TSC
金牌服务用户   /  发表于:2025-3-7 16:07:05
5#
Wilson.Zhang 发表于 2025-3-7 12:12
去掉空白区域,是想呈现当前单元格铺满可视窗口呢还是让空白区域中也绘制出来单元格?

对于前者,先取 ...

有些模板文件只有20行,渲染的时候却是默认200行,可不可以有多少行的内容就渲染多少行,类似于第一种方法,不需要隐藏滚动条,只是没有内容的区域太多了,滚动条太长了
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-3-7 17:48:01
6#
Funo-TSC 发表于 2025-3-7 16:07
有些模板文件只有20行,渲染的时候却是默认200行,可不可以有多少行的内容就渲染多少行,类似于第一种方 ...

您现在使用的是Designer还是SpreadJS控件(无工具栏)。

如果是Designer,可以使用FileUploaded事件监听文件加载成功,事件参数designer就是执行文件加载的Designer实例,也就是当前正在使用的Designer实例。通过Designer获取Workbook,再获取activeSheet,对activeSheet使用Worksheet:getUsedRange()获取使用的区域边界,将边界以外的行列删除。

如果您使用的是SpreadJS组件,那么需要使用Workbook:save()或Workbook:import()加载不同文件类型的模板,那么可以在成功回调函数中获取activeSheet,再获取usedRange,之后删除使用区域边界以外的行列。

您可以亲测了解下看是否能满足您的需求。
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-3-11 09:57:22
7#
您好! 请教下上述咱们讨论的方案是否能满足您的需要?
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:4 天前
8#
注意到楼主长时间未回复,那本帖就先结贴了,有问题欢迎另开新帖交流。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部