请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

金牌服务用户

26

主题

93

帖子

243

积分

金牌服务用户

积分
243

金牌服务用户   /  发表于:2021-7-22 11:51  /   查看:1459  /  回复:9
GCExcel 异步请求 导入json转pdf
  1. workbook.save("22.pdf", SaveFileFormat.Pdf);
复制代码
image.png320402220.png
保存还没有成功,请求就结束了。这里有没有同步的方法,等待保存成功,在return

9 个回复

倒序浏览
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-7-22 12:21:46
沙发
你好 save方法是同步的,请问您描述的异步请求是指哪一步呢?麻烦您再详细描述一下您的需求。
回复 使用道具 举报

金牌服务用户   /  发表于:2021-7-22 12:42:07
板凳
Derrick.Jiao 发表于 2021-7-22 12:21
你好 save方法是同步的,请问您描述的异步请求是指哪一步呢?麻烦您再详细描述一下您的需求。

前端异步请求,请求接口生成PDF文件,会报上面那张图的错误,如果使用window.open,请求这个链接就可以正常生成
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-7-22 13:47:28
地板
浩 发表于 2021-7-22 12:42
前端异步请求,请求接口生成PDF文件,会报上面那张图的错误,如果使用window.open,请求这个链接就可以正 ...

这边有一个类似的demo,您可以参考一下,若仍未解决您的问题,建议您提供能复现问题的demo,或者在此demo中复现。这边会为您做进一步调研。

demo-1.zip

277.07 KB, 下载次数: 30

回复 使用道具 举报

金牌服务用户   /  发表于:2021-7-22 14:34:58
5#
Derrick.Jiao 发表于 2021-7-22 13:47
这边有一个类似的demo,您可以参考一下,若仍未解决您的问题,建议您提供能复现问题的demo,或者在此demo ...

这个demo是将生成的文件直接返回了,我们的需求是生成在服务器本地的文件,您把ByteArrayOutputStream换成本地文件试一下orkbook.save(fileName, SaveFileFormat.Pdf);
回复 使用道具 举报

金牌服务用户   /  发表于:2021-7-22 15:18:04
6#
可以了,用fetch发送的请求可以,用axios不行
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-7-22 16:05:21
7#
正常来说后端GcExcel在save的时候不存在同步还是异步的问题。一般来说做服务端保存时,首先会先导入json。如果前端传递到后端是一个完整的json,那么workbook.fromjson就一定会成功,反之则会失败报错。而save pdf的操作是在fromjson之后的,fromjson这步操作一定是同步的,save的时候一定是基于一个正确被导入的workbook在做导出PDF。这也是之前为什么说save不存在同异步问题。
至于您说axios不行,换成fetch就可以。这个应该是您工程或者代码写法造成的问题,之前我们有很多的用户用axios来做请求,没有出现过这样的问题。由于您没有提供先关的demo,我们没办法帮您做代码上的排查,您可以自行再排查一下前后端的交互这块。
回复 使用道具 举报

金牌服务用户   /  发表于:2021-7-22 16:19:46
8#
Clark.Pan 发表于 2021-7-22 16:05
正常来说后端GcExcel在save的时候不存在同步还是异步的问题。一般来说做服务端保存时,首先会先导入json。 ...
  1. List<String> list = StrSplitter.split(paths, ",", true, true);
  2.         ByteArrayOutputStream out = new ByteArrayOutputStream();
  3.         Workbook workbook = new Workbook();
  4.         for (int i = 0; i < list.size(); i++) {
  5.             String path = list.get(i);
  6.             if(i == 0){
  7.                 workbook.open(LimsConfig.getReportPath()+"/storage/app/"+path+"/excel.json");
  8.             }else{
  9.                 Workbook newWorkbook = new Workbook();
  10.                 newWorkbook.open(LimsConfig.getReportPath()+"/storage/app/"+path+"/excel.json");
  11.                 for (IWorksheet sheet : newWorkbook.getWorksheets()) {
  12.                     IWorksheet newSheet = workbook.getWorksheets().add();
  13.                     sheet.setName(workbook.getWorksheets().get(sheet.getIndex()).getName() + i);
  14.                     String json = sheet.toJson();
  15.                     newSheet.fromJson(json);
  16.                 }
  17.             }
  18.         }
  19.         // 保存为pdf
  20.         String fileName = "print"+ DateUtil.format(new Date(), "yyyyMMddHHmmss") + ".pdf";
  21.         workbook.save(LimsConfig.getPrintPath()+fileName, SaveFileFormat.Pdf);
  22.         return AjaxResult.success("打印文件获取成功",fileName);
复制代码
  1. // 不可以
复制代码
两种方式的只是前段传递的方式不一样
回复 使用道具 举报

金牌服务用户   /  发表于:2021-7-22 16:24:10
9#
找到原因了,header设置为'Content-Type': 'application/json;charset=utf-8'就不行了。
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-7-22 16:42:46
10#
, 问题解决了就好
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部