useTableExport.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import type { ExportHandler } from '../type'
  2. import { ElMessage } from 'element-plus'
  3. import * as XLSX from 'xlsx'
  4. import FileSaver from 'file-saver'
  5. export default function useTableExport() {
  6. const exportToExcel: ExportHandler = ({
  7. table,
  8. sheetName = 'sheet1',
  9. fileName = '导出表格.xlsx',
  10. headerRowNumber = 1,
  11. }) => {
  12. try {
  13. const tableNode = (('$el' in table
  14. ? table.$el
  15. : table.value.$el) as HTMLElement).cloneNode(true) as HTMLElement
  16. // 设置了列的fixed属性后会有两个table元素,导出数据会重复,需要去掉一个table
  17. const fixedTable = tableNode.querySelector('.el-table__fixed')
  18. fixedTable && tableNode.removeChild(fixedTable)
  19. // 自定义的表头里包含筛选,直接导出会把筛选的下拉数据也写到表头单元格里,需要先去掉筛选弹出框
  20. const tableHeaderCellPopovers = tableNode.querySelectorAll(
  21. '.table-header-cell-popover'
  22. )
  23. tableHeaderCellPopovers.forEach(node => {
  24. const childNode = node.querySelector('.el-popover')
  25. if (childNode) {
  26. node.removeChild(childNode)
  27. }
  28. })
  29. // 生成要导出的xlsx数据对象,raw: true表示不使用excel的格式解析,输出为纯文本,sheet设置xlsx这一页的标题
  30. const tableBook = XLSX.utils.table_to_book(tableNode, {
  31. raw: true,
  32. sheet: sheetName,
  33. })
  34. const tableBuffer = XLSX.write(tableBook, {
  35. bookType: 'xlsx',
  36. bookSST: true,
  37. type: 'buffer',
  38. cellStyles: true,
  39. })
  40. FileSaver.saveAs(
  41. new Blob([tableBuffer], { type: 'application/octet-stream' }),
  42. fileName
  43. )
  44. } catch (error: any) {
  45. ElMessage.error(error.message)
  46. }
  47. }
  48. return {
  49. exportToExcel,
  50. }
  51. }