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

Vue 项目中 Excel 导入导出功能笔记

功能概述

该代码实现了 Vue 项目中 Excel 文件的三大核心功能:

  1. Excel 导入:上传文件并解析数据,刷新表格展示。
  2. 模板下载:获取并下载标准 Excel 模板文件。
  3. 数据导出:将表格数据按多级表头结构导出为 Excel 文件。

一. Excel 导入功能

使用FormData封装文件数据,支持二进制文件上传。

通过 API 请求与后端交互,根据响应状态处理成功 / 失败逻辑。

const uploadTemp = ref(); // 上传组件引用
const exportImportHandler = async (files) => {const fileForm = new FormData();fileForm.append('file', files.file); // 封装文件数据const { code, message } = await ImportExcelApi(fileForm); // 调用上传APIif (code === 200) {ElMessage.success('导入成功');uploadTemp.value.clearFiles(); // 清空上传组件getTableList(); // 刷新表格数据} else {ElMessage.error(message);}
};

二. 模板下载功能

通过 API 获取模板文件的二进制数据(Blob)。

使用downloadfile工具函数将 Blob 转换为可下载的文件。 

const fileBlob = ref();
const downloadFileTemp = async () => {try {fileBlob.value = await DownloadTemplateAPI(); // 获取模板数据// 利用LuckyExcel处理Excel文件(可选,根据库需求)downloadfile({ excelFileName: '储气库排液情况模板.xlsx' }, fileBlob.value);} catch (error) {console.error(error);}
};

三. 数据导出功能

1.调用导出api

const exportHandler = async () => {const headers = []; // 表头数组(二维数组,代表多级表头)const columns = []; // 列配置数组realTableColumn.value.forEach(item => {if (item.prop !== "operator") { // 排除操作列if (item.children) {// 处理有子列的情况(三级表头)item.children.forEach(child => {const header = [];header.push("重点工作安排"); // 一级表头header.push(item.label);    // 二级表头header.push(child.label);   // 三级表头headers.push(header);columns.push({ columnKey: child.prop, columnDict: [] });});} else {// 处理普通列(两级表头)const header = [];header.push("重点工作安排"); // 一级表头for (let i = 0; i < 2; i++) {header.push(item.label); // 二级表头重复两次(保持结构一致)}headers.push(header);columns.push({ columnKey: item.prop, columnDict: [] });}}});// 调用导出API并下载const params = { headers, columns, /* 其他参数 */ };const resData = await ExportExcelApi(params);downloadfile(resData, '重点工作安排.xlsx');
};

header.push:用于构建多级表头的层级结构,将各级表头名称按顺序存入数组,

最终形成二维数组(如[['一级', '二级', '三级'], ...]),供 Excel 导出工具识别。示例:

const header = [];
header.push("一级表头");   // 数组变为 ["一级表头"]
header.push("二级表头");   // 数组变为 ["一级表头", "二级表头"]
header.push("三级表头");   // 数组变为 ["一级表头", "二级表头", "三级表头"]
headers.push(header);      // 最终存入二维数组 [["一级表头", "二级表头", "三级表头"]]

2.不调用导出api

const dataOut = async () => {try {// 检查是否有数据可导出if (!tableBody.tableData || tableBody.tableData.length === 0) {ElMessage.warning('没有数据可导出');return;}// 动态导入xlsx库const XLSX = await import('xlsx');// 转换数据格式,将列prop映射为labelconst exportData = tableBody.tableData.map(item => {const row = {};tableColumn.forEach(column => {if (column.prop && column.label) {// 处理嵌套属性const value = column.prop.split('.').reduce((acc, part) => {return acc && acc[part] !== undefined ? acc[part] : '';}, item);row[column.label] = value;}});return row;});// 创建工作簿和工作表const ws = XLSX.utils.json_to_sheet(exportData);const wb = XLSX.utils.book_new();XLSX.utils.book_append_sheet(wb, ws, '测试数据记录');// 导出文件const fileName = `测试数据记录_${new Date().toLocaleDateString()}.xlsx`;XLSX.writeFile(wb, fileName);ElMessage.success('数据导出成功');} catch (error) {console.error('数据导出失败:', error);ElMessage.error('数据导出失败,请联系管理员');}
};

四、接口工具函数

import http from '@/utils/http/index';
export enum Api {ImportExcel = '/dilraba/Dilmurat/imports', // 导入DownloadTemplate = '/dilraba/Dilmurat/downloadTemplate', // 下载模板
}
/** 下载重点工作模板 */
export function DownloadTemplateAPI() {return http.get({url: API.DownloadTemplate,responseType: 'blob'});
}
// 导入
export function ImportExcelApi(data = {}) {return http.post({url: API.ImportExcel,data: data});
}

相关文章:

  • AWS OIDC 详解:告别长期密钥,拥抱安全高效的云身份验证
  • 【YOLOv13保姆级教程#02】Pytorch环境配置与conda虚拟环境搭建 | 10分钟搞定目标检测推理验证
  • 一站式了解SPI机制
  • 网络攻防技术
  • Bootstrap 5学习教程,从入门到精通,Bootstrap 5 Flex 布局语法知识点及案例(27)
  • 蓝凌流程引擎流程图格式化实现原理全解
  • 滚珠导轨如何助力自动化生产实现高质量输出?
  • Moldina: 多配体分子对接新工具,兼具精准度与运行速度的双重突破
  • 移动端日志平台EMAS
  • SQL关键字三分钟入门:RANK() —— 窗口函数
  • 深入解析 Electron 核心模块:构建跨平台桌面应用的关键
  • zookeeper Curator(1):认识zookeeper和操作命令
  • 【大数据】HDFS分布式 机架感知
  • 2.2.3、CAN总线-位时间特性、中断
  • 删除排序数组中的重复项 II
  • 搭建Flink分布式集群
  • nginx目录美化
  • OD 算法题 B卷【数字序列比大小】
  • C++法则20:元编程是 C++ 中实现零开销抽象的核心工具之一,但并非所有抽象都能通过它实现零开销。
  • 人大金仓数据库jdbc连接jar包kingbase8-8.6.0.jar驱动包最新版下载(不需要积分)