当前位置: 首页 > news >正文

前端导入Excel表格

前端如何在 Vue 3 中导入 Excel 文件(.xls 和 .xlsx)?

在日常开发中,我们经常需要处理 Excel 文件,比如导入数据表格、分析数据等。文章将在 Vue 3 中实现导入 .xls.xlsx 格式的文件,并解析其中的数据。

安装依赖

我们需要一个强大的工具来解析 Excel 文件,这里推荐使用 xlsx 库。它功能强大,支持多种格式的 Excel 文件。

在项目中安装 xlsx

npm install xlsx

实现步骤

1. 创建一个文件上传组件

首先,我们需要一个文件上传控件,让用户可以选择 Excel 文件。这个控件可以通过 <input type="file"> 来实现。

2. 解析 Excel 文件

当用户上传文件后,我们需要读取文件内容并解析其中的数据。这里我们会用 FileReaderxlsx 库来完成这个任务。

3. 显示解析后的数据

最后,我们将解析后的数据展示在页面上,比如用表格的形式显示。


完整代码

下面是一个完整的 Vue 3 组件,包含文件上传、解析和数据展示功能。

模板部分
<template><div><!-- 文件上传控件 --><input type="file" @change="handleFileUpload" accept=".xlsx, .xls" /><!-- 显示解析后的 Excel 数据 --><table v-if="tableData.length"><thead><tr><th v-for="(header, index) in tableData[0]" :key="index">{{ header }}</th></tr></thead><tbody><tr v-for="(row, rowIndex) in tableData.slice(1)" :key="rowIndex"><td v-for="(cell, cellIndex) in row" :key="cellIndex">{{ cell }}</td></tr></tbody></table></div>
</template>
逻辑部分
<script lang="ts">
import { defineComponent, ref } from 'vue';
import * as XLSX from 'xlsx';export default defineComponent({name: 'ExcelUploader',setup() {// 定义一个响应式变量,也就是数组,用于存储解析后的 Excel 数据 const tableData = ref<Array<Array<string | number>>>([]);// 文件上传处理函数const handleFileUpload = (event: Event) => {const target = event.target as HTMLInputElement; // 获取上传的文件const file = target.files?.[0]; // 获取用户上传的第一个文件if (!file) return; // 如果没有文件,直接返回const reader = new FileReader(); // 创建一个 FileReader 对象,用于读取文件内容reader.onload = (e) => {// 将文件内容转换为 ArrayBufferconst data = new Uint8Array((e.target as FileReader).result as ArrayBuffer);const workbook = XLSX.read(data, { type: 'array' }); // 使用 xlsx 解析 Excel 文件// 获取 Excel 文件的第一个工作表名称const firstSheetName = workbook.SheetNames[0];const worksheet = workbook.Sheets[firstSheetName]; // 获取第一个工作表// 将工作表内容转换为 JSON 数据(二维数组)const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });tableData.value = jsonData; // 将解析后的数据存储到响应式变量中};reader.readAsArrayBuffer(file); // 以 ArrayBuffer 格式读取文件};return {handleFileUpload, // 文件上传处理函数tableData, // 响应式变量,用于存储解析后的数据};},
});
</script>
样式部分
<style scoped>
table {border-collapse: collapse;width: 100%;
}th, td {border: 1px solid #ddd;padding: 8px;
}th {background-color: #f4f4f4;
}
</style>

代码解析

1. 文件上传控件
<input type="file" @change="handleFileUpload" accept=".xlsx, .xls" />
  • type="file":让用户可以选择文件。
  • @change="handleFileUpload":监听文件上传事件,当用户选择文件时会触发 handleFileUpload 函数。
  • accept=".xlsx, .xls":限制用户只能上传 .xlsx.xls 格式的文件。

2. 文件解析逻辑
const handleFileUpload = (event: Event) => {const target = event.target as HTMLInputElement;const file = target.files?.[0];if (!file) return;const reader = new FileReader();reader.onload = (e) => {const data = new Uint8Array((e.target as FileReader).result as ArrayBuffer);const workbook = XLSX.read(data, { type: 'array' });const firstSheetName = workbook.SheetNames[0];const worksheet = workbook.Sheets[firstSheetName];const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });tableData.value = jsonData;};reader.readAsArrayBuffer(file);
};
  • FileReader:用于读取用户上传的文件内容。
  • readAsArrayBuffer(file):以 ArrayBuffer 格式读取文件内容。
  • XLSX.read(data, { type: 'array' }):使用 xlsx 库解析 Excel 文件。
  • XLSX.utils.sheet_to_json(worksheet, { header: 1 }):将工作表内容转换为 JSON 数据。

