找回密码
 立即注册

QQ登录

只需一步,快速开始

Wilson.Zhang

超级版主

20

主题

1219

帖子

1693

积分

超级版主

Rank: 8Rank: 8

积分
1693
Wilson.Zhang
超级版主   /  发表于:2024-9-9 17:25  /   查看:57  /  回复:0
本帖最后由 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所示即为上述方案的实现效果。

序列化Worksheet保存样式.gif

图1. 序列化单个Worksheet且保留其全部Style

如果阅读上述内容颇感抽象,请结合上述内容参考附件demo理解。

序列化Worksheet且保留样式(Designer版本).html

9.09 KB, 下载次数: 4

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部