找回密码
 立即注册

QQ登录

只需一步,快速开始

songpeng

金牌服务用户

3

主题

14

帖子

37

积分

金牌服务用户

积分
37
最新发帖
songpeng
金牌服务用户   /  发表于:2021-8-31 17:03  /   查看:5002  /  回复: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

14 个回复

正序浏览
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-9-2 14:36:53
16#
songpeng 发表于 2021-9-2 14:25
https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=99165&extra=page%3D1
借鉴了这个帖子, ...

解决了就好,有新问题欢饮开新帖交流~
回复 使用道具 举报
songpeng
金牌服务用户   /  发表于:2021-9-2 14:25:14
15#
Derrick.Jiao 发表于 2021-9-1 18:38
如果是导出到Excel就没有太好的方法了,Excel不支持表单背景图的设计。

https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=99165&extra=page%3D1
借鉴了这个帖子,给了启发,前端加上 responseType:blob 这个就可以了,感谢!!
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-9-1 18:38:16
14#
songpeng 发表于 2021-9-1 17:41
用插件的方法设置背景图片只能是一张默认的图片,这个也不能导出吧,
我们的水印是要求动态的,也就是根 ...

如果是导出到Excel就没有太好的方法了,Excel不支持表单背景图的设计。
回复 使用道具 举报
songpeng
金牌服务用户   /  发表于:2021-9-1 17:41:25
13#
Derrick.Jiao 发表于 2021-9-1 17:11
水印功能可以利用我们的背景单元格实现,这是学习指南的地址,您可以参考
https://demo.grapecity.com.c ...

用插件的方法设置背景图片只能是一张默认的图片,这个也不能导出吧,
我们的水印是要求动态的,也就是根据当前登录名来显示的。

通过fromJSON反序列化到表单那在导出来的话,那也没有水印功能的吧?
回复 使用道具 举报
songpeng
金牌服务用户   /  发表于:2021-9-1 11:29:25
11#
Derrick.Jiao 发表于 2021-9-1 11:00
请问从后台传的数据是否加载到了SpreadJS表单上了呢?如果没有加载到表单上此时调用save方法保存Excel文 ...

是表单上一定是要有数据是吗?如果没有数据是回报错,这个还没有验证过,等下试试?

我们的需求是这样的,如下
1、我们会在表单控件上进行编辑数据,目前这一步是可以的,用控件自带呢的导出,这个也是可以的。只是自带控件不能自带水印功能,所以没有此功能;
2、我们自定义了一个导出方法接口给前端人员调用,就是在表单控件上编辑好之后直接调用导出方法,导出的excel打开报错。
3、目前还有一个疑问,导出之前是一定要先保存吗?不能直接调用接口吗,还是说一定要先保存在服务器上,让后再从服务器上获取,这样文件一直在增加?
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-9-1 11:00:57
10#
songpeng 发表于 2021-9-1 10:36
我这里不是导入到系统中,而是从表格页面上是导出到本地打开excel?
您说的导入,我就有点迷惑了

请问从后台传的数据是否加载到了SpreadJS表单上了呢?如果没有加载到表单上此时调用save方法保存Excel文件就是一个空表单,就会出现报错的情况。
回复 使用道具 举报
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 10:15:43
8#
songpeng 发表于 2021-8-31 18:37
我们没有用插件自带的导出,因为没有办法是加水印,所以我们自己写了一个导出方法。但是本地用postman测 ...

您需要把responsetype设为blob,这样我们的的open方法才能正常导入Excel,例如 image.png236472167.png
回复 使用道具 举报
songpeng
金牌服务用户   /  发表于:2021-8-31 18:37:26
7#
Derrick.Jiao 发表于 2021-8-31 18:32
在GcExcel以及SpreadJS使用时,如果没有添加授权,会有我们的水印页,因此才会出现您上面描述的出现多一 ...

我们没有用插件自带的导出,因为没有办法是加水印,所以我们自己写了一个导出方法。但是本地用postman测试导出文件,没有问题,可以打开,所以很不解?
回复 使用道具 举报
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才能正常显示。


回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部