-
export default { -
data() {
-
return {
-
tableData: [],
-
colData: [],
-
originData: [{"skuId":"00001","skuName":"nameSku0001","w00001":{"warehouseId":"w00001","warehouseName":"倉庫1","quantity":50,"lockQuantity":5,"availableQuantity":45},"w00002":{"warehouseId":"w00002","warehouseName":"倉庫2","quantity":200,"lockQuantity":5,"availableQuantity":195},"w00003":{"warehouseId":"w00003","warehouseName":"倉庫3","quantity":40,"lockQuantity":1,"availableQuantity":39}},{"skuId":"00002","skuName":"nameSku0002","warehouseItem":[{"warehouseId":"w00001","warehouseName":"倉庫1","quantity":100,"lockQuantity":5,"availableQuantity":95},{"warehouseId":"w00002","warehouseName":"倉庫2","quantity":200,"lockQuantity":5,"availableQuantity":195},{"warehouseId":"w00003","warehouseName":"倉庫3","quantity":5,"lockQuantity":5,"availableQuantity":0}],"w00001":{"warehouseId":"w00001","warehouseName":"倉庫1","quantity":100,"lockQuantity":5,"availableQuantity":95},"w00002":{"warehouseId":"w00002","warehouseName":"倉庫2","quantity":200,"lockQuantity":5,"availableQuantity":195},"w00003":{"warehouseId":"w00003","warehouseName":"倉庫3","quantity":5,"lockQuantity":5,"availableQuantity":0}},{"skuId":"00003","skuName":"nameSku0003","warehouseItem":[{"warehouseId":"w00001","warehouseName":"倉庫2","quantity":100,"lockQuantity":5,"availableQuantity":95},{"warehouseId":"w00002","warehouseName":"倉庫2","quantity":200,"lockQuantity":5,"availableQuantity":195},{"warehouseId":"w00003","warehouseName":"倉庫3","quantity":50,"lockQuantity":5,"availableQuantity":45}],"w00001":{"warehouseId":"w00001","warehouseName":"倉庫2","quantity":100,"lockQuantity":5,"availableQuantity":95},"w00002":{"warehouseId":"w00002","warehouseName":"倉庫2","quantity":200,"lockQuantity":5,"availableQuantity":195},"w00003":{"warehouseId":"w00003","warehouseName":"倉庫3","quantity":50,"lockQuantity":5,"availableQuantity":45}}]
-
}
-
}
-
methods: {
-
initData() {
-
this.tableData = this.originData.map(res => {
-
res.warehouseItem.forEach( item => {
-
res[item.warehouseId] = item
-
})
-
return res
-
})
-
this.originData[0].warehouseItem.forEach((res) => {
-
this.colData.push({
-
dataItem: res.warehouseId,
-
dataName: res.warehouseName
-
})
-
})
-
},
-
exportList() {
-
const wscols = [
-
{ wpx: 220 } // 第一列寬度設置單位px
-
]
-
/**
-
* 合並單元格元素(decode_range方法解析數據格式)
-
{
-
s: { //s start 開始
-
c: 1,//cols 開始列
-
r: 0 //rows 開始行
-
},
-
e: {//e end 結束
-
c: 4,//cols 結束列
-
r: 0 //rows 結束行
-
}
-
}
-
*/
-
const wsMerge = [XLSX.utils.decode_range('A1:A2')]
-
/** 頭部-行列信息*/
-
const header1 = this.colData.map(res => res.dataName).concat('合計')
-
-
header1.map( (res, idx, array) => {
-
const hdMergeObj = {
-
s: { r: 0 },
-
e: { r: 0 }
-
}
-
if ((idx + 2) % 1 === 0) {
-
array.splice( 3 * idx + 1, 0, '', '')
-
hdMergeObj[ 's']['c'] = 3 * idx + 1
-
hdMergeObj[ 'e']['c'] = hdMergeObj['s']['c'] + 2
-
wsMerge.push(hdMergeObj)
-
}
-
return res
-
})
-
const header2 = this.colData.map(() => '庫存數量').concat('庫存數量')
-
header2.map( (res, idx, array) => {
-
if ((idx + 2) % 1 === 0) {
-
array.splice( 3 * idx + 1, 0, '鎖定數量', '可用數量')
-
}
-
return res
-
})
-
const ws = XLSX.utils.aoa_to_sheet([
-
[ '商品信息'].concat(header1),
-
[ ''].concat(header2)
-
])
-
// console.log('header1', ['商品信息'].concat(header1))
-
// console.log(header2)
-
/** 商品信息-行列信息*/
-
const skuInfo = this.tableData.map(res => res.skuId + '\r\n' + res.skuName)
-
XLSX.utils.sheet_add_aoa(ws, skuInfo.map( res => [res]), { origin: 'A3' })
-
/** 倉庫-行列信息(庫存數量,鎖定數量,可用數量)*/
-
const unAllowed = ['skuId', 'skuName', 'warehouseItem']
-
const sheetData = this.tableData.map((data) => {
-
const filterItem = Object.assign({}, data)
-
Object.keys(filterItem)
-
.filter( key => unAllowed.includes(key))
-
.forEach( key => delete filterItem[key])
-
// 重構完數據
-
let warehouseDatas = []
-
Object.values(filterItem).forEach(res => {
-
warehouseDatas = warehouseDatas.concat([res.quantity]).concat([res.lockQuantity]).concat([res.availableQuantity])
-
return warehouseDatas
-
})
-
return warehouseDatas
-
})
-
// console.log('sheetData', sheetData)
-
XLSX.utils.sheet_add_aoa(ws, sheetData, { origin: { r: 2, c: 1 }})
-
/** 合計-行列信息*/
-
const totalData = this.tableData.map(row => {
-
const totlal_quantity = Object.values(row.warehouseItem).map(res => res.quantity).reduce((accumulator, currentValue) => accumulator + currentValue)
-
const totlal_lockQuantity = Object.values(row.warehouseItem).map(res => res.lockQuantity).reduce((accumulator, currentValue) => accumulator + currentValue)
-
const totlal_availableQuantity = Object.values(row.warehouseItem).map(res => res.availableQuantity).reduce((accumulator, currentValue) => accumulator + currentValue)
-
return [totlal_quantity, totlal_lockQuantity, totlal_availableQuantity]
-
})
-
// console.log('total', totalData, this.colData.length * 3 + 1)
-
XLSX.utils.sheet_add_aoa(ws, totalData, { origin: { r: 2, c: this.colData.length * 3 + 1 }})
-
// 導出
-
const wb = XLSX.utils.book_new()
-
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')
-
ws[ '!cols'] = wscols
-
// wsMerge.push(XLSX.utils.decode_range('B1:D1')) // 測試數據 倉庫1模擬數據
-
ws[ '!merges'] = wsMerge
-
console.log(wsMerge)
-
XLSX.writeFile(wb, '庫存報表按SKU.xlsx')
-
}
-
}
-
}
導出效果如下圖:
轉載於:https://my.oschina.net/u/3734107/blog/3072645