解释一下为什么建议GcExcel来做,而不是用SpreadJS的原因:
1.工作簿合并的工作本身在服务端完成更加合理,因为前端性能不宜大量的进行文件读取,合并的功能如果是两个工作簿还好,如果是循环处理将多个工作簿合并成一个这样的常见操作,前端的性能不足以能够很好支持。
2.从SpreadJS的结构上来说,一个Workbook是一个实体,多个workbook之间的合并操作数据多个实体间的操作,这里在目前的功能需求上没有过多的涉及。看上去sheet.toJSON和fromJSON能处理,但本身该接口的设计并不是用来处理合并的,并且处理过程中对于冲突这部分需要用户自行解决。
3.GcExcel本身后端对文件操作本身就有优势,而且文档类的产品特性,不需要考虑界面的绘制问题,使得跨Workbook的合并操作更加方便,且GcExcel本身支持了该功能也handle了冲突处理这部分。
综上所述,我们建议用GcExcel完成此类操作。如果用户还是选择通过SpreadJS来完成的话,需要自行解决冲突的部分。
如果选择GcExcel来完成上述合并操作参考下面的文档,直接使用文档中提供的API来完成:
多工作簿之间剪切/拷贝区域:https://demo.grapecity.com.cn/documents-api-excel-java/demos/cutcopyrangebetweenworkbooks
在工作薄之间复制工作表:https://demo.grapecity.com.cn/documents-api-excel-java/demos/copyworksheetbetweenworkbooks
在工作薄之间移动工作表:https://demo.grapecity.com.cn/documents-api-excel-java/demos/moveworksheetbetweenworkbooks
我想吃麻薯 发表于 2023-12-21 21:18
就是因为GC EXCEL处理会有很多问题才转到前端处理的
您在使用 GcExcel 合并 workbook 时,遇到了什么样的问题。
可以详细说说吗? JoeJin 发表于 2023-12-22 16:06
您在使用 GcExcel 合并 workbook 时,遇到了什么样的问题。
可以详细说说吗?
这块我不太清除,等我们同事来解释一下哈 JoeJin 发表于 2023-12-22 16:06
您在使用 GcExcel 合并 workbook 时,遇到了什么样的问题。
可以详细说说吗?
我们的抽象场景如下
1.数据源: workbook1中含有sheet A ,B,C。workbook2中含有sheet A,C,D。
2.原始需求: 将workbook1中的sheet A,C用workbook2中的A,C替换。并且将workbook2中的Sheet D加入到workbook1中。获得的新workbook3中,ABCD原有公式及样式得得到保留。
难点:
1.替换sheet并保留公式,最直接的方式应该是对同名sheet进行fromJson的操作进行替换,但在实际使用中发现,fromJson/toJson不如sheet.copy稳定并且不会自动处理样式。
2.如果使用sheet.copy来做,那么必须将所有需要的sheet全部汇入到一个new Workbook中.因为如果目标workbook中存在同名sheet,copy的时候会报错。
3.使用2的方式进行合并sheet,发现workbook1中的主题样式等会有丢失情况,有几率导致数据丢失,并且在最后save的时候出现报错。
4.在实际场景中用户会多次合并,最终导致样式丢失,部分数据丢失,甚至无法保存。
在这个流程中,用户的原始excel会被转换成spreadjs,再转到gcexcel进行合并。最常见的情况是,原始excel中的样式转换成spreadjs中就开始丢失,或者spreadjs转换正常,但是拿sjs/ssjson文件到gcexcel中就丢失。
关于类似问题,我们也有多次提出,但受限于原始数据源的保密问题,很多情况都无法做出具体demo来提供反馈。 chess3cake 发表于 2023-12-27 12:00
我们的抽象场景如下
1.数据源: workbook1中含有sheet A ,B,C。workbook2中含有sheet A,C,D。
想确认一下,难点里提到的都是使用GcExcel的 API 遇到的问题吗?
GcExcel 已经支持跨 Workbook 复制和移动 Worksheet.
https://demo.grapecity.com.cn/documents-api-excel-java/demos/copyworksheetbetweenworkbooks
如果是的话,您可以尝试提供一些demo,我们当做Bug修复。
GcExcel 这边复制的 API,会自己处理样式,同时遇到同名的sheet,会自动 rename,不会报错。
另外,如果您SJS 和 GcExcel 之间沟通时,使用 SJS/SSJSON遇到问题,也可以尝试用 xlsx 来试试。 本帖最后由 chess3cake 于 2023-12-27 20:24 编辑
JoeJin 发表于 2023-12-27 17:54
想确认一下,难点里提到的都是使用GcExcel的 API 遇到的问题吗?
GcExcel 已经支持跨 Workbook 复制和移 ...
都是在之前版本中遇到的问题,目前已经换成了spreadjs处理的方案。之后有空再尝试一下。
在这个场景中我们期望的其实是“替换”同名sheet,且保留其他sheet对该sheet的公式引用。即使复制API能够提供重名的能力,我们还需要删除原始sheet,并对新sheet进行重命名,在worksheet.delete()时,其他sheet对该公式的引用会丢失,具体公式会变成#REF,有办法延迟这个公式变更吗?
我们之所以选择sjs/ssjson作为主要沟通方式,是因为我们的用户网络带宽受限且sjs/ssjson文件大小相对于xlsx有明显减小。spreadjs/gcexcel之间的沟通在使用xlsx的情况下,可以有效避免前后端兼容性问题吗?如果使用xlsx沟通,我们仍然存在xlsx->spreadjs->xlsx->gcexcel->xlsx->spreadjs这样一个转换过程。在这样一个过程中,哪个地方使用xlsx/sjs/ssjson会更好?
我们之所以选择sjs/ssjson作为主要沟通方式,是因为我们的用户网络带宽受限且sjs/ssjson文件大小相对于xlsx有明显减小。spreadjs/gcexcel之间的沟通在使用xlsx的情况下,可以有效避免前后端兼容性问题吗?如果使用xlsx沟通,我们仍然存在xlsx->spreadjs->xlsx->gcexcel->xlsx->spreadjs这样一个转换过程。在这样一个过程中,哪个地方使用xlsx/sjs/ssjson会更好?
这个只是一种建议,本质上我们还是推荐您使用 SJS/SSJSON 来进行传输。但主要是您的场景比较复杂,又不好分享复现 Demo,所以才会有这样的一个建议。 在这个场景中我们期望的其实是“替换”同名sheet,且保留其他sheet对该sheet的公式引用。即使复制API能够提供重名的能力,我们还需要删除原始sheet,并对新sheet进行重命名,在worksheet.delete()时,其他sheet对该公式的引用会丢失,具体公式会变成#REF,有办法延迟这个公式变更吗?基于目前GcExcel的情况,这个问题还有一个解决方案就是用跨workbook的区域赋值,在不删除原始sheet的前提下,将另一个worksheet中的内容以区域复制的方式复制到原始sheet上。这种情况应该不会造成#REF的问题。
建议使用 GcExcel 解决原始的需求,如果碰到问题,及时告知,我们一起来解决。
SpreadJS 目前没有计划增加合并的功能
页:
1
[2]