实现xlsx文件带上样式导入导出,表头单元格合并(附带代码仓库地址)

xlsx导入导出

基于xlsx-js-style实现的xlsx文件带上样式导入导出,额外处理了表头单元格合并,封装了element plus的表格组件
image.png

关键知识点

  • xlsx-js-style 内容的格式和css样式的转换
  • 导入导出时候的数据格式处理,例如单元格的数值格式
  • 单元格合并时对数据的影响

关键代码

import {
   
    dayjs } from 'element-plus'
import XLSX from 'xlsx-js-style'
import type {
   
    CellObject } from 'xlsx-js-style'
interface DownLoadExcelParams {
   
   
  data: any[]
  props: TableXlsxColumnProp[]
  fileName: string
}

interface Style {
   
   
  backgroundColor?: string
  ['background-color']?: string
  color?: string
  fontWeight?: string
  ['font-weight']?: string
  fontStyle?: string
  ['font-style']?: string
  textDecoration?: string
  ['text-decoration']?: string
  textAlign?: string
  ['text-align']?: string
  fontSize?: string
  ['font-size']?: string
}
export function useXlsx() {
   
   
  const onFileData = (binary: string, xlsxProps: TableXlsxColumnProp[]) => {
   
   
    try {
   
   
      const workbook = XLSX.read(binary, {
   
    type: 'binary', cellDates: true })
      const dataList: unknown[][] = []
      workbook.SheetNames.forEach((sheetName) => {
   
   
        const worksheet = workbook.Sheets[sheetName]
        const data = XLSX.utils.sheet_to_json(worksheet)
        if (data.length) {
   
   
          dataList.push(onSheetJson(data as any[], xlsxProps))
        }
      })

      return dataList
    } catch (error) {
   
   
      console.error(error)
    }
  }

  const onSheetJson = (list: any[], xlsxProps: TableXlsxColumnProp[]) => {
   
   
    // 判断表头是否合并
    if (xlsxProps.some((p) => p.children)) {
   
   
      const keyMapData = list[0]
      list.forEach((item: any) => {
   
   
        for (let key in keyMapData) {
   
   
          if (item.hasOwnProperty(key)) {
   
   
            item[keyMapData[key]] = item[key]
          }
        }
      })
      list.shift()
    }
    return list.map((item) => onSheetItem(item, xlsxProps))
  }

  const onSheetItem = (item: any, xlsxProps: TableXlsxColumnProp[]) => {
   
   
    let data: CommonObject = {
   
   }
    const flatProps = onFlat(xlsxProps)
    for (let key in item) {
   
   
      const prop = flatProps.find((p) => p.label === key)
      if (!prop) continue
      const value = item[key]
      data[prop.key] = value
    }
    return data
  }
  const onDownLoadExcel = ({
   
    data, props, fileName }: DownLoadExcelParams) => {
   
   
    // 处理内容
    const {
   
    header, headerMerge, flatProps } = onGetExcelSetting(props)
    let contentArr = onContentArray(data, flatProps)
    let arr = [...header, ...contentArr]
    let sheet 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值