找回密码
 立即注册

QQ登录

只需一步,快速开始

一博科技

中级会员

51

主题

147

帖子

568

积分

中级会员

积分
568
一博科技
中级会员   /  发表于:2023-6-26 15:57  /   查看:678  /  回复:6

业务场景:
init渲染文件后,有个变更操作,客户修改内容后保存提交,前端根据cells取得修改内容,通过FormData拼接修改的数据,通过方法:
io.save(toJson, (blob) => {
// to do
})
把修改的脏数据及Excel文件转blob通过FormData传递给后台;

问题描述:尝试了FormData传文件的append和set都不行,走了err,报错提示:文件格式错误;
新增或替换都会报错:


form.append("file", blob, this.orderTable.bomName); // 文件
form.set('file', blob, this.orderTable.bomName);  // 文件


报错截图:
image.png556723632.png

浏览器版本:
image.png118885497.png

代码片段:

// 变更提交(填写变更信息)
submitAlter (data) {
  let designer = this.designer, self = this, spread = designer.getWorkbook(), sheet = spread.getActiveSheet(), cells = sheet.getDirtyCells();
  this.alterNote = data.alterNote;  // 变更内容
  this.alterSuite = data.alterSuite;  // 变更套数
  this.alterType = data.alterType;  // 变更类型

  // 脏数据
  let alterArr = [], Reply = {}, quantityCol = {}, pnCol = {}, brandCol = {}, newRow = [], rowFix = [],alterCheck={}; // 变更、客户回复、数量、型号、品牌、新、固定
  let quantitycol = this.alterCol.alterquantitycolno, // 数量
        pncol = this.alterCol.alterpncolno, // 型号
        brandcol = this.alterCol.alterbrandcolno, // 品牌
        replycol = this.alterCol.customerreplyno, // 客户回复
        checkcol=this.alterCol.alterrecheckquotecolno,   // 重新核价
        insertrow = this.alterCol.insertrowno;   // 变更时选新增物料

  if (cells.length > 0) {
        for (let i = 0; i < cells.length; i++) {
          let col = cells.col, row = cells.row, val = cells.newValue;
          // 当前变更的行号
          if (val || val==0) if (val.toString().trim()) if (replycol != col) alterArr.push(row); // 过滤客户回复(因为影响判断新增物料,因此不记录客户回复行)
          if (col == replycol) if (val || val==0) if (val.toString().trim()) Reply[row] = val;  // 客户回复
          if (col == quantitycol) if (val || val==0) if (val.toString().trim()) quantityCol[row] = val;  // 数量
          if (col == pncol) if (val) if (val.toString().trim()) pnCol[row] = val;  // 型号
          if (col == brandcol) if (val) if (val.toString().trim()) brandCol[row] = val;  // 品牌
          if (row >= insertrow) if (val) if (val.toString().trim()) rowFix.push(row) // 固定
          if (col == checkcol) if (val || val==0) if (val.toString().trim()) alterCheck[row] = '是';  // 重核
        }
  }

  // 是否有新增
  let rows = sheet.getInsertRows(); // 新增
  let ifBreak = false;  // 末行
  // 插入行
  rows.map(item => {
        let row = sheet.getArray(item.row, 0, 1, sheet.getColumnCount()); // 有变更
        if (item.row < Number(insertrow)) {
          ifBreak = true;
          return false;
        }
        row.map((val, i) => {
          for (let i = 0; i < val.length; i++) {
                if (val != null) {
                  newRow.push(item.row)
                }
                // 插入行的客户回复
                if (i == this.alterCol.customerreplyno) {
                  if (val)
                        if (val.toString().trim())
                          Reply[item.row] = val
                }
          }
        })
  });

  if (ifBreak === true) {
        swal('', '请于BOM末尾 无数据的空行 或 倒数第三行 开始新增物料', 'warning');
        return false;
  }

  let addRow = [...new Set(newRow.concat(rowFix))]; // 插入行、固定行去重
  let alterRow = [...new Set(addRow.concat(alterArr))]; // 所有涉及变更的行号

  // 删除原始以外
  sheet.deleteColumns((Number(this.alterCol.startcolno) + 1), (this.alterCol.endcolno - this.alterCol.startcolno));

  // 设置日期
  let style = new GC.Spread.Sheets.Style(); style.backColor = '#ffff00';  // 背景色
  for (let i = 0; i < alterRow.length; i++) {
        sheet.setStyle(alterRow, this.alterCol.startcolno, style); // 背景色
        sheet.setValue(alterRow, this.alterCol.startcolno, this.date);    // 日期
  }

  // 【传送后台xlsx文件】
  let io = new GC.Spread.Excel.IO();  // IO文件传输
  let serializationOption = { includeBindingSource: true, allowInsertColumns: true, };  // 将工作簿转换为json时包含绑定源,默认值为false
  let toJson = spread.toJSON(serializationOption);  // toJson转换
  io.save(toJson, (blob) => {
        console.log(toJson,'toJson')

        const file = new File([blob], this.orderTable.bomName, {type: blob.type});
        console.log(file,"file对象")

        let form = new FormData();  // 初始化form表单数据
        console.log(form,"form对象")

        // form.append("file", blob, this.orderTable.bomName); // 接收文件
        // console.log(form,'blob文件');

        form.set('file', blob, this.orderTable.bomName);  // 接收文件
        console.log(form.get('file'),'表单file文件');

        let formList=[
          {name:'bomSn',val:this.query.bomSn},
          {name:'userNumber',val:this.username},
          {name:'userName',val:this.realname},
          {name:'version',val:this.query.version},
          {name:'alterScope',val:this.alterType},
          {name:'quoteType',val:this.query.quoteType},
          {name:'suite',val:this.alterSuite},
          {name:'alterNote',val:this.alterNote},
          {name:'alterRow',val:alterRow.sort()},
          {name:'bomcodeoa',val:this.orderTable.bomcodeoa},
        ]
        formList.map(item=>{
          form.append(item.name, item.val); // bomSn
        })
        if (Object.keys(Reply).length != 0) form.append('customerReply', JSON.stringify(Reply));  // 客户回复
        if (Object.keys(alterCheck).length != 0) form.append('alterRequote', JSON.stringify(alterCheck));  // 重核
        if (Object.keys(quantityCol).length != 0) form.append('alterQuantity', JSON.stringify(quantityCol));  // 数量
        if (Object.keys(pnCol).length != 0) form.append('alterPn', JSON.stringify(pnCol));  // 型号
        if (Object.keys(brandCol).length != 0) form.append('alterBrand', JSON.stringify(brandCol));  // 品牌

        console.log(formList,'append参数')

        // 市场变更请求
        this.$axios.post(apiSaleAlter, form, { headers:this.importHeaders }).then(data => {
          this.alterDialogState = false;
          let res = data.data;

          if (res.code === 0) {
                swal('', res.message, 'success').then(_ => {
                  self.$router.push({ query: merge(self.$route.query, { version: res.data.version,bomSn:res.data.bomSn }) });
                  this.$refs.childFoot.isAlter= false;
                })
          } else {
                // 重置页面
          }
        }).catch(() => {
          // 重置页面
        })
  },function (e) {
        console.log(e,'错误日志');
  })
},



