找回密码
 立即注册

QQ登录

只需一步,快速开始

机灵鬼

金牌服务用户

6

主题

21

帖子

59

积分

金牌服务用户

积分
59
最新发帖
机灵鬼
金牌服务用户   /  发表于:2021-12-28 19:25  /   查看:3377  /  回复:17
当前问题背景:前端使用spreadJs生成excel对应的json串,后端使用gcexcel fromJson&save api生成写出对应的excel。

实际场景中表会比较大导致原始json也较大,导致在使用gcexcel.fromJson(str)时由于字符串太大出现oom,fromJson内部对字符串进行getBytes操作时长度过长,请问对于这种情况是否有其他方案可解决。

大致报错信息如下:
Caused by: java.lang.OutOfMemoryError: Requested array size exceeds VM limit
        at java.lang.StringCoding$StringEncoder.encode(StringCoding.java:300)
        at java.lang.StringCoding.encode(StringCoding.java:344)
        at java.lang.String.getBytes(String.java:918)
        at com.grapecity.documents.excel.B.aj.a(Unknown Source)
        at com.grapecity.documents.excel.Workbook.fromJson(Unknown Source)
        at com.grapecity.documents.excel.Workbook.fromJson(Unknown Source)


17 个回复

倒序浏览
机灵鬼
金牌服务用户   /  发表于:2021-12-29 13:49:07
来自 9#
本帖最后由 机灵鬼 于 2021-12-29 13:54 编辑

目前在使用gcexcel去写出excel的时候我们并没有太复杂的操作主要就是通过字符串去写,但是对于字符串太大的在fromjson时候会报上面我发的错误,使用方式是这样目测是在将字符串转换流时oom了, image.png465331115.png image.png847820129.png image.png877700195.png
image.png878123168.png
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-12-30 09:23:59
推荐
机灵鬼 发表于 2021-12-29 19:09
好的,对于这个json的生成,是针对大于一定数据量之后要下载的表格前端使用pako对其进行分块压缩(分块压 ...

从这块的描述来看跟产品的相关性可能就不太大了,这块可能需要你来做对应的优化。如果咱们前端用的SpreadJS,那么也正如前面所说的可以通过SpreadJS的toJSON接口产生json(58M)传给后端GcExcel去处理,这个大小是没有压力的。光从这部分的描述来看这个800多兆大小的sheet属于一个不太合理的json大小。也有可能是在拼接的哪步过程中产生一些冗余的数据这边就不得而知了。·
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-12-29 09:50:03
沙发
你好,建议你可以尝试利用GZIP对json串在传递前后做一个压缩与解压缩,可以参考附件的demo。 PDFExport 2.zip (6.98 MB, 下载次数: 270)
回复 使用道具 举报
FuKun
注册会员   /  发表于:2021-12-29 10:27:27
板凳
Derrick.Jiao 发表于 2021-12-29 09:50
你好,建议你可以尝试利用GZIP对json串在传递前后做一个压缩与解压缩,可以参考附件的demo。

gzip只是解决网络传输大小;
如果后端java报错nio buffer,针对整个文件转成json过大,可以把一个文件拆分成:一个主体框架结构的json(不包含每个sheet页的内容),和每个sheet页的json。然后后面加载打开文件时,先打开主体框架 fromJson,再依次加载每个sheet的json。
注意公式问题、依次串行加载。
回复 使用道具 举报
机灵鬼
金牌服务用户   /  发表于:2021-12-29 10:46:31
地板
Derrick.Jiao 发表于 2021-12-29 09:50
你好,建议你可以尝试利用GZIP对json串在传递前后做一个压缩与解压缩,可以参考附件的demo。

好的我看下谢谢
回复 使用道具 举报
机灵鬼
金牌服务用户   /  发表于:2021-12-29 10:50:20
5#
FuKun 发表于 2021-12-29 10:27
gzip只是解决网络传输大小;
如果后端java报错nio buffer,针对整个文件转成json过大,可以把一个文件拆 ...

您说的这种方式大致流程应该是workbook主体信息fromjson一次,之后对每个sheet单独fromjson对吧,但是目前是单个sheet的json就达到了800兆多,所以针对单个sheet去生成workbooksheet一样会oom,是否可以对sheet下的datatable做拆分呢
回复 使用道具 举报
机灵鬼
金牌服务用户   /  发表于:2021-12-29 10:59:21
6#
Derrick.Jiao 发表于 2021-12-29 09:50
你好,建议你可以尝试利用GZIP对json串在传递前后做一个压缩与解压缩,可以参考附件的demo。

请问写excel的时候可不可以这样,把一个原始待下载的json分成一个主体框架结构的json(不包含每个sheet页的内容),和每个sheet页的json。然后后面加载打开文件时,先打开主体框架 fromJson,再依次加载每个sheet的json,最后在组装到一起
回复 使用道具 举报
FuKun
注册会员   /  发表于:2021-12-29 11:05:29
7#
机灵鬼 发表于 2021-12-29 10:50
您说的这种方式大致流程应该是workbook主体信息fromjson一次,之后对每个sheet单独fromjson对吧,但是目 ...

单个sheet页有这么大
回复 使用道具 举报
FuKun
注册会员   /  发表于:2021-12-29 11:07:23
8#
FuKun 发表于 2021-12-29 11:05
单个sheet页有这么大

转成json序列化的时候,可以把没必要的东西去掉,sheet.toJson(serializationOptions) 比如,忽略样式 、忽略公式、忽略行列之外的区域等等
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-12-29 14:27:42
10#
机灵鬼 发表于 2021-12-29 10:50
您说的这种方式大致流程应该是workbook主体信息fromjson一次,之后对每个sheet单独fromjson对吧,但是目 ...

请问你的800多兆的表单上大概有什么内容呢?上面描述的方案可以尝试,因为这边没有测试类似的拆分拼接,无法保证是否正常。并且修改json,容易出现一些难以定位的问题。建议把对应的原始表单提供,我们看下是否可以在内部做优化。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部