3. 数据展示
<table v-if="tableData.length"><thead><tr><th v-for="(header, index) in tableData[0]" :key="index">{{ header }}</th></tr></thead><tbody><tr v-for="(row, rowIndex) in tableData.slice(1)" :key="rowIndex"><td v-for="(cell, cellIndex) in row" :key="cellIndex">{{ cell }}</td></tr></tbody>
</table>
  • v-if="tableData.length":只有当 tableData 中有数据时才显示表格。
  • tableData[0]:第一行数据作为表头。
  • tableData.slice(1):从第二行开始作为表格内容。

运行效果

  1. 用户点击文件上传按钮,选择一个 .xls.xlsx 文件。
  2. 文件上传后,解析其中的数据。
  3. 将解析后的数据展示在页面上,表头和内容清晰可见。

总结

通过以上步骤,我们成功实现了在 Vue 3 中导入 Excel 文件的功能。这个功能可以应用于很多场景,比如数据导入、表格分析等。


文章转载自:

http://jT9CDNq2.dgwrz.cn
http://8W3KCqek.dgwrz.cn
http://BMylLB0E.dgwrz.cn
http://TiXTPYN3.dgwrz.cn
http://ttbWQbz6.dgwrz.cn
http://7wA3BVJn.dgwrz.cn
http://NOp6DwE2.dgwrz.cn
http://ezAUWh9Y.dgwrz.cn
http://0tLMZ7xK.dgwrz.cn
http://cBSf3nKq.dgwrz.cn
http://zLjXnQVg.dgwrz.cn
http://SN2mtGsN.dgwrz.cn
http://4cvVJIgM.dgwrz.cn
http://ah7L1k7t.dgwrz.cn
http://DmU4meqJ.dgwrz.cn
http://MFsDkkHT.dgwrz.cn
http://z7AZkXO5.dgwrz.cn
http://LK6Oe34c.dgwrz.cn
http://xbIpovDy.dgwrz.cn
http://6FkJan95.dgwrz.cn
http://8LXN0ZJa.dgwrz.cn
http://X3ngTp2K.dgwrz.cn
http://dQy4jbph.dgwrz.cn
http://KWME9xmS.dgwrz.cn
http://RIOaTc86.dgwrz.cn
http://7q6eRwOp.dgwrz.cn
http://lZBHDzlr.dgwrz.cn
http://TlpGFFVe.dgwrz.cn
http://VphOhvGI.dgwrz.cn
http://12CEVoyg.dgwrz.cn
http://www.dtcms.com/a/229243.html

相关文章:

  • 提升系统稳定性和可靠性的特殊线程(看门狗线程)
  • CppCon 2014 学习:Lightning Talk: Writing a Python Interpreter for Fun and Profit
  • 浮点数的位级表示转变为二进制表示
  • 数组-差分数组抽象版
  • 【Redis】笔记|第7节|大厂生产级Redis高并发分布式锁实战(二)
  • 风机巡检方案艰难之路
  • 基于TI DSP控制的光伏逆变器最大功率跟踪mppt
  • 【Zephyr 系列 5】定时器与低功耗控制:打造省电高效的嵌入式系统
  • Windows 下部署 SUNA 项目:虚拟环境尝试与最终方案
  • 数据生命线 - MySQL 备份与恢复策略详解
  • ADI硬件笔试面试题型解析上
  • VueScan:全能扫描,高清输出
  • STM32学习之WWDG(原理+实操)
  • 适合自己的记单词方式
  • 中英混合编码解码全解析
  • C++实现汉诺塔游戏用户交互
  • 【笔记】用命令手动下载并安装 tokenizers 库.whl文件(Python 3.12+)
  • 动态规划(2)
  • 7. Ext系列文件系统
  • 深度学习介绍
  • 如何选择最高效的沟通方式?
  • 光耦电路学习,光耦输入并联电阻、并联电容,光耦输出滤波电路
  • 国产高云FPGA实现视频采集转UDP以太网输出,FPGA网络摄像头方案,提供2套Gowin工程源码和技术支持
  • 2023年12月四级真题Reading Comprehension的分析总结
  • SpringCloud 分布式锁Redisson锁的重入性 高并发 获取锁
  • 【氮化镓】钝化层对p-GaN HEMT阈值电压的影响
  • Qt 事件传递的完整流程
  • 板凳-------Mysql cookbook学习 (九--3)
  • AXURE-动态面板
  • 软考 系统架构设计师系列知识点之杂项集萃(79)