补充:chrome太大,上传不了,用的版本是:
image.png669718017.png

0529-test.rar

1.34 MB, 下载次数: 45

6 个回复

倒序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-6-27 18:17:31
来自 7#
本帖最后由 Richard.Ma 于 2023-6-27 18:23 编辑

目前这边测试直接用你这个xlsx文件加载,然后在save方法中执行form.append均无问题

image.png998368530.png


附件是demo,你可以在此基础上修改看看,如何能重现出问题
test.zip (2.19 KB, 下载次数: 28)
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-6-26 19:03:03
沙发
这个错误是后端返回的还是在formData.append的时候就报错了,理论上来说应该和你拿到的blob没什么关系。

你这个this.orderTable.bomName是什么呢

回复 使用道具 举报
一博科技
中级会员   /  发表于:2023-6-27 08:42:19
板凳
Richard.Ma 发表于 2023-6-26 19:03
这个错误是后端返回的还是在formData.append的时候就报错了,理论上来说应该和你拿到的blob没什么关系。

...

是走到formData.append就不走了,直接走了err,this.orderTable.bomName是文件名称
image.png870267944.png
回复 使用道具 举报
一博科技
中级会员   /  发表于:2023-6-27 09:49:15
地板
Richard.Ma 发表于 2023-6-26 19:03
这个错误是后端返回的还是在formData.append的时候就报错了,理论上来说应该和你拿到的blob没什么关系。

...

还有个同样出现的问题,在新浏览器的生产环境只要有图片,也是append/set不了,直接走errorCallBack了,跟这个错误同出一辙
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-6-27 17:00:52
5#
你是指给formdata来append一个图片类型吗,我看到你在主楼的截图中,chrome 版本较低,不排除是这个原因,建议可以尝试升级浏览器试试。


虽然目前这个错误和spreadjs没有多大关系,但是对于spreadjs 来说,我们同样建议Google Chrome版本在  75+以上。
回复 使用道具 举报
一博科技
中级会员   /  发表于:2023-6-27 17:40:43
6#
Richard.Ma 发表于 2023-6-27 17:00
你是指给formdata来append一个图片类型吗,我看到你在主楼的截图中,chrome 版本较低,不排除是这个原因, ...
虽然目前这个错误和spreadjs没有多大关系


Chrome 114.xxx,有图片照样读不到Excel这个文件
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部