Vue 3 实现 Excel 表格解析的完整指南

在现代 web 开发中,数据导入是一个常见的需求,而 Excel 文件作为数据存储的重要格式之一,能够实现 Excel 表格的解析并展示在前端页面上是一项非常实用的功能。本文将详细介绍如何在 Vue 3 项目中使用 ExcelJS 库来解析 Excel 文件,并将数据展示在表格中。

安装依赖库

复制代码
npm install exceljs

代码实现

模板部分

复制代码
<template>
  <div class="addBatchTask-func">
    <div class="title">
      <h2>Excel 表格解析 Demo</h2>
    </div>
    <div class="but">
      <a-button @click="handleUpload" type="primary">上传表格</a-button>
      <input
        type="file"
        ref="fileInput"
        style="display: none"
        @change="handleFileChange"
        accept=".xlsx"
      />
    </div>
    <div class="table-box" v-if="data.length > 0">
      <a-table :columns="columns" :data-source="data" :pagination="false">
        <template #bodyCell="{ column, record }">
          <a-button
            type="primary"
            @click="handleOk(record)"
            v-if="column.key === 'action'"
          >
            删除
          </a-button>
        </template>
      </a-table>
    </div>
  </div>
</template>
<style lang="less" scoped>
.addBatchTask-func {
  width: 100%;
  height: 100vh;
  .table-box {
    :deep(.ant-table) {
      background: black;
      .ant-table-thead {
        .ant-table-cell {
          background: #000;
          color: #fff;
          font-size: 14px;
          font-weight: 600;
        }
      }
    }
  }
}
</style>

脚本部分

复制代码
<script setup>
import * as ExcelJS from "exceljs";
import { ref } from "vue";

const fileInput = ref(null);

const data = ref([]);

const columns = [
  {
    title: "姓名",
    dataIndex: "name",
    key: "name",
  },
  {
    title: "年龄",
    dataIndex: "age",
    key: "age",
  },
  {
    title: "性别",
    dataIndex: "sex",
    key: "sex",
  },
  {
    title: "家庭住址",
    dataIndex: "address",
    key: "address",
  },
  {
    title: "操作",
    key: "action",
  },
];

// 处理上传文件的事件
const handleUpload = () => {
  const fileInput = document.querySelector('input[type="file"]');
  console.log(fileInput, "fileInput");
  fileInput.value = ""; // 重置文件输入字段的值
  fileInput.click();
};

const handleFileChange = async (event) => {
  data.value = [];
  const file = event.target.files[0];
  console.log(file, "file");

  if (!file) return;
  try {
    const reader = new FileReader();
    reader.onload = async (e) => {
      if (!e.target || !e.target.result) {
        reject("File reading failed");
        return;
      }
      const arrayBuffer = e.target.result;
      const workbook = new ExcelJS.Workbook();
      await workbook.xlsx.load(arrayBuffer);
      const worksheet = workbook.getWorksheet(1);
      worksheet.eachRow({ includeEmpty: false }, (row, rowNumber) => {
        if (rowNumber > 1) {
          const rowData = {
            key: rowNumber.toString(),
            name: row.getCell(1).value || "",
            age: row.getCell(2).value || "",
            sex: row.getCell(3).value || "",
            address: row.getCell(4).value || "",
          };
          console.log(rowData, "rowData");
          data.value.push(rowData);
        }
      });
    };

    reader.onerror = (error) => {
      console.log(error);
    };
    reader.readAsArrayBuffer(file);
  } catch (error) {
    console.error("Error importing table:", error);
  }
};
</script>

注意事项和优化建议

  1. 文件格式支持 :目前只支持 .xlsx 格式,可以根据需求扩展支持 .xls 等其他格式。

  2. 数据验证和处理:在解析和展示数据时,应考虑添加数据验证逻辑,确保数据的完整性和正确性。

  3. 性能优化:如果处理的 Excel 文件较大,可以考虑分批读取和展示数据,以提高性能。

  4. 错误处理:增加更多的错误处理逻辑,提高用户体验。

相关推荐
胡哈1 小时前
React Compiler:让开发者忘掉 memo 这件事
前端·react.js
xiyueyezibile1 小时前
“自迭代” Skill 的 team-pitfalls 的演进
前端·后端·ai编程
林恒smileZAZ1 小时前
`Array(100).map(() => 1)` 为什么全为空?
前端·javascript
小巧的砖头1 小时前
C#会重蹈覆辙吗?系列之2:反射及元数据的性能问题
开发语言·前端·c#
KaMeidebaby2 小时前
卡梅德生物技术快报|蛋白的叠氮基修饰:实操解析:核酸模板耦合蛋白的叠氮基修饰实现靶蛋白定点共价标记
前端·人工智能·物联网·算法·百度
濮水大叔2 小时前
在大型 Vue 项目中,如何有效管理复杂的状态?“散装版” vs “套装版”
前端·vue.js·typescript
玄星啊2 小时前
可修改:代码的生存底线
前端·ai编程
没落英雄2 小时前
3. DeepAgents 实战 - Memory Skills 与上下文工程
前端·人工智能·架构
Bigger2 小时前
对不起!我错怪你了,UnoCSS:一次和 AI 一起排查 DevTools 卡顿的经历
前端·css·人工智能
laowang3573 小时前
依赖故障时,日志体系需要埋哪些关键节点才能快速定位是安装失败、解析失败还是运行时缺失?
前端·javascript·vue.js·webpack·node.js