From 37e28da53f6d4d7d8abe7626ba28ba7dbe16e7bb Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期一, 08 四月 2024 15:36:01 +0800 Subject: [PATCH] 2024-04-08 --- src/tabviews/zshare/actionList/exceloutbutton/index.jsx | 193 ++++++++++++++++++++++++++++++++--------------- 1 files changed, 130 insertions(+), 63 deletions(-) diff --git a/src/tabviews/zshare/actionList/exceloutbutton/index.jsx b/src/tabviews/zshare/actionList/exceloutbutton/index.jsx index 3a33cdd..9899496 100644 --- a/src/tabviews/zshare/actionList/exceloutbutton/index.jsx +++ b/src/tabviews/zshare/actionList/exceloutbutton/index.jsx @@ -449,23 +449,70 @@ /** * @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 @@ -514,7 +561,7 @@ let table = [] - data && data.forEach((item, index) => { + data.forEach((item, index) => { let _row = {} item.$Index = index + 1 + '' @@ -522,20 +569,38 @@ 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 = '' } } @@ -550,16 +615,6 @@ 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 = {} @@ -567,16 +622,16 @@ 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 = '' @@ -588,16 +643,16 @@ 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`) } }) @@ -607,7 +662,7 @@ table.push(_topRow) } - data && data.forEach((item, index) => { + data.forEach((item, index) => { let _row = {} item.$Index = index + 1 + '' @@ -616,20 +671,38 @@ 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 = '' } } @@ -650,47 +723,41 @@ 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') -- Gitblit v1.8.0