找回密码
 立即注册

QQ登录

只需一步,快速开始

songpeng

金牌服务用户

3

主题

14

帖子

37

积分

金牌服务用户

积分
37
最新发帖
songpeng
金牌服务用户   /  发表于:2021-8-31 17:03  /   查看:5003  /  回复:14
1金币
本帖最后由 songpeng 于 2021-8-31 17:05 编辑


你好,前台通过在表单页面编辑之后,然后调用后端接口,通过file文件的形式接收,然后加水印之后在返回给前端下载,
但是目前拿到file之后通过输入流返回给前端,打开时报错,
无论加水印还是不加水印都报错。

还有一点,通过file形式,后台解析的数据会有一个隐藏的sheet页,这个是有什么作用?

  1. public Response<Void> exportExcel(@RequestParam("file") MultipartFile file, HttpServletResponse response) {
  2.         try {
  3.             Subject subject = SecurityUtils.getSubject();
  4.             Principal principal = (Principal) subject.getPrincipal();
  5.             String accountName = principal.getAccountName();
  6.             //获取名称
  7.             String fileName = file.getOriginalFilename();
  8.             //获取输入流
  9.             InputStream inputStream = file.getInputStream();
  10.             //转换成excel
  11.             XSSFWorkbook wb = new XSSFWorkbook(inputStream);
  12.             //水印的内容
  13.             String content = accountName + "-" + LocalDate.now();
  14.             ByteArrayOutputStream byteArrayOutputStream = createWaterMark(content);
  15.             //如果有多个sheet,遍历
  16.             int sheets = wb.getNumberOfSheets();
  17.             for (int i = 0; i < sheets; i++) {
  18.                 XSSFSheet sh = wb.getSheetAt(i);
  19.                 int pictureIdx = wb.addPicture(byteArrayOutputStream.toByteArray(), Workbook.PICTURE_TYPE_PNG);
  20.                 String rId = sh.addRelation(null, XSSFRelation.IMAGES, wb.getAllPictures().get(pictureIdx)).getRelationship().getId();
  21.                 sh.getCTWorksheet().addNewPicture().setId(rId);
  22.             }
  23.             //设置相应头
  24.             response.setContentType("application/octet-stream;charset=utf-8");
  25.             response.setCharacterEncoding("utf-8");
  26.             response.setHeader("Content-Disposition", "attachment;filename" + fileName);
  27.             //输出流
  28.             ServletOutputStream os = response.getOutputStream();
  29.             os.flush();
  30.             wb.write(os);
  31.             //关闭流
  32.             os.close();
  33.             wb.close();
  34.         } catch (Exception e) {
  35.             logger.error("导出失败:" + e);

  36.         }

  37.     }
复制代码

818afec340d777e39d1e2bcce82ce296.png
207a9d7809311f7ef5e6681d4f8e2bc1.png

最佳答案

查看完整内容

水印功能可以利用我们的背景单元格实现,这是学习指南的地址,您可以参考 https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/features/workbook/view-background# 如果您使用我们的save方法保存,那么后端的数据需要回传到前端的Spread对象才能正常导出,也就是将后端传的数据最终通过fromJSON反序列化到表单上,此时导出的Excel文件才有后端加的内容。 如果是您自定义的导出方法然后前端调用,这块我们无法保证 ...

14 个回复

倒序浏览
最佳答案
最佳答案
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-8-31 17:03:14
来自 12#
songpeng 发表于 2021-9-1 11:29
是表单上一定是要有数据是吗?如果没有数据是回报错,这个还没有验证过,等下试试?

我们的需求是这样 ...

水印功能可以利用我们的背景单元格实现,这是学习指南的地址,您可以参考
https://demo.grapecity.com.cn/sp ... ok/view-background#

如果您使用我们的save方法保存,那么后端的数据需要回传到前端的Spread对象才能正常导出,也就是将后端传的数据最终通过fromJSON反序列化到表单上,此时导出的Excel文件才有后端加的内容。

如果是您自定义的导出方法然后前端调用,这块我们无法保证数据的正确性,这块属于您业务的需求的。推荐您使用我们的save方法结合filesaver进行导出
https://demo.grapecity.com.cn/sp ... mport-export/purejs

这样即使导出的表单有问题也可能是我们的接口的问题我们也能定位去修,如果是您自定义的导出,这边可能没有办法进行支持。
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-8-31 17:48:44
2#
出现这个sheet也可能是因为GcExcel没有添加授权,请问您给GcExcel和SpreadJS添加授权了吗?

另外,这边有一个SpreadJS+GcExcel前后端结合的demo,您可以参考一下。
https://gcdn.grapecity.com.cn/fo ... hread&tid=90503
回复 使用道具 举报
songpeng
金牌服务用户   /  发表于:2021-8-31 18:08:01
4#
Derrick.Jiao 发表于 2021-8-31 17:48
出现这个sheet也可能是因为GcExcel没有添加授权,请问您给GcExcel和SpreadJS添加授权了吗?

另外,这边 ...

授权会有影响导出吗?我用postman工具测试我这个导出接口是可以导出的?
回复 使用道具 举报
songpeng
金牌服务用户   /  发表于:2021-8-31 18:12:57
5#
Derrick.Jiao 发表于 2021-8-31 17:48
出现这个sheet也可能是因为GcExcel没有添加授权,请问您给GcExcel和SpreadJS添加授权了吗?

另外,这边 ...

导出一定是要先保存之后才能导出吗?
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-8-31 18:32:36
6#
songpeng 发表于 2021-8-31 18:12
导出一定是要先保存之后才能导出吗?

在GcExcel以及SpreadJS使用时,如果没有添加授权,会有我们的水印页,因此才会出现您上面描述的出现多一张sheet页的情况。 image.png574156188.png

另外,这边看到您使用的是 XSSFWorkbook,有可能是第三方导出的问题。在前端您可以用open方法打开一个excel文件或者fromJSON反序列化加载一个json才能正常显示。


回复 使用道具 举报
songpeng
金牌服务用户   /  发表于:2021-8-31 18:37:26
7#
Derrick.Jiao 发表于 2021-8-31 18:32
在GcExcel以及SpreadJS使用时,如果没有添加授权,会有我们的水印页,因此才会出现您上面描述的出现多一 ...

我们没有用插件自带的导出,因为没有办法是加水印,所以我们自己写了一个导出方法。但是本地用postman测试导出文件,没有问题,可以打开,所以很不解?
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-9-1 10:15:43
8#
songpeng 发表于 2021-8-31 18:37
我们没有用插件自带的导出,因为没有办法是加水印,所以我们自己写了一个导出方法。但是本地用postman测 ...

您需要把responsetype设为blob,这样我们的的open方法才能正常导入Excel,例如 image.png236472167.png
回复 使用道具 举报
songpeng
金牌服务用户   /  发表于:2021-9-1 10:36:20
9#
Derrick.Jiao 发表于 2021-9-1 10:15
您需要把responsetype设为blob,这样我们的的open方法才能正常导入Excel,例如

我这里不是导入到系统中,而是从表格页面上是导出到本地打开excel?
您说的导入,我就有点迷惑了
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-9-1 11:00:57
10#
songpeng 发表于 2021-9-1 10:36
我这里不是导入到系统中,而是从表格页面上是导出到本地打开excel?
您说的导入,我就有点迷惑了

请问从后台传的数据是否加载到了SpreadJS表单上了呢?如果没有加载到表单上此时调用save方法保存Excel文件就是一个空表单,就会出现报错的情况。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部