| | |
| | | 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 执行自定义脚本 |
| | | */ |
| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { Form, Row, Col, Button, Input, InputNumber } from 'antd' |
| | | import { Form, Row, Col, Button, Input, InputNumber, Radio } from 'antd' |
| | | import './index.scss' |
| | | |
| | | class ExcelOutColumn extends Component { |
| | |
| | | return ( |
| | | <Form {...formItemLayout} className="verify-form"> |
| | | <Row gutter={24}> |
| | | <Col span={7}> |
| | | <Col span={5}> |
| | | <Form.Item label={dict['model.form.field']}> |
| | | {getFieldDecorator('Column', { |
| | | initialValue: '', |
| | |
| | | })(<Input placeholder="" autoComplete="off" />)} |
| | | </Form.Item> |
| | | </Col> |
| | | <Col span={7}> |
| | | <Col span={5}> |
| | | <Form.Item label={dict['model.name']}> |
| | | {getFieldDecorator('Text', { |
| | | initialValue: '', |
| | |
| | | })(<Input placeholder="" autoComplete="off" />)} |
| | | </Form.Item> |
| | | </Col> |
| | | <Col span={7}> |
| | | <Col span={5}> |
| | | <Form.Item label={dict['model.form.columnWidth']}> |
| | | {getFieldDecorator('Width', { |
| | | initialValue: 20, |
| | |
| | | })(<InputNumber min={5} max={200} precision={0} />)} |
| | | </Form.Item> |
| | | </Col> |
| | | {/* <Col span={5}> |
| | | <Col span={5}> |
| | | <Form.Item label="类型"> |
| | | {getFieldDecorator('type', { |
| | | initialValue: 'text' |
| | |
| | | </Radio.Group> |
| | | )} |
| | | </Form.Item> |
| | | </Col> */} |
| | | <Col span={3} className="add"> |
| | | </Col> |
| | | <Col span={4} className="add"> |
| | | <Button onClick={this.handleConfirm} type="primary" className="mk-green"> |
| | | 添加 |
| | | </Button> |
| | |
| | | inputType: 'input', |
| | | editable: true, |
| | | unique: true, |
| | | width: '25%' |
| | | width: '20%' |
| | | }, |
| | | { |
| | | title: this.props.dict['model.name'], |
| | | dataIndex: 'Text', |
| | | inputType: 'input', |
| | | editable: true, |
| | | width: '25%' |
| | | width: '20%' |
| | | }, |
| | | { |
| | | title: this.props.dict['model.form.columnWidth'], |
| | |
| | | min: 5, |
| | | max: 200, |
| | | editable: true, |
| | | width: '25%' |
| | | width: '20%' |
| | | }, |
| | | // { |
| | | // title: '类型', |
| | | // dataIndex: 'type', |
| | | // inputType: 'select', |
| | | // editable: true, |
| | | // required: false, |
| | | // width: '20%', |
| | | // render: (text) => { |
| | | // if (text === 'image') { |
| | | // return '图片' |
| | | // } else { |
| | | // return '文本' |
| | | // } |
| | | // }, |
| | | // options: [ |
| | | // {value: 'text', text: '文本'}, |
| | | // {value: 'image', text: '图片'} |
| | | // ] |
| | | // }, |
| | | { |
| | | title: '类型', |
| | | dataIndex: 'type', |
| | | inputType: 'select', |
| | | editable: true, |
| | | required: false, |
| | | width: '20%', |
| | | render: (text) => { |
| | | if (text === 'image') { |
| | | return '图片' |
| | | } else { |
| | | return '文本' |
| | | } |
| | | }, |
| | | options: [ |
| | | {value: 'text', text: '文本'}, |
| | | {value: 'image', text: '图片'} |
| | | ] |
| | | }, |
| | | { |
| | | title: '取绝对值', |
| | | dataIndex: 'abs', |
| | | inputType: 'select', |
| | | editable: true, |
| | | required: false, |
| | | width: '25%', |
| | | width: '20%', |
| | | render: (text) => { |
| | | if (text === 'true') { |
| | | return '是' |
| | |
| | | if (card.intertype !== 'system') { |
| | | _verify.enable = 'false' |
| | | } |
| | | // if (_verify.columns[0] && !_verify.columns[0].type) { |
| | | // _verify.columns = _verify.columns.map(col => { |
| | | // col.type = col.type || 'text' |
| | | // return col |
| | | // }) |
| | | // } |
| | | if (_verify.columns[0] && !_verify.columns[0].type) { |
| | | _verify.columns = _verify.columns.map(col => { |
| | | col.type = col.type || 'text' |
| | | return col |
| | | }) |
| | | } |
| | | |
| | | let defaultscript = '' |
| | | if (!_verify.script && card.intertype === 'system') { |
| | |
| | | Text: item.label, |
| | | Width: 20, |
| | | abs: 'false', |
| | | // type: 'text', |
| | | type: 'text', |
| | | uuid: Utils.getuuid() |
| | | }) |
| | | }) |