您好,这边调研结果如下:
这个问题简单来说,与Excel和SpreadJS Style系统的差异有关。
如果您改变了 SpreadJS 中的某些内容:
将其保存为SpreadJS json或sjs格式,然后导入该ssjson和sjs文件,SpreadJS将确保所有当前状态都将被恢复。
但是,如果将SpreadJS保存到Excel中,则需要在SpreadJS和Excel之间进行大量转换,包括样式转换(将SpreadJS样式系统转换为Excel样式系统)、字体转换等。
我们不能保证导入一个由SpreadJS导出的Excel文件,可以完全恢复SpreadJS保存时的状态,因为我们需要进行另一轮转换,将Excel功能映射到SpreadJS的功能。
这就是为什么在json中,它是一个样式对象,但是一旦导出到Excel,再导入,它就变成了一个字符串名称。
这是因为Excel样式是用共享样式系统设计的,当导出到Excel时,SpreadJS会将SpreadJS样式对象转换为假单元格样式以匹配Excel样式策略。一旦导入了一个Excel文件,SpreadJS就会将Excel共享样式系统转换为SpreadJS命名样式系统,在这个过程中,有很多复杂的逻辑来确保最终的结果与在Excel和SpreadJS中“看到”的结果相同。
回到您的五个步骤上来:
在第二步中,由于这种样式与Excel默认样式完全不同,因此,我们创建一个假单元格XFS节点,然后将该节点指向单元格样式索引。
在第三步中,导入模板文件,需要将Excel样式转换为SpreadJS样式,并且假单元格XFS节点将转换为SpreadJS中的命名样式,并且映射的名称样式将包含Excel默认样式属性,与在第一步中看到的不一样。
在第四步中,样式对象等于Excel默认样式,除了Excel不支持的特性“cellType”,当将此样式转换为Excel样式时,SpreadJS发现它等于默认样式,则不会创建假单元格XFS节点,而是将默认样式单元格XFS节点索引映射到单元格。
在第五步中,工作表的默认样式已经更改,并且单元格没有样式,因此,当您更改工作表前景色时,它可能会受到工作表默认样式的影响。
真实情况比我说的要复杂得多,简单来说,您不应该使用Excel作为SpreadJS序列化和反序列化内容,转换后的Excel可能会破坏不同功能之间的关系。
因此,您应该使用ssjson或sjs文件格式。 |