| | |
| | | /** |
| | | * @description Excel 生成 |
| | | */ |
| | | exportExcel = (data, ErrCode, msg, search) => { |
| | | exportExcel = (data = [], ErrCode, msg, search) => { |
| | | const { btn } = this.props |
| | | |
| | | let imgCol = false |
| | | let columns = btn.verify.columns.map(col => { |
| | | let merge = false |
| | | let styles = [] |
| | | let letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' |
| | | |
| | | let columns = btn.verify.columns.map((col, index) => { |
| | | if (col.type === 'image') { |
| | | imgCol = true |
| | | } |
| | | if (btn.verify.merge === 'true' && /.+-.+/.test(col.Text)) { |
| | | merge = true |
| | | } |
| | | |
| | | if (col.type === 'number' && (col.decimal || col.decimal === 0) ) { |
| | | col.round = Math.pow(10, col.decimal) |
| | | let i = Math.floor(index / 26) |
| | | let s = letters[i - 1] || '' |
| | | col.name = s + letters[index % 26] |
| | | |
| | | if (col.type === 'number') { |
| | | if (col.decimal || col.decimal === 0) { |
| | | col.round = Math.pow(10, col.decimal) |
| | | |
| | | if (col.format) { |
| | | let dec = Array(col.decimal).fill(0).join('') |
| | | dec = dec ? '.' + dec : '' |
| | | if (col.format === 'thdSeparator') { |
| | | col.z = '#,##0' + dec |
| | | } else if (col.format === 'thdSepPm') { |
| | | col.z = '#,##0' + dec + ';' |
| | | col.z = col.z + '[Red]-' + col.z |
| | | } else if (col.format === 'percent') { |
| | | let _dec = '' |
| | | if (col.decimal > 2) { |
| | | Array(col.decimal - 2).fill(0).join('') |
| | | _dec = _dec ? '.' + _dec : '' |
| | | } |
| | | |
| | | col.z = '0' + _dec + '%' |
| | | } |
| | | } |
| | | } |
| | | } else if (col.type === 'text') { |
| | | if (col.wrapText === 'true') { |
| | | col.s = {alignment: { wrapText: true }} |
| | | } |
| | | if (col.textFormat) { |
| | | if (col.textFormat === 'YYYY-MM-DD') { |
| | | col.z = 'yyyy-mm-dd;@' |
| | | } else if (col.textFormat === 'YYYY-MM-DD HH:mm:ss') { |
| | | col.z = 'yyyy-mm-dd hh:mm:ss' |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (col.z || col.s) { |
| | | styles.push(col) |
| | | } |
| | | |
| | | return col |
| | | }) |
| | | |
| | | if (data && data[0]) { |
| | | if (data[0]) { |
| | | let errors = [] |
| | | columns.forEach(col => { |
| | | if (col.output === 'false') return |
| | |
| | | |
| | | let table = [] |
| | | |
| | | data && data.forEach((item, index) => { |
| | | data.forEach((item, index) => { |
| | | let _row = {} |
| | | |
| | | item.$Index = index + 1 + '' |
| | |
| | | columns.forEach((col, i) => { |
| | | let val = item[col.Column] |
| | | if (col.output === 'false') { |
| | | if (col.type === 'number') { |
| | | if (col.type === 'number' && col.noValue !== 'false') { |
| | | val = 0 |
| | | } else { |
| | | val = '' |
| | | } |
| | | } else if (col.type === 'number' && typeof(val) === 'number') { |
| | | if (col.abs === 'true') { |
| | | val = Math.abs(val) |
| | | } else if (col.type === 'number') { |
| | | if (val && typeof(val) === 'string' && !isNaN(val)) { |
| | | val = +val |
| | | } |
| | | if (col.round) { |
| | | val = Math.round(val * col.round) / col.round |
| | | // val = val.toFixed(col.decimal) |
| | | if (typeof(val) === 'number') { |
| | | if (col.abs === 'true') { |
| | | val = Math.abs(val) |
| | | } |
| | | if (col.round) { |
| | | val = Math.round(val * col.round) / col.round |
| | | } |
| | | if (col.noValue === 'false' && val === 0) { |
| | | val = '' |
| | | } |
| | | } |
| | | if (col.noValue === 'false' && val === 0) { |
| | | } else if (col.type === 'text') { |
| | | val = val + '' |
| | | |
| | | if (col.textFormat) { |
| | | if (col.textFormat === 'YYYY-MM-DD' && /^[1-9]\d{3}(-|\/)(0[1-9]|1[0-2])(-|\/)(0[1-9]|[1-2][0-9]|3[0-1])/.test(val)) { |
| | | val = `${val.substr(0, 4)}-${val.substr(5, 2)}-${val.substr(8, 2)}` |
| | | } else if (col.textFormat === 'YYYY-MM-DD HH:mm:ss' && /^[1-9]\d{3}(-|\/)(0[1-9]|1[0-2])(-|\/)(0[1-9]|[1-2][0-9]|3[0-1]).([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]/.test(val)) { |
| | | val = `${val.substr(0, 4)}-${val.substr(5, 2)}-${val.substr(8, 2)} ${val.substr(11, 2)}:${val.substr(14, 2)}:${val.substr(17, 2)}` |
| | | } |
| | | } |
| | | |
| | | if (col.noValue === 'false' && val < '1949-10-02') { |
| | | val = '' |
| | | } |
| | | } |
| | |
| | | |
| | | this.execSuccess({ErrCode: ErrCode || 'S', message: msg || '导出成功!'}) |
| | | } else { |
| | | let letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' |
| | | let cols = [] |
| | | |
| | | for (let index = 0; index < columns.length; index++) { |
| | | let i = Math.floor(index / 26) |
| | | let s = letters[i - 1] || '' |
| | | |
| | | cols.push(s + letters[index % 26]) |
| | | } |
| | | |
| | | let table = [] |
| | | let _header = [] |
| | | let _topRow = {} |
| | |
| | | let requires = [] |
| | | let merges = [] |
| | | |
| | | columns.forEach((col, i) => { |
| | | columns.forEach(col => { |
| | | _header.push(col.Column) |
| | | _topRow[col.Column] = col.Text |
| | | colwidth.push({wch: col.Width || 20}) |
| | | if (col.required === 'true') { |
| | | requires.push(i) |
| | | requires.push(col.name) |
| | | } |
| | | }) |
| | | |
| | | if (btn.verify.merge === 'true') { |
| | | if (merge) { |
| | | let fLine = {} |
| | | let sLine = {} |
| | | let sign = '' |
| | |
| | | sLine[col.Column] = _name |
| | | |
| | | if (sign === _sign) { |
| | | merges[merges.length - 1] = merges[merges.length - 1].split(':')[0] + `:${cols[i]}1` |
| | | merges[merges.length - 1] = merges[merges.length - 1].split(':')[0] + `:${col.name}1` |
| | | } else { |
| | | merges.push(`${cols[i]}1:${cols[i]}2`) |
| | | merges.push(`${col.name}1:${col.name}2`) |
| | | sign = _sign |
| | | } |
| | | } else { |
| | | fLine[col.Column] = col.Text |
| | | sLine[col.Column] = col.Text |
| | | sign = '' |
| | | merges.push(`${cols[i]}1:${cols[i]}2`) |
| | | merges.push(`${col.name}1:${col.name}2`) |
| | | } |
| | | }) |
| | | |
| | |
| | | table.push(_topRow) |
| | | } |
| | | |
| | | data && data.forEach((item, index) => { |
| | | data.forEach((item, index) => { |
| | | let _row = {} |
| | | |
| | | item.$Index = index + 1 + '' |
| | |
| | | let val = item[col.Column] |
| | | |
| | | if (col.output === 'false') { |
| | | if (col.type === 'number') { |
| | | if (col.type === 'number' && col.noValue !== 'false') { |
| | | val = 0 |
| | | } else { |
| | | val = '' |
| | | } |
| | | } else if (col.type === 'number' && typeof(val) === 'number') { |
| | | if (col.abs === 'true') { |
| | | val = Math.abs(val) |
| | | } else if (col.type === 'number') { |
| | | if (val && typeof(val) === 'string' && !isNaN(val)) { |
| | | val = +val |
| | | } |
| | | if (col.round) { |
| | | val = Math.round(val * col.round) / col.round |
| | | // val = val.toFixed(col.decimal) |
| | | if (typeof(val) === 'number') { |
| | | if (col.abs === 'true') { |
| | | val = Math.abs(val) |
| | | } |
| | | if (col.round) { |
| | | val = Math.round(val * col.round) / col.round |
| | | } |
| | | if (col.noValue === 'false' && val === 0) { |
| | | val = '' |
| | | } |
| | | } |
| | | if (col.noValue === 'false' && val === 0) { |
| | | } else if (col.type === 'text') { |
| | | val = val + '' |
| | | |
| | | if (col.textFormat) { |
| | | if (col.textFormat === 'YYYY-MM-DD' && /^[1-9]\d{3}(-|\/)(0[1-9]|1[0-2])(-|\/)(0[1-9]|[1-2][0-9]|3[0-1])/.test(val)) { |
| | | val = `${val.substr(0, 4)}-${val.substr(5, 2)}-${val.substr(8, 2)}` |
| | | } else if (col.textFormat === 'YYYY-MM-DD HH:mm:ss' && /^[1-9]\d{3}(-|\/)(0[1-9]|1[0-2])(-|\/)(0[1-9]|[1-2][0-9]|3[0-1]).([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]/.test(val)) { |
| | | val = `${val.substr(0, 4)}-${val.substr(5, 2)}-${val.substr(8, 2)} ${val.substr(11, 2)}:${val.substr(14, 2)}:${val.substr(17, 2)}` |
| | | } |
| | | } |
| | | |
| | | if (col.noValue === 'false' && val < '1949-10-02') { |
| | | val = '' |
| | | } |
| | | } |
| | |
| | | |
| | | if (requires.length) { |
| | | requires.forEach(col => { |
| | | if (cols[col]) { |
| | | ws[cols[col] + '1'].s = {font: { color: { rgb: 'F5222D' } }} |
| | | } |
| | | ws[col + '1'].s = {font: { color: { rgb: 'F5222D' } }} |
| | | }) |
| | | } |
| | | |
| | | if (merges.length) { |
| | | if (merge) { |
| | | ws['!merges'] = [] |
| | | merges.forEach(item => { |
| | | ws['!merges'].push(XLSX.utils.decode_range(item)) |
| | | }) |
| | | |
| | | cols.forEach(col => { |
| | | if (ws[col + '1'].s) { |
| | | ws[col + '1'].s = {font: { color: { rgb: 'F5222D' } }, alignment: { horizontal: 'center', vertical: 'center' }} |
| | | } else { |
| | | ws[col + '1'].s = {alignment: { horizontal: 'center', vertical: 'center' }} |
| | | } |
| | | ws[col + '2'].s = {alignment: { horizontal: 'center', vertical: 'center' }} |
| | | columns.forEach(col => { |
| | | ws[col.name + '1'].s = ws[col.name + '1'].s || {} |
| | | ws[col.name + '1'].s.alignment = { horizontal: 'center', vertical: 'center' } |
| | | |
| | | ws[col.name + '2'].s = {alignment: { horizontal: 'center', vertical: 'center' }} |
| | | }) |
| | | } |
| | | |
| | | // ws['A3'].s = {font: { sz: 10 , bold: true }, alignment: { horizontal: 'center', vertical: 'center' }, border: {top: {style: 'thin', color: '000000'}, left: {style: 'thin', color: '000000'}, bottom: {style: 'thin', color: '000000'}, right: {style: 'thin', color: '000000'}}}; |
| | | // ws['A3'].z = '#,##0.00'; |
| | | // ws['A3'].z = '#,##0.00;[Red]-#,##0.00;'; |
| | | // ws["A1"].s = {fill: { bgColor: { rgb: "FFFFAA" }}, font: { color: { rgb: "1890FF" } }} |
| | | |
| | | if (btn.verify.wrapText === 'true' && data) { |
| | | let lines = data.length + 1 |
| | | let start = 2 |
| | | if (btn.verify.merge === 'true') { |
| | | lines = data.length + 2 |
| | | } |
| | | for (let n = 0; n < cols.length; n++) { |
| | | for (let m = start; m <= lines; m++) { |
| | | if (ws[cols[n] + m] && !ws[cols[n] + m].s) { |
| | | ws[cols[n] + m].s = {alignment: { wrapText: true }} |
| | | if (data.length && styles.length) { |
| | | for (let n = table.length - data.length + 1; n <= table.length; n++) { |
| | | styles.forEach(col => { |
| | | if (col.z) { |
| | | ws[col.name + n].z = col.z |
| | | } |
| | | } |
| | | if (col.s) { |
| | | ws[col.name + n].s = col.s |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | |
| | | // ws["A1"].s = {fill: { bgColor: { rgb: "FFFFAA" }}, font: { color: { rgb: "1890FF" } }} |
| | | |
| | | const wb = XLSX.utils.book_new() |
| | | XLSX.utils.book_append_sheet(wb, ws, btn.verify.sheet || 'Sheet1') |