excel.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import ExcelJS from 'exceljs';
  2. import { saveAs } from 'file-saver';
  3. import { MessagePlugin } from 'tdesign-vue-next';
  4. export async function importExcel(columns: any[]) {
  5. return new Promise((resolve, reject) => {
  6. const input = document.createElement('input');
  7. input.type = 'file';
  8. input.accept =
  9. '.csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel,application/zip';
  10. input.onchange = (event) => {
  11. const elem: any = event.target;
  12. if (elem.files && elem.files[0].name.indexOf('.xlsx') > 0) {
  13. const workbook = new ExcelJS.Workbook();
  14. const reader = new FileReader();
  15. reader.readAsArrayBuffer(elem.files[0]);
  16. reader.onload = async () => {
  17. const buffer: any = reader.result;
  18. await workbook.xlsx.load(buffer);
  19. // 默认只解析第一个sheet
  20. const worksheet = workbook.worksheets[0];
  21. // 获取sheet1的所有rows
  22. const rows = worksheet.getSheetValues();
  23. if (rows.length === 0) {
  24. MessagePlugin.warning('导入的excel文件不可为空!');
  25. return;
  26. }
  27. let data: any = [];
  28. let indexKeyMap: any = {};
  29. worksheet.eachRow((row, rowNumber) => {
  30. let _data: any = {};
  31. row.eachCell((cell, colNumber) => {
  32. if (rowNumber === 1) {
  33. let _index = columns.findIndex(
  34. (item) => item.header === cell.value
  35. );
  36. if (_index !== -1) {
  37. indexKeyMap[colNumber] = columns[_index].key;
  38. }
  39. } else {
  40. _data[indexKeyMap[colNumber]] = cell.value;
  41. }
  42. });
  43. if (rowNumber !== 1) {
  44. data.push(_data);
  45. }
  46. });
  47. resolve(data);
  48. MessagePlugin.success('导入成功!');
  49. };
  50. }
  51. };
  52. input.click();
  53. });
  54. }
  55. export function saveAsExcel(
  56. name: string,
  57. columns: { header: string; key: string }[],
  58. data: any[]
  59. ) {
  60. const fileName = `${name}.xlsx`;
  61. const workbook = new ExcelJS.Workbook();
  62. // workbook.creator = 'Me';
  63. // workbook.lastModifiedBy = 'Her';
  64. workbook.created = new Date();
  65. // workbook.modified = new Date();
  66. // workbook.lastPrinted = new Date();
  67. const worksheet = workbook.addWorksheet(`${name}`);
  68. worksheet.columns = columns;
  69. worksheet.addRows(data);
  70. workbook.xlsx.writeBuffer().then((data) => {
  71. const blob = new Blob([data], {
  72. type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8',
  73. });
  74. saveAs(blob, fileName);
  75. MessagePlugin.success('导出成功!');
  76. });
  77. }