import React from "react"; import * as XLSX from "xlsx"; import {Button, Dialog, Checkbox, Icon, Overlay} from "@alifd/next"; import {event} from "@alilc/lowcode-engine"; import {HotTable} from "@handsontable/react"; import "handsontable/dist/handsontable.full.min.css"; interface EXCELSetterProps { value: object[]; onChange: (val: object[]) => void; field: any; } export default class EXCELSetter extends React.PureComponent< EXCELSetterProps, any > { static displayName = "EXCELSetter"; state = { visible: false, showNotice: false, data: [], columnHeaders: [], selectedCol: [], savedData: [], }; hotRef = React.createRef(); fileRef = React.createRef(); onOpen = () => { this.setState({visible: true, showNotice: false}); this.readInData(this.props.value); }; onClose = () => { this.setState({visible: false}); }; onConfirm = () => { const {onChange, field} = this.props; const options: any[] = []; this.state.selectedCol.forEach((e) => { options.push({label: e, value: e}); }); field.parent.setPropValue("fieldOptions", options); event.emit("FieldsMapping"); onChange(this.state.savedData); this.setState({visible: false}); }; fileChange = (e: any) => { let file = e.target?.files[0]; if (!file) { return; } let endName = file.name.split(".")[1]; if (endName !== "xls" && endName !== "xlsx") { alert("导入的文件格式不正确!"); return; } const reader = new FileReader(); reader.onload = (readerEvent) => { let finalData = XLSX.read(readerEvent.target?.result, { type: "binary", }); // 这是每个Sheet的名字。 let SheetNames = finalData.SheetNames; // 这是每页的数据内容。 let Sheets = finalData.Sheets; // 调用方法转为json let result = XLSX.utils.sheet_to_json(Sheets[SheetNames[0]], { header: 1, }); this.setState({data: result.slice(1), columnHeaders: result[0]}); }; reader.readAsArrayBuffer(file); this.setState({selectedCol: []}); }; readInData = (val: object[]) => { const res = []; if (val.length > 0) { res.push(Object.keys(val[0])); val?.forEach((e) => { if (!e) { return; } res.push(Object.values(e)); }); this.setState({ data: res.slice(1), columnHeaders: res[0], selectedCol: [], }); return res; } }; saveData = (selectedCol: any[]) => { const res: any[] = []; const hotInstance = this.hotRef.current?.hotInstance; const {columnHeaders} = this.state; const length = hotInstance.countRows() ?? 0; if (length <= 0) { return; } for (let i = 0; i < length; i++) { const rowData = hotInstance.getDataAtRow(i); const rowObj = {}; selectedCol?.forEach((e) => { const index = columnHeaders.indexOf(e); rowObj[e] = rowData[index]; }); res.push(rowObj); } this.setState({savedData: res}); }; noEmptyJug = () => { if (this.state.selectedCol.length > 0) { return true; } else { this.setState({showNotice: true}); } }; renderNotice() { if (this.state.showNotice) { return (
还没有选择字段!
); } } render() { const {Popup} = Overlay; return ( <> { if (this.noEmptyJug()) { this.onConfirm(); } }} onCancel={this.onClose} onClose={this.onClose}>
仅支持 .xls,.xlsx 格式,以表格形式展现,请严格按照格式要求上传表格! } trigger={} v2 placement="b" /> {this.state.data.length !== 0 ? (
选择需要读取的字段: { this.setState({showNotice: false}); this.setState({selectedCol: e}); this.saveData(e); }}> {this.renderNotice()}
) : null}
); } }