找回密码
 立即注册

QQ登录

只需一步,快速开始

Sarah无敌

注册会员

7

主题

10

帖子

59

积分

注册会员

积分
59
Sarah无敌
注册会员   /  发表于:2024-5-11 18:34  /   查看:402  /  回复:4
10金币
本帖最后由 Richard.Huang 于 2024-5-16 15:12 编辑

产品:SpreadJS
版本:V15.2.5

【问题描述】: excel文件中存在一些脏图片,width = 1.34 ,图片很小几乎不怎么看得到,鼠标点击第一个单元格左上角——出现十字架符号——点击十字架符号出现如图”图片72“
image.png194507140.png

【问题】: 本地运行时导出excel没问题, 本地 npm run bulid打包部署到线上后,导出excel报错:’文件格式不对‘
image.png579926757.png
断点显示在excelIO插件的源码中 s是undefind,并且拿着base64Image地址,去在线转图片发现其格式错误

【尝试】
下载excel时尝试删除width<2的图片,但是如果有width > 2的图片,在下载时还是报错”文件格式错误“。
  1. downLoadSheet() {
  2.   const ex = new ExcelIO.IO();
  3.   let tempSpreadBlank = new GC.Spread.Sheets.Workbook();
  4.   tempSpreadBlank.sheets.forEach(sheet => {
  5.     //fixBug:excel中包含width=1.34的无效图片,spreadjs在转成base64后格式有问题,导致下载excel时报错:文件格式错误
  6.     const pictures = sheet.pictures.all();
  7.     if (pictures.length) {
  8.       pictures.forEach(t => {
  9.         //清除所有width < 2 的图片
  10.         if (t._ps.width < 2) {
  11.           sheet.pictures.remove(t._ps.name)
  12.         }
  13.       })
  14.     }

  15.   })
  16.   const json = JSON.stringify(tempSpreadBlank.toJSON())
  17.   ex.save(json, (blob) => {
  18.     FaverSaver.saveAs(blob, '测试.xlsx')
  19.   }, function (e) {
  20.     console.log(e)
  21.   }, {
  22.     password: ''
  23.   })
  24. }
复制代码

是否有好的方案:可以去掉width<2的图片,同时能下载width>2的正常图片,或者让包含这种width<2的excel下载成功
image.png977129211.png
image.png255566405.png
image.png876733398.png
image.png498927306.png

demo.zip

355.95 KB, 下载次数: 31

最佳答案

查看完整内容

您好,我看了一下您的Demo,存在几个问题,罗列如下: 1、您的Demo中没有引入shape包,所以导入没有图片。 2、如果我的理解没错的话,您是想修改有图片的workBook,而不是一个空的workBook,那么tempSpreadBlank这个对象作为一个新创建的workBook的逻辑是错误的,应该在原来的workBook上执行逻辑。 3、save函数中的FaverSaver.saveAs意义不明,您没有引入该函数,也没有定义该函数,导致save函数执行错误。根据上 ...

4 个回复

倒序浏览
最佳答案
最佳答案
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-5-11 18:34:13
来自 4#
您好,我看了一下您的Demo,存在几个问题,罗列如下:

1、您的Demo中没有引入shape包,所以导入没有图片。

image.png394180907.png

2、如果我的理解没错的话,您是想修改有图片的workBook,而不是一个空的workBook,那么tempSpreadBlank这个对象作为一个新创建的workBook的逻辑是错误的,应该在原来的workBook上执行逻辑。

image.png960572814.png

3、save函数中的FaverSaver.saveAs意义不明,您没有引入该函数,也没有定义该函数,导致save函数执行错误。根据上下文,您应该想要执行的是FileSaver中的saveAs函数,那么您应该先将saveAs函数导入,然后再调用。

image.png247197570.png

image.png605818786.png
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-5-13 14:24:09
2#
您好,我这边在15.2.2中测试了一下,发现您代码中sheet.pictures.all();返回的结果为[],我换成sheet.shapes.all();就可以正常返回所有的图形了,然后修改了一下删除的逻辑,将所有宽度<2的形状删除,最终可以正常导出。

请参考:
  1. let excelIo = new GC.Spread.Excel.IO();
  2. let spread = designer.getWorkbook();

  3. spread.sheets.forEach((sheet) => {
  4.   const shapes = sheet.shapes.all();
  5.   if (shapes.length) {
  6.     shapes.forEach((t) => {
  7.       if (t.width() < 2) {
  8.         sheet.shapes.remove(t.name());
  9.       }
  10.     });
  11.   }
  12. });
  13. const json = JSON.stringify(spread.toJSON());
  14. excelIo.save(
  15.   json,
  16.   (blob) => {
  17.     saveAs(blob, "测试.xlsx");
  18.   },
  19.   function (e) {
  20.     console.log(e);
  21.   },
  22.   {
  23.     password: "",
  24.   }
  25. );
复制代码
回复 使用道具 举报
Sarah无敌
注册会员   /  发表于:2024-5-13 18:00:23
3#
你好,解压附件中demo2.zip,即可复现以上问题:
      demo中版本:15.2.5
     其中errorSsjson.json测试用例未能成功加载出图片
     原版的excel,以及在在线编辑器https://demo.grapecity.com.cn/SpreadJS/WebDesigner/index.html中是如图所示:
image.png848454589.png
  demo中渲染如图:(图片没加载出来)
image.png401008910.png
image.png186802977.png
这个版本获取 sheet.shapes 是undefind
两个测试用例导出excel都报错“格式不对”



demo2.zip

545.83 KB, 下载次数: 24

回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-5-22 14:47:34
5#
您好,请问您的问题是否已经解决,如果仍未解决,欢迎继续回帖,我们来协助调研。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部