1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- import type { ExportHandler } from '../type'
- import { ElMessage } from 'element-plus'
- import * as XLSX from 'xlsx'
- import FileSaver from 'file-saver'
- export default function useTableExport() {
- const exportToExcel: ExportHandler = ({
- table,
- sheetName = 'sheet1',
- fileName = '导出表格.xlsx',
- headerRowNumber = 1,
- }) => {
- try {
- const tableNode = (('$el' in table
- ? table.$el
- : table.value.$el) as HTMLElement).cloneNode(true) as HTMLElement
- // 设置了列的fixed属性后会有两个table元素,导出数据会重复,需要去掉一个table
- const fixedTable = tableNode.querySelector('.el-table__fixed')
- fixedTable && tableNode.removeChild(fixedTable)
- // 自定义的表头里包含筛选,直接导出会把筛选的下拉数据也写到表头单元格里,需要先去掉筛选弹出框
- const tableHeaderCellPopovers = tableNode.querySelectorAll(
- '.table-header-cell-popover'
- )
- tableHeaderCellPopovers.forEach(node => {
- const childNode = node.querySelector('.el-popover')
- if (childNode) {
- node.removeChild(childNode)
- }
- })
- // 生成要导出的xlsx数据对象,raw: true表示不使用excel的格式解析,输出为纯文本,sheet设置xlsx这一页的标题
- const tableBook = XLSX.utils.table_to_book(tableNode, {
- raw: true,
- sheet: sheetName,
- })
- const tableBuffer = XLSX.write(tableBook, {
- bookType: 'xlsx',
- bookSST: true,
- type: 'buffer',
- cellStyles: true,
- })
- FileSaver.saveAs(
- new Blob([tableBuffer], { type: 'application/octet-stream' }),
- fileName
- )
- } catch (error: any) {
- ElMessage.error(error.message)
- }
- }
- return {
- exportToExcel,
- }
- }
|