在前端开发中,有时需要将数据导出为Excel表格。本文将介绍如何使用纯前端技术实现这一功能,包括安装必要的插件、封装公共导出功能,并详细解释实现步骤。
![图片[1]_纯前端实现Excel表格导出功能_知途无界](https://zhituwujie.com/wp-content/uploads/2024/10/d2b5ca33bd20241005110916.png)
1. 安装所需插件
首先,我们需要安装三个插件:xlsx
、file-saver
和xlsx-style-medalsoft
。这些插件分别用于处理Excel文件的生成、保存以及样式的支持。
npm install xlsx@0.16.8npm install file-savernpm install xlsx-style-medalsoftnpm install xlsx@0.16.8 npm install file-saver npm install xlsx-style-medalsoftnpm install xlsx@0.16.8 npm install file-saver npm install xlsx-style-medalsoft
2. 封装公共导出功能
接下来,我们在项目的utils
文件夹下的tools.js
文件中封装一个公共的导出功能。这个函数将接收一个配置对象,包括要导出的表格DOM选择器、文件名、列宽和行名等参数。
import FileSaver from "file-saver";import XLSX from "xlsx";import XLSXStyle from "xlsx-style-medalsoft"; // 注意:这里使用的是xlsx-style-medalsoft插件,它提供了对Excel样式的支持const OMS = {};// 导出Excel函数 - 单表格Excel带样式OMS.downLoadXlsx = ({dom = "el-table", // 表格的DOM选择器,默认为"el-table"name = "文件", // 导出的Excel文件名,默认为"文件"ColumnWdth = [], // 列宽数组,默认为空数组rowName = null, // 行名(表头),如果为null则不设置// ...其他可能的配置参数}) => {// 获取表格DOM元素const table = document.querySelector(dom);if (!table) {console.error("未找到指定的表格DOM元素");return;}// 将表格转换为工作簿const workbook = XLSXStyle.utils.table_to_book(table, { sheet: "Sheet1" });// 设置列宽(可选)if (ColumnWdth.length > 0) {const worksheet = workbook.Sheets["Sheet1"];ColumnWdth.forEach((width, index) => {if (worksheet["!cols"]) {worksheet["!cols"][index] = { wch: width }; // 设置列宽,单位为字符宽度} else {worksheet["!cols"] = [{ wch: width }]; // 初始化列宽数组if (index > 0) {// 对于非第一列,需要添加空列宽对象以保持索引一致for (let i = 1; i < index; i++) {worksheet["!cols"].push({});}}}});}// 设置行名(可选)if (rowName) {// 这里可以添加设置行名的代码,但通常行名已经包含在表格的表头中// 如果需要额外处理,可以在此添加逻辑}// 生成Excel文件并保存const excelBuffer = XLSXStyle.write(workbook, {bookType: "xlsx",type: "array",});const blob = new Blob([excelBuffer], { type: "application/octet-stream" });FileSaver.saveAs(blob, `${name}.xlsx`);};export default OMS;import FileSaver from "file-saver"; import XLSX from "xlsx"; import XLSXStyle from "xlsx-style-medalsoft"; // 注意:这里使用的是xlsx-style-medalsoft插件,它提供了对Excel样式的支持 const OMS = {}; // 导出Excel函数 - 单表格Excel带样式 OMS.downLoadXlsx = ({ dom = "el-table", // 表格的DOM选择器,默认为"el-table" name = "文件", // 导出的Excel文件名,默认为"文件" ColumnWdth = [], // 列宽数组,默认为空数组 rowName = null, // 行名(表头),如果为null则不设置 // ...其他可能的配置参数 }) => { // 获取表格DOM元素 const table = document.querySelector(dom); if (!table) { console.error("未找到指定的表格DOM元素"); return; } // 将表格转换为工作簿 const workbook = XLSXStyle.utils.table_to_book(table, { sheet: "Sheet1" }); // 设置列宽(可选) if (ColumnWdth.length > 0) { const worksheet = workbook.Sheets["Sheet1"]; ColumnWdth.forEach((width, index) => { if (worksheet["!cols"]) { worksheet["!cols"][index] = { wch: width }; // 设置列宽,单位为字符宽度 } else { worksheet["!cols"] = [{ wch: width }]; // 初始化列宽数组 if (index > 0) { // 对于非第一列,需要添加空列宽对象以保持索引一致 for (let i = 1; i < index; i++) { worksheet["!cols"].push({}); } } } }); } // 设置行名(可选) if (rowName) { // 这里可以添加设置行名的代码,但通常行名已经包含在表格的表头中 // 如果需要额外处理,可以在此添加逻辑 } // 生成Excel文件并保存 const excelBuffer = XLSXStyle.write(workbook, { bookType: "xlsx", type: "array", }); const blob = new Blob([excelBuffer], { type: "application/octet-stream" }); FileSaver.saveAs(blob, `${name}.xlsx`); }; export default OMS;import FileSaver from "file-saver"; import XLSX from "xlsx"; import XLSXStyle from "xlsx-style-medalsoft"; // 注意:这里使用的是xlsx-style-medalsoft插件,它提供了对Excel样式的支持 const OMS = {}; // 导出Excel函数 - 单表格Excel带样式 OMS.downLoadXlsx = ({ dom = "el-table", // 表格的DOM选择器,默认为"el-table" name = "文件", // 导出的Excel文件名,默认为"文件" ColumnWdth = [], // 列宽数组,默认为空数组 rowName = null, // 行名(表头),如果为null则不设置 // ...其他可能的配置参数 }) => { // 获取表格DOM元素 const table = document.querySelector(dom); if (!table) { console.error("未找到指定的表格DOM元素"); return; } // 将表格转换为工作簿 const workbook = XLSXStyle.utils.table_to_book(table, { sheet: "Sheet1" }); // 设置列宽(可选) if (ColumnWdth.length > 0) { const worksheet = workbook.Sheets["Sheet1"]; ColumnWdth.forEach((width, index) => { if (worksheet["!cols"]) { worksheet["!cols"][index] = { wch: width }; // 设置列宽,单位为字符宽度 } else { worksheet["!cols"] = [{ wch: width }]; // 初始化列宽数组 if (index > 0) { // 对于非第一列,需要添加空列宽对象以保持索引一致 for (let i = 1; i < index; i++) { worksheet["!cols"].push({}); } } } }); } // 设置行名(可选) if (rowName) { // 这里可以添加设置行名的代码,但通常行名已经包含在表格的表头中 // 如果需要额外处理,可以在此添加逻辑 } // 生成Excel文件并保存 const excelBuffer = XLSXStyle.write(workbook, { bookType: "xlsx", type: "array", }); const blob = new Blob([excelBuffer], { type: "application/octet-stream" }); FileSaver.saveAs(blob, `${name}.xlsx`); }; export default OMS;
3. 使用导出功能
现在,我们可以在项目的任何地方引入并使用这个封装好的导出功能。例如,在一个Vue组件中:
<template><div><el-table ref="exportTable" :data="tableData"><!-- 表格列定义 --><el-table-column prop="name" label="姓名"></el-table-column><el-table-column prop="age" label="年龄"></el-table-column><!-- 其他列 --></el-table><el-button @click="exportExcel">导出Excel</el-button></div></template><script>import OMS from "@/utils/tools";export default {data() {return {tableData: [{ name: "张三", age: 25 },{ name: "李四", age: 30 },// 其他数据],};},methods: {exportExcel() {OMS.downLoadXlsx({dom: this.$refs.exportTable.$el.querySelector(".el-table__body-wrapper table"), // 注意:这里需要获取到实际的表格DOM元素,可能需要根据实际情况调整选择器name: "导出数据",ColumnWdth: [15, 10], // 设置姓名列宽为15个字符,年龄列宽为10个字符});},},};</script><template> <div> <el-table ref="exportTable" :data="tableData"> <!-- 表格列定义 --> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <!-- 其他列 --> </el-table> <el-button @click="exportExcel">导出Excel</el-button> </div> </template> <script> import OMS from "@/utils/tools"; export default { data() { return { tableData: [ { name: "张三", age: 25 }, { name: "李四", age: 30 }, // 其他数据 ], }; }, methods: { exportExcel() { OMS.downLoadXlsx({ dom: this.$refs.exportTable.$el.querySelector(".el-table__body-wrapper table"), // 注意:这里需要获取到实际的表格DOM元素,可能需要根据实际情况调整选择器 name: "导出数据", ColumnWdth: [15, 10], // 设置姓名列宽为15个字符,年龄列宽为10个字符 }); }, }, }; </script><template> <div> <el-table ref="exportTable" :data="tableData"> <!-- 表格列定义 --> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <!-- 其他列 --> </el-table> <el-button @click="exportExcel">导出Excel</el-button> </div> </template> <script> import OMS from "@/utils/tools"; export default { data() { return { tableData: [ { name: "张三", age: 25 }, { name: "李四", age: 30 }, // 其他数据 ], }; }, methods: { exportExcel() { OMS.downLoadXlsx({ dom: this.$refs.exportTable.$el.querySelector(".el-table__body-wrapper table"), // 注意:这里需要获取到实际的表格DOM元素,可能需要根据实际情况调整选择器 name: "导出数据", ColumnWdth: [15, 10], // 设置姓名列宽为15个字符,年龄列宽为10个字符 }); }, }, }; </script>
注意:在Vue组件中使用时,由于Element UI的表格组件有额外的DOM结构,因此我们需要通过this.$refs.exportTable.$el.querySelector(".el-table__body-wrapper table")
来获取到实际的表格DOM元素。这个选择器可能需要根据你实际使用的UI框架和版本进行调整。
另外,xlsx-style-medalsoft
插件可能不是官方或广泛使用的插件,因此在实际项目中可能需要根据插件的文档和实际情况进行调整。如果官方xlsx
插件已经满足你的需求(即不需要支持复杂的样式),你也可以只使用xlsx
和file-saver
两个插件。
© 版权声明
文中内容均来源于公开资料,受限于信息的时效性和复杂性,可能存在误差或遗漏。我们已尽力确保内容的准确性,但对于因信息变更或错误导致的任何后果,本站不承担任何责任。如需引用本文内容,请注明出处并尊重原作者的版权。
THE END
暂无评论内容