| | |
| | | const { btn } = this.props |
| | | |
| | | try { |
| | | let _header = [] |
| | | let _topRow = {} |
| | | let colwidth = [] |
| | | let abses = [] |
| | | let imgCol = btn.verify.columns.filter(col => col.type === 'image')[0] |
| | | |
| | | btn.verify.columns.forEach(col => { |
| | | if (_topRow[col.Column]) return |
| | | |
| | | _header.push(col.Column) |
| | | _topRow[col.Column] = col.Text |
| | | |
| | | if (col.abs === 'true') { |
| | | abses.push(col.Column) |
| | | } |
| | | |
| | | colwidth.push({width: col.Width || 20}) |
| | | }) |
| | | |
| | | let table = [] |
| | | |
| | | table.push(_topRow) |
| | | |
| | | data && data.forEach((item, index) => { |
| | | let _row = {} |
| | | |
| | | item.$Index = index + 1 |
| | | |
| | | _header.forEach(field => { |
| | | if (item[field] && abses.includes(field)) { |
| | | _row[field] = Math.abs(item[field]) |
| | | } else { |
| | | _row[field] = item[field] |
| | | if (imgCol) { |
| | | const column = btn.verify.columns.map(item => { |
| | | let col = { |
| | | title: item.Text, |
| | | key: item.Column, |
| | | type: 'text', |
| | | width: (item.Width || 20) * 10 |
| | | } |
| | | if (item.type === 'image') { |
| | | col.type = 'image' |
| | | col.height = col.width |
| | | } |
| | | return col |
| | | }) |
| | | |
| | | table.push(_row) |
| | | }) |
| | | let table = [] |
| | | |
| | | const ws = XLSX.utils.json_to_sheet(table, {header: _header, skipHeader: true}) |
| | | data && data.forEach((item, index) => { |
| | | let _row = {} |
| | | |
| | | item.$Index = index + 1 |
| | | |
| | | btn.verify.columns.forEach((col, i) => { |
| | | if (item[col.Column] && col.abs === 'true') { |
| | | _row[col.Column] = Math.abs(item[col.Column]) |
| | | } else { |
| | | _row[col.Column] = item[col.Column] |
| | | } |
| | | }) |
| | | |
| | | table.push(_row) |
| | | }) |
| | | |
| | | ws['!cols'] = colwidth |
| | | this.table2excel(column, table, this.state.excelName.replace(/\.xlsx/ig, '.xls')) |
| | | |
| | | const wb = XLSX.utils.book_new() |
| | | XLSX.utils.book_append_sheet(wb, ws, 'Sheet1') |
| | | if (btn.verify && btn.verify.enable === 'true' && btn.verify.script) { |
| | | this.execCustomScript() |
| | | } else { |
| | | this.execSuccess({ErrCode: 'S', ErrMesg: '导出成功!'}) |
| | | } |
| | | |
| | | XLSX.writeFile(wb, this.state.excelName) |
| | | |
| | | if (btn.verify && btn.verify.enable === 'true' && btn.verify.script) { |
| | | this.execCustomScript() |
| | | } else { |
| | | this.execSuccess({ErrCode: 'S', ErrMesg: '导出成功!'}) |
| | | let _header = [] |
| | | let _topRow = {} |
| | | let colwidth = [] |
| | | let abses = [] |
| | | |
| | | btn.verify.columns.forEach(col => { |
| | | if (_topRow[col.Column]) return |
| | | |
| | | _header.push(col.Column) |
| | | _topRow[col.Column] = col.Text |
| | | |
| | | if (col.abs === 'true') { |
| | | abses.push(col.Column) |
| | | } |
| | | |
| | | colwidth.push({width: col.Width || 20}) |
| | | }) |
| | | |
| | | let table = [] |
| | | |
| | | table.push(_topRow) |
| | | |
| | | data && data.forEach((item, index) => { |
| | | let _row = {} |
| | | |
| | | item.$Index = index + 1 |
| | | |
| | | _header.forEach(field => { |
| | | if (item[field] && abses.includes(field)) { |
| | | _row[field] = Math.abs(item[field]) |
| | | } else { |
| | | _row[field] = item[field] |
| | | } |
| | | }) |
| | | |
| | | table.push(_row) |
| | | }) |
| | | |
| | | const ws = XLSX.utils.json_to_sheet(table, {header: _header, skipHeader: true}) |
| | | |
| | | ws['!cols'] = colwidth |
| | | |
| | | const wb = XLSX.utils.book_new() |
| | | XLSX.utils.book_append_sheet(wb, ws, 'Sheet1') |
| | | |
| | | XLSX.writeFile(wb, this.state.excelName) |
| | | |
| | | if (btn.verify && btn.verify.enable === 'true' && btn.verify.script) { |
| | | this.execCustomScript() |
| | | } else { |
| | | this.execSuccess({ErrCode: 'S', ErrMesg: '导出成功!'}) |
| | | } |
| | | } |
| | | } catch { |
| | | this.execError({ErrCode: 'N', message: 'Excel生成失败!'}) |
| | | } |
| | | } |
| | | |
| | | table2excel = (column, data, excelName) => { |
| | | let thead = column.reduce((result, item) => { |
| | | return result + `<th>${item.title}</th>` |
| | | }, '') |
| | | |
| | | thead = `<thead><tr>${thead}</tr></thead>` |
| | | |
| | | let tbody = data.reduce((result, row) => { |
| | | const temp = column.reduce((tds, col) => { |
| | | let cell = '<td></td>' |
| | | if (col.type !== 'image' || !row[col.key]) { |
| | | cell = `<td style="width: ${col.width}px;">${row[col.key]}</td>` |
| | | } else if (col.type === 'image') { |
| | | cell = `<td style="width: ${col.width}px;height: ${col.height}px;"><img src="${row[col.key]}" width="${col.width * 0.75}"></td>` |
| | | } |
| | | return tds + cell |
| | | }, '') |
| | | return result + `<tr>${temp}</tr>` |
| | | }, '') |
| | | |
| | | tbody = `<tbody>${tbody}</tbody>` |
| | | |
| | | const table = thead + tbody |
| | | |
| | | let html = "<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel' xmlns='http://www.w3.org/TR/REC-html40'>" |
| | | html += '<head><meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">' |
| | | html += '<xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>Sheet1</x:Name><x:WorksheetOptions><x:Print><x:ValidPrinterInfo/></x:Print></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml></head>' |
| | | html += `<body><table>${table}</table></body>` |
| | | html += '</html>' |
| | | |
| | | let url = 'data:application/vnd.ms-excel;charset=utf-8,' + encodeURIComponent(html) |
| | | // let url = 'data:application/vnd.ms-excel;base64,' + window.btoa(unescape(encodeURIComponent(html))) |
| | | let link = document.createElement('a') |
| | | link.href = url |
| | | link.download = excelName |
| | | document.body.appendChild(link) |
| | | link.click() |
| | | document.body.removeChild(link) |
| | | } |
| | | |
| | | |
| | | /** |
| | | * @description 执行自定义脚本 |
| | | */ |