New file |
| | |
| | | import React, { Component } from 'react' |
| | | import { notification } from 'antd' |
| | | import * as XLSX from 'sheetjs-style' |
| | | import { DownloadOutlined } from '@ant-design/icons' |
| | | import moment from 'moment' |
| | | |
| | | // import './index.scss' |
| | | |
| | | class ExcelOutColumns extends Component { |
| | | /** |
| | | * @description 导出字段集 |
| | | */ |
| | | actionTrigger = () => { |
| | | const { data, setting } = this.props |
| | | |
| | | if (data.length === 0) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: '字段集不可为空!', |
| | | duration: 5 |
| | | }) |
| | | return |
| | | } |
| | | |
| | | let columns = [{ |
| | | Column: 'label', |
| | | Text: '名称' |
| | | }, { |
| | | Column: 'field', |
| | | Text: '字段' |
| | | }, { |
| | | Column: 'datatype', |
| | | Text: '数据类型' |
| | | }] |
| | | |
| | | let table = [] |
| | | let _header = [] |
| | | let _topRow = {} |
| | | let colwidth = [] |
| | | |
| | | columns.forEach(col => { |
| | | _header.push(col.Column) |
| | | _topRow[col.Column] = col.Text |
| | | colwidth.push({wch: 25}) |
| | | }) |
| | | |
| | | table.push(_topRow) |
| | | |
| | | data.forEach((item) => { |
| | | let _row = {} |
| | | |
| | | columns.forEach((col) => { |
| | | let val = item[col.Column] |
| | | _row[col.Column] = val |
| | | }) |
| | | |
| | | table.push(_row) |
| | | }) |
| | | |
| | | const ws = XLSX.utils.json_to_sheet(table, {header: _header, skipHeader: true}) |
| | | |
| | | ws['!cols'] = colwidth |
| | | ws['!rows'] = Array(table.length).fill({hpx: 18}) |
| | | |
| | | const wb = XLSX.utils.book_new() |
| | | XLSX.utils.book_append_sheet(wb, ws, 'Sheet1') |
| | | |
| | | XLSX.writeFile(wb, `${setting.tableName || ''}${moment().format('YYYYMMDDHHmmss')}.xlsx`) |
| | | } |
| | | |
| | | render() { |
| | | return (<DownloadOutlined className="columns-out" onClick={this.actionTrigger}/>) |
| | | } |
| | | } |
| | | |
| | | export default ExcelOutColumns |
| | |
| | | const { Search } = Input |
| | | const { confirm } = Modal |
| | | |
| | | const ExcelOut = asyncComponent(() => import('./excelout')) |
| | | const CodeMirror = asyncComponent(() => import('@/templates/zshare/codemirror')) |
| | | const FieldsComponent = asyncComponent(() => import('@/templates/sharecomponent/fieldscomponent')) |
| | | const EditTable = asyncComponent(() => import('@/templates/zshare/editTable')) |
| | |
| | | type="fields" |
| | | updatefield={this.updatefields} |
| | | /> |
| | | <ExcelOut data={columns} setting={setting}/> |
| | | <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} searchKey={searchKey} type="datasourcefield" wrappedComponentRef={(inst) => this.datasource = inst} data={columns} columns={colColumns} onChange={(columns) => this.setState({columns})}/> |
| | | </TabPane> : <TabPane tab={ |
| | | <span> |
| | |
| | | </span> |
| | | } key="columns"> |
| | | <div className="base-table-columns"></div> |
| | | <ExcelOut data={columns} setting={setting}/> |
| | | <EditTable actions={[]} searchKey={searchKey} type="datasourcefield" data={columns} columns={colColumns}/> |
| | | </TabPane>} |
| | | {config.subtype === 'dualdatacard' ? <TabPane tab={ |
| | |
| | | type="fields" |
| | | updatefield={this.updateSubfields} |
| | | /> |
| | | <ExcelOut data={subColumns} setting={setting}/> |
| | | <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} searchKey={searchKey} type="datasourcefield" wrappedComponentRef={(inst) => this.subdatasource = inst} data={subColumns} columns={colColumns} onChange={(subColumns) => this.setState({subColumns})}/> |
| | | </TabPane> : null} |
| | | <TabPane tab={ |
| | |
| | | margin-right: 5px; |
| | | cursor: pointer; |
| | | } |
| | | .columns-out { |
| | | float: right; |
| | | position: relative; |
| | | z-index: 2; |
| | | right: 5px; |
| | | height: 0px; |
| | | top: -15px; |
| | | color: rgb(24, 144, 255); |
| | | } |
| | | .columns-out + .modal-edit-table { |
| | | .ant-table-thead { |
| | | .copy-control { |
| | | top: -18px; |
| | | right: 30px; |
| | | .anticon-copy { |
| | | margin-right: 12px; |
| | | } |
| | | .anticon-delete { |
| | | margin-left: 12px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | .full-scripts { |
| | | position: absolute; |