业务场景:
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); // 文件
报错截图:
浏览器版本:
代码片段:
// 变更提交(填写变更信息)
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太大,上传不了,用的版本是:
|
|