找回密码
 立即注册

QQ登录

只需一步,快速开始

helloworldplus

注册会员

8

主题

20

帖子

72

积分

注册会员

积分
72
最新发帖
helloworldplus
注册会员   /  发表于:2024-9-6 12:54  /   查看:517  /  回复:2
本帖最后由 Ellia.Duan 于 2024-9-29 15:12 编辑

需要实现批量将xlsx转换为sjs的功能,常规思路是遍历数组,使用import导入,然后再回调中使用save拿到blob数据。现在的问题是操作1000份文件时,执行到300左右的文件save的回调基本就不触发了。无论是使用一个实例还是每个文件一个实例都会卡在300左右的节点
  1. const input = document.createElement('input')
  2.         input.type = 'file'
  3.         input.multiple = true
  4.         input.accept = '.xlsx'
  5.         input.style.display = 'none'
  6.         document.body.appendChild(input)
  7.         input.click()

  8.         input.onchange = async function(e)  {
  9.           // 处理后的buferr数据
  10.           let bufferData: IExcelData[] = []
  11.           let num: number = 0
  12.           // @ts-ignore
  13.           let files: any[] = Array.from(e?.target?.files)
  14.           files = files.map((item, index) => {
  15.             return {
  16.               // @ts-ignore
  17.               spread: new GC.Spread.Sheets.Workbook(String(index)),
  18.               file: item,
  19.               bufferData: null
  20.             }
  21.           })

  22.           async function dealFileData(file: any, spread: any) {
  23.             return new Promise((resolve, reject) =>  {
  24.               console.log('开始加载');
  25.               spread.suspendPaint();
  26.               spread.import(
  27.                 file,
  28.                 function () {
  29.                   console.log('加载成功');
  30.                   spread.export(async function(blob: any){
  31.                     console.log('保存成功');
  32.                     spread.clearSheets()
  33.                     const dataArray: any = await  turnBlobToBuffer(blob)
  34.                     resolve({
  35.                       name: file.name,
  36.                       size: file.size,
  37.                       dataArray: dataArray
  38.                     })
  39.                   })
  40.                 },
  41.                 function () {},
  42.                 // @ts-ignore
  43.                 { fileType: GC.Spread.Sheets.excel}
  44.               )
  45.             })
  46.           }
  47.          
  48.           for(let i = 0; i < files.length; i++) {
  49.             const res: any = await dealFileData(files[i].file, files[i].spread)
  50.             files[i].spread.destroy()
  51.             files[i] = {
  52.               spread: null,
  53.               file: null,
  54.               bufferData: res
  55.             }
  56.             num = num+1
  57.             console.log('完成进度:' + num + '/' + files.length);
  58.             setInfoStr('完成进度:' + num + '/' + files.length);
  59.           }

  60.         }


复制代码

2 个回复

倒序浏览
helloworldplus
注册会员   /  发表于:2024-9-6 12:56:19
沙发
测试的xlsx文件大小是149kb,13kb的文件正常
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-9-6 15:52:10
板凳
您好!发现您就该问题重新发帖,并补充了相关说明,那对本贴就结贴了,请移步至以下链接中的帖子讨论。
https://gcdn.grapecity.com.cn/fo ... read&tid=225968

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