Skip to content

excel 导入导出

导入

vue
<script setup lang="ts">
import { ElMessage } from 'element-plus'
import { useExcel } from '@/hooks/useExcel'

// toTwoArray 将数据转为二维数组
const { importExcel, toTwoArray } = useExcel()

// 表格数据
const tableData = ref<Record<string, any>[]>([])
// 表格二维数据
const tableDataTwo = ref<Record<string, any>[]>([])
// 表头数据
const column = ref<Array<string>>(['A', 'B', 'C', 'D', 'E', 'F', 'G'])

const importFile = (file: File) => {
  importExcel(file).then(({ title, list }: any) => {
    column.value = title
    tableData.value = list

    tableDataTwo.value = toTwoArray(list)
  })

  return false
}

const getTwoData = () => {
  console.log(tableDataTwo.value)
  ElMessage.success('数据已打印在控制台')
}
</script>

<template>
  <el-card shadow="never">
    <div class="flex">
      <el-upload
        action=""
        accept=".xls,.xlsx"
        :show-upload-list="false"
        :before-upload="importFile"
      >
        <el-button type="primary">导入</el-button>
      </el-upload>
      <el-button type="primary" @click="getTwoData" class="ml-3"
        >获取表格二维数据</el-button
      >
    </div>
    <table class="table" border="1">
      <colgroup>
        <col width="52" />
        <col v-for="item in column" :key="item" />
      </colgroup>
      <thead>
        <tr>
          <th></th>
          <th v-for="item in column" :key="item" style="text-align: center">
            {{ item }}
          </th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="(item, index) in tableData" :key="index">
          <td style="text-align: center">{{ index + 1 }}</td>
          <template v-for="key in column">
            <td
              v-if="item[key]?.colspan !== 0 && item[key].rowspan !== 0"
              :key="key"
              :colspan="item[key].colspan"
              :rowspan="item[key].rowspan"
              style="text-align: center"
            >
              {{ item[key].value }}
            </td>
          </template>
        </tr>
        <tr v-if="!tableData.length">
          <td
            :colspan="column.length + 1"
            style="text-align: center; background: none"
          >
            暂无数据
          </td>
        </tr>
      </tbody>
    </table>
  </el-card>
</template>

导出

vue
<script setup lang="ts">
import { ElMessage } from 'element-plus'
import { useExcel, type IExcel } from '@/hooks/useExcel'

const { exportExcel } = useExcel()

const tableData = [
  {
    name: '张三',
    province: '山西',
    city: '太原',
    zone: '小店区',
    street: '平阳路街道',
    address: '平阳景苑30栋1单元',
    price: 18
  },
  {
    name: '李四',
    province: '山东',
    city: '青岛',
    zone: '市北区',
    street: '香港中路',
    address: '中心大厦1号楼2单元',
    price: 85
  },
  {
    name: '王五',
    province: '浙江',
    city: '杭州',
    zone: '西湖区',
    street: '文三路',
    address: '西溪风景区3栋9单元',
    price: 8
  },
  {
    name: '赵六',
    province: '福建',
    city: '泉州',
    zone: '丰泽区',
    street: '南洋街道',
    address: '南洋村6幢1单元',
    price: 16
  },
  {
    name: '孙七',
    province: '河北',
    city: '武汉',
    zone: '武昌区',
    street: '武昌大道',
    address: '两湖花园16幢2单元',
    price: 12
  },
  {
    name: '周八',
    province: '河北',
    city: '石家庄',
    zone: '黄山区',
    street: '汤口镇',
    address: '温泉村21号',
    price: 11
  }
]

/* 导出 */
const exportFile = () => {
  const excelParams: IExcel = {
    fileName: '用户数据',
    rows: [['用户名', '省', '市', '区', '街道', '详细地址', '金额']],
    width: [16, 16, 16, 16, 30, 40, 15],
    data: []
  }
  tableData.forEach((item: any) => {
    excelParams.data.push([
      item.name,
      item.province,
      item.city,
      item.zone,
      item.street,
      item.address,
      item.price
    ])
  })
  exportExcel(excelParams)
    .then(() => {
      ElMessage.success('导出成功')
    })
    .catch(e => {
      ElMessage.error(e.message)
    })
}
</script>

<template>
  <el-button type="primary" @click="exportFile">导出</el-button>
</template>

导出合并表格

vue
<script setup lang="ts">
const excelParams: IExcel = {
  fileName: '用户数据',
  /* 将表格配置为二维数组 */
  rows: [
    ['用户名', '地址', '', '', '', '', '金额'],
    ['', '省', '市', '区', '街道', '详细地址', '']
  ],
  width: [16, 16, 16, 16, 30, 40, 15],
  data: [],
  merge: ['A1:A2', 'B1:F1', 'G1:G2'] // 传递合并参数
}
</script>