本帖最后由 Wilson.Zhang 于 2024-9-9 17:28 编辑
SpradJS的自定义序列化格式为.ssjson,其本质是json数据格式,涵盖了电子表格的结构、样式、数据等所有内容。除了可以针对Workbook序列化外,也可以针对Workbook中的某张Worksheet序列化,但一次只可以序列化一张Worksheet。可是呢,在序列化单张Worksheet时,经常会出现序列化前后Worksheet的样式不一致。追其缘由,是关乎产品设计的历史原因:一部分样式跟随Workbook序列化,另一部分样式跟随Worksheet序列化,即一张Worksheet的样式是Workbook和Worksheet上样式的合集。如果只对Worksheet序列化,那么序列化文件中包含的样式可能是不完整的,对这样的序列化文件执行反序列化,得到的文件内容必然与序列化之前不一致。因此,如果想要完整复刻Worksheet的所有样式,需要对整个Workbook序列化,而剩余的样式正是以namedStyles属性值的形式保存在Workbook中。
如果一定要只序列化Workbook中的某一张Worksheet,且希望能完整复刻其所有样式呢?答案也很浅显,只序列化包含该Worksheet的Workbook。对Workbook中每张Worksheet,都可以采用这样的方法代替直接对Worksheet序列化。那么,如果希望将所有Worksheet内容又反序列化在同一个Workbook内呢?前面说到用序列化只包含某张特定Worksheet的Workbook代替序列化指定Worksheet,反序列化的目标对象就是一个Workbook,串联式依次反序列化多个Workbook的结果便是较后者的反序列化结果代替较前者的反序列化结果,页面上呈现的Workbook中只有一张Worksheet,好似“铁打的Workbook,流水的Worksheet”。所以,要在反序列化时上手段了。
在反序列化每一个Worksheet对应的Workbook时,将其反序列化到临时Workbook,再反序列化临时Workbook中唯一的Worksheet到临时Worksheet,之后将临时Workbook上的命名样式逐一添加至临时Worksheet。如此一来,临时Worksheet不仅包含了原Worksheet的数据,同时完整保留了其样式。对每个Worksheet对应的Workbook,都遵照上述反序列化过程得到多个临时Worksheet,将这些保留了原Worksheet完整样式和数据的临时Worksheet顺次整合至工作的Workbook中,即可实现目标。
具体的序列化和反序列化方案如下所示:
1. 复制Workbook,记为CopiedWorkbook。
2. 在CopiedWorkbook中仅保留某个Worksheet,删除其他Worksheet。
3. 序列化CopiedWorkbook,记作CopiedJSON。
4. 对Workbook中的每张Worksheet作如上处理,代替单独序列化每个Worksheet。
5. 读入时,创建新的Workbook实例,在该Workbook实例中读入一个CopiedJSON,记为NewWorkbook。
6. 获取NewWorkbook中的命名样式,即Workbook:getNamedStyles(),记为NamedStyles。
7. 创建Worksheet实例,令其读入NewWorkbook中唯一Worksheet的序列化结果(即Worksheet:toJSON()),记为NewWorksheet。
8. 为NewWorksheet添加NamedStyles中的每个样式,这样便能令每张Worksheet保留原先的样式。
9. 再创建一个Workbook,将第8步得到的Worksheet逐一添加至该Workbook中即可复原。
如图1所示即为上述方案的实现效果。
图1. 序列化单个Worksheet且保留其全部Style
如果阅读上述内容颇感抽象,请结合上述内容参考附件demo理解。
|