情不知从何起,一往而情深
排名
6
文章
199
粉丝
4
评论
3
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

vue3 读取excel 文件内容 返回json。vue3 导入excel

273人阅读 2025/2/25 16:08 总访问:1110378 评论:0 收藏:0 手机
分类: 前端

在 Vue 3 中读取 Excel 文件并将其内容转换为 JSON 格式,你可以使用一些第三方库,比如 xlsx 和 file-saver。下面我们使用xlsx来做简单示例。

安装依赖

  1. npm install xlsx
  2. 或者
  3. cnpm install xlsx

读取excel 直接获取整个excel的json数据

  1. <template>
  2. <el-button type="success" :icon="Plus" size="default" @click="openChoiseFile">导入 </el-button>
  3. <input type="file" ref="fileInut" style="visibility: hidden" @change="handleFileUpload" />
  4. </template>
  5. <script setup lang="ts" name="certificateUser">
  6. const fileInut = ref(null);
  7. const openChoiseFile = () =>{
  8. // 触发input的点击事件,触发文件选择的事件
  9. fileInut.value.click()
  10. }
  11. const jsonData = ref(null);
  12. const handleFileUpload = (event:any) => {
  13. const file = event.target.files[0];
  14. if (file) {
  15. const reader = new FileReader();
  16. reader.onload = (e:any) => {
  17. const data = new Uint8Array(e.target.result);
  18. const workbook = XLSX.read(data, { type: 'array' });
  19. // 假设我们只读取第一个工作表
  20. const firstSheetName = workbook.SheetNames[0];
  21. const worksheet = workbook.Sheets[firstSheetName];
  22. const json = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
  23. jsonData.value = JSON.stringify(json, null, 2);
  24. console.log("看看获取的json数据",jsonData.value)
  25. };
  26. reader.readAsArrayBuffer(file);
  27. }
  28. };
  29. </script>

循环解析一次性返回的json数据,根据需求自己来组装数据,以及每行的为空验证

  1. const jsonData = ref([]); // 用于存储最终组装好的 JSON 数据
  2. const formattedJsonData = ref(''); // 用于显示格式化的 JSON 数据(JSON字符串形式)
  3. const handleFileUpload = (event:any) => {
  4. const file = event.target.files[0];
  5. if (file) {
  6. const reader = new FileReader();
  7. reader.onload = (e:any) => {
  8. const data = new Uint8Array(e.target.result);
  9. const workbook = XLSX.read(data, { type: 'array' });
  10. // 假设我们只读取第一个工作表
  11. const firstSheetName = workbook.SheetNames[0];
  12. const worksheet = workbook.Sheets[firstSheetName];
  13. const rows = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: '' }); // 使用 defval 来处理空单元格
  14. console.log("看看所有数据...",rows)
  15. // 创建一个新数组来存储非空行
  16. const nonEmptyRows = [] as any;
  17. rows.forEach((row:any, rowIndex) => {
  18. // 跳过标题行(如果有的话)
  19. if (rowIndex === 0) return;
  20. // 创建一个新对象来存储当前行的数据
  21. const rowData = {} as any;
  22. let allEmpty = true; // 标记当前行是否全部为空
  23. Object.keys(row).forEach((key, colIndex) => {
  24. // 跳过第一列(通常是索引列或标题列)
  25. // if (colIndex === 0) return;
  26. // 检查单元格是否为空(考虑空字符串和 undefined)
  27. if (row[key] !== '' && row[key] !== undefined) {
  28. allEmpty = false; // 如果有一个非空单元格,则标记为 false
  29. rowData[key] = row[key]; // 将非空单元格的数据添加到对象中
  30. }
  31. });
  32. // 如果当前行不是全部为空,则添加到非空行数组中
  33. if (!allEmpty) {
  34. nonEmptyRows.push(rowData);
  35. }
  36. });
  37. // 更新响应式变量
  38. jsonData.value = nonEmptyRows;
  39. formattedJsonData.value = JSON.stringify(nonEmptyRows, null, 2);
  40. console.log("看看组装的json数据",jsonData.value)
  41. // console.log("看看json字符串数据",formattedJsonData.value)
  42. };
  43. reader.readAsArrayBuffer(file);
  44. }
  45. };

解析成有属性名称的json对象数组

增加一个映射关系即可。代码如下:

  1. // 导入的时候读取excel里边的映射关系
  2. const mappingData = reactive({
  3. // 培训任务证书
  4. trainingTask: {
  5. 0: 'UserName',
  6. 1: 'IDCARD',
  7. 2: 'TrainingProgramName',
  8. 3: 'TrainingSubProgramName',
  9. 4: 'CertificateTemplateId'
  10. } as any,
  11. // 培训项目证书(只有大项目没有子任务的)
  12. trainingProgram: {}
  13. })
  14. const fileInut = ref(null)
  15. const openChoiseFile = () => {
  16. fileInut.value.click()
  17. }
  18. const jsonData = ref([]) // 用于存储最终组装好的 JSON 数据
  19. const formattedJsonData = ref('') // 用于显示格式化的 JSON 数据(JSON字符串形式)
  20. const handleFileUpload = (event: any) => {
  21. const file = event.target.files[0]
  22. if (file) {
  23. const reader = new FileReader()
  24. reader.onload = (e: any) => {
  25. const data = new Uint8Array(e.target.result)
  26. const workbook = XLSX.read(data, { type: 'array' })
  27. // 假设我们只读取第一个工作表
  28. const firstSheetName = workbook.SheetNames[0]
  29. const worksheet = workbook.Sheets[firstSheetName]
  30. const rows = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: '' }) // 使用 defval 来处理空单元格
  31. // 创建一个新数组来存储非空行
  32. const nonEmptyRows = [] as any
  33. rows.forEach((row: any, rowIndex) => {
  34. // 跳过标题行(如果有的话)
  35. if (rowIndex === 0) return
  36. // 创建一个新对象来存储当前行的数据
  37. const rowData = {} as any
  38. let allEmpty = true // 标记当前行是否全部为空
  39. Object.keys(row).forEach((key, colIndex) => {
  40. // 跳过第一列(通常是索引列或标题列)
  41. // if (colIndex === 0) return;
  42. // 检查单元格是否为空(考虑空字符串和 undefined)
  43. if (row[key] !== '' && row[key] !== undefined) {
  44. allEmpty = false // 如果有一个非空单元格,则标记为 false
  45. rowData[mappingData.trainingTask[key]] = row[key] // 将非空单元格的数据添加到对象中
  46. }
  47. })
  48. // 如果当前行不是全部为空,则添加到非空行数组中
  49. if (!allEmpty) {
  50. nonEmptyRows.push(rowData)
  51. }
  52. })
  53. // 更新响应式变量
  54. jsonData.value = nonEmptyRows
  55. formattedJsonData.value = JSON.stringify(nonEmptyRows, null, 2)
  56. // console.log('看看组装的json数据', jsonData.value)
  57. console.log("看看json字符串数据",formattedJsonData.value)
  58. }
  59. reader.readAsArrayBuffer(file)
  60. }
  61. }

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

vue3,vue组件,props给一个对象参数。vue组件间传参数vue父组件给子组件传参数。组件参数类型。父组件调用子组件的方法。vue组件事件监听,给子组件传递方法,子组件调用父组件方法

[TOC]组件可以使用props给组件传值,可以同时传递多个,可以是任意类型,比如字符串或者对象。 下面是个简单的例子: &lt...

vue3最基础的数据加载,表格table

vue3表格加载一点静态数据 &lt;template&gt; &lt;el-table :data=&quot;tableData&quot; style=&quot;width: 100%&quot...

vue3 Element Plus 表单输入框放到一行

当垂直方向空间受限且表单较简单时,可以在一行内放置表单。 通过设置 inline 属性为 true 可以让表单域变为行内的表单域...

vue3 Element ui Plus 表格 分页,vue3 el-pagination分页

其实就是el-pagination控件的使用而已 &lt;template&gt; &lt;div&gt; &lt;el-table :data=&quot;tableData&quot; ...

vue触发a标签的点击事件。vue3 dom操作 触发点击事件 。文件选择库只会触发一次change事件的问题

[TOC]vue触发a标签的点击事件直接操作dom节点的方式比较简单 &lt;button @click=&quot;handleBtnClick&quot;&gt;点击按钮&...

vue3 ref的使用多个ref的使用。通过ref触发点击事件

多个ref获取的方法可以使用一样的,通过变量名来区分就行了 const vabUploadRef = ref() const multipleTableRef = ref() ...

vue elementui,vue3 element plus 文件上传的时候设置其他参数。后台.net接收传递的额外参数。图片上传

比如上传文件的时候额外传递两个select选择的值 前台前面上传文件的时候要提供默认参数很简单,el-upload绑定一个data即可...

vue,vue3 打开新页面,页面跳转。vue跳转到一个新页面。vue路由传参,vue3路由传参,vue3 获取路由参数

[TOC]VUE页面跳转本地页面跳转 goApplicationCenter() { //进行页面跳转 let path = &quot;/application-center&quo...

vuevue3组件封装,vue组件模板。简单组件模板。基础组件模板。vue引入自定义的组件。vue使用自定义的组件。插槽slot使用。vue封装格子效果,一块一块的grid布局效果

[TOC]vue封装组件的简单模板贴一个简单模板方便自定义组件的时候直接复制 &lt;template&gt; &lt;div class=&quot;app...

.net6 Signalr+vue3 的运用(上)

.net6 Signalr+Vue3 的运用(上)[TOC] 什么是 SignalR?ASP.NET Core SignalR 是一个开放源代码库,可用于简化向应用添加...

.net6 Signalr+vue3 的运用(下)

.net6 Signalr+Vue3 的运用(下)[TOC] 上篇链接:https://www.tnblog.net/hb/article/details/7961SignalR 中的用户 Sig...

.net6 Signalr+vue3 配合Ingress Nginx的运用

.net6 Signalr+Vue3 配合Ingress Nginx的运用[TOC] 结合上篇:https://www.tnblog.net/hb/article/details/7963 项目打...

vue3 Element Plus 表格使用vue3常用界面搭配。vue3基础模板使用

一个简单的表格加时间搜索界面效果如下: 代码如下: &lt;template&gt; &lt;div class=&quot;app-container&quot;&g...

vue3 如何加prototype。vue3使用globalProperties

在2.X版本中创建一个vue 实例是通过 new Vue()来实现的,到了3.X中则是通过使用createApp这个 API返回一个应用实例,并且可...