找回密码
 立即注册

QQ登录

只需一步,快速开始

louis

注册会员

7

主题

28

帖子

71

积分

注册会员

积分
71
louis
注册会员   /  发表于:2021-3-17 17:44  /   查看:5966  /  回复:11
场景:
  1. colHeader 类型上包含多行自动合并 rowColumn 策略
  2. viewport 上包含多行自动合并 column 策略

导出(includeAutoMergedCells),各种合并全部失效

即便是想介入,重新配置 range,你会发现:
SpreadJS 的导出过程应该是先处理 viewport 再把 colHeader 插入到 viewport 之前,因此完全没有机会去配置一个合理的 range。

期望导出时候,colHeader 先输出,并保留合并的 range,然后输出 viewport,并将其 range 进行下沉。

11 个回复

倒序浏览
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-3-17 18:32:39
沙发
您刚好说反了,策略应该是先把colheader合并到viewport中再导出。之所以会造成您的错觉,应该是您在导出时候没有设置columnHeadersAsFrozenRows,因为Excel不支持列头自定制,所以如果不设置columnHeadersAsFrozenRows则不会导出列头,设置了columnHeadersAsFrozenRows后,会将列头下沉到viewport中再导出。
但是这里我在测试时候也发现了一个问题,就是按照您上面的步骤导出之后列头的合并会变成按column进行合并。所以也从侧面印证了是先将colheader合并到viewport中再按照viewport中的automerge导出。我会将导出没有按照colHeader中的automerge设置导出的问题上报
回复 使用道具 举报
louis
注册会员   /  发表于:2021-3-17 19:01:55
板凳
有可能说反了吧,我测试的实际情况是(导出前,尝试重定义合并的range),其目的是为了解这个问题,将多行colheader被导出复制到viewport的区域进行重定义。然而发现只有row索引为0才对viewport生效(导出前的那块区域),我想尝试将索引下沉列头行数应用新的合并(导出后看到的那块不包含头部的区域),则会不应用或报错,因此猜测导出是先viewport后colheader,具体啥情况,你们是这方面的专家。
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-3-18 09:31:11
地板
louis 发表于 2021-3-17 19:01
有可能说反了吧,我测试的实际情况是(导出前,尝试重定义合并的range),其目的是为了解这个问题,将多行c ...

你看一下这个demo,demo中的列头导出合并后沿用了viewport中的automerge设置,所以可以判断出事现将列头下沉到viewport区域然后合并导出

features_cells_auto-merge_header-auto-merge_JavaScript.zip

2.3 KB, 下载次数: 434

回复 使用道具 举报
louis
注册会员   /  发表于:2021-3-18 11:11:59
5#
嗯嗯,老大费心了!
如下,下面是我推断的理由(完全可能是错的),但这无关紧要,你们能修复,提供一个保持一致的方法就好。
  1. document.getElementById('export').onclick = function(){
  2.         const sheet = spread.getActiveSheet();
  3.         // 开始尝试导出前重置 range 来修复合并问题(假设导出后是先 colHeader 后 viewport)
  4.         // 1.先清空已定义的合并
  5.         const fullRange = new GC.Spread.Sheets.Range(-1, -1, -1, -1);
  6.         sheet.autoMerge(fullRange, GC.Spread.Sheets.AutoMerge.AutoMergeDirection.none);

  7.         // 2. 定义colHeader合并范围(<b>实际上应用到了导出excel的第3~4行</b>)
  8.         const headerRange = new GC.Spread.Sheets.Range(0, 0, 2, 10);
  9.         sheet.autoMerge(headerRange, GC.Spread.Sheets.AutoMerge.AutoMergeDirection.rowColumn, GC.Spread.Sheets.AutoMerge.AutoMergeMode.restricted, GC.Spread.Sheets.SheetArea.viewport);
  10.         // 3. 定义viewport合并范围(<b>实际上应用到了导出excel的第5+行</b>)
  11.         const viewrRange = new GC.Spread.Sheets.Range(2, 0, 10, 10);
  12.         sheet.autoMerge(viewrRange, GC.Spread.Sheets.AutoMerge.AutoMergeDirection.column, GC.Spread.Sheets.AutoMerge.AutoMergeMode.restricted, GC.Spread.Sheets.SheetArea.viewport);
  13.         // 通过2,3对应实际导出 excel 导出后看到的效果,猜测是先 viewport 后 插入(比如 insertAtRow(0)) colHeader 的
  14.                
  15.                 var json = spread.toJSON({includeAutoMergedCells:true,columnHeadersAsFrozenRows:true});

  16.         // here is excel IO API
  17.         excelIo.save(json, function (blob) {
  18.             saveAs(blob, "export.xlsx");
  19.         }, function (e) {
  20.             // process error
  21.             console.log(e);
  22.         });
  23.         };
复制代码


回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-3-18 11:40:33
6#
这个目前已经当bug处理了,高优先级,bug编号SJS-8009。等修了就好了。目前手动确实也不好处理
回复 使用道具 举报
louis
注册会员   /  发表于:2021-3-18 12:10:25
7#
谢谢老大!手动的话自己把头移动下来,分开重设,导出后恢复变更就好,不过代码看着蹩脚!你们能修复再好不过了,非常感谢!
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-3-18 13:34:28
8#
不客气,好了后我会在这个帖子里回复您
回复 使用道具 举报
louis
注册会员   /  发表于:2021-4-2 13:35:18
9#
老大们,此问题得到修复了吗?
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-4-2 13:40:09
10#
您好,此问题已在V14.0.10中修复,您可以通过npm升级。请升级至最新版本测试下。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部