Vue3-导出导入excel

功能

主要实现excel导入导出功能,同时具有合并单元格,美化单元格等功能,引用依赖包exceljs、file-saver,好像也没有什么要介绍的,可以看看官网文档然后直接使用了

导入依赖包

pnpm install exceljs file-saver @types/file-saver

封装Excel帮助类(excelHelper.js)

import ExcelJS from 'exceljs'
import FileSaver from 'file-saver'
import { cloneDeep } from 'lodash'/*** 读取excel文件* @param {object} file 文件* @param {String} sheetName 获取工作表名称* @returns */
export async function readExcelFile(file, sheetName) {const arrayBuffer = file.arrayBuffer()const result = []const workbook = new ExcelJS.Workbook()await workbook.xlsx.load(arrayBuffer)const worksheet = workbook.getWorksheet(sheetName || 1)worksheet.eachRow((row, rowNumber) => {console.log(rowNumber)const rowData = []result.push(rowData)row.eachCell((cell, colNumber) => {rowData.push(cell.value)console.log(colNumber)})})return result
}
/*** * 数据导出excel* @param {String} excelOpt.fileName   导出文件名* @param {String} excelOpt.configs.sheetName 工作表名称,默认从sheet1开始* @param {Array[Array]} excelOpt.configs.headers  表格头部 eg:[['标题1','标题2'],['标题3','标题4']]* @param {Array[Array]} excelOpt.configs.data   表格数据* @param {Array[Object]} excelOpt.configs.merges 合并信息 eg:[row: 0, col: 0, rowspan: 3, colspan: 1]* @param {Array[object]} excelOpt.configs.views 工作表视图配置* @param {Array[Number]} config.columnsWidth 每个字段列对应的宽度* @param {Object} excelOpt.configs.protect 工作表保护【此配置会保护全表,一般推荐只针对单元格进行保护配置】* @param {Array} excelOpt.configs.fields 辅助导出顺序* */
export function exportExcel(excelOpt) {if (!excelOpt) returnconst opt = cloneDeep(excelOpt)console.dir(excelOpt.sheetInfos[0])const dataOptions = {fileName: opt.fileName || `导出excel文件【${Date.now()}】.xlsx`,worksheets: []}if (!Array.isArray(opt.sheetInfos)) {opt.sheetInfos = [opt.sheetInfos]}opt.sheetInfos.forEach(item => {//对象根据fields进行组装数组数据let data = item.data.map(obj => {return item.fields.map(key => {return obj[key]})})let excelData = [].concat(item.headers).concat(data)let merges = item.merges.map(m => {return [m.row + 1, m.col + 1, m.row + m.rowspan, m.col + m.colspan]})let excelAttrs = item.attrs.map(attr => {attr.rowStart += 1;attr.rowEnd += 1;attr.colStart += 1;attr.colEnd += 1;return attr})dataOptions.worksheets.push({data: excelData,merges: merges,attrs: excelAttrs,views: item.views,columnsWidth: item.columnsWidth,protect: item.protect,sheetName: item.sheetName})})createExcel(dataOptions)
}
// 创建Excel文件方法
async function createExcel(options) {if (!options.worksheets.length) return;// 创建工作簿const workbook = new ExcelJS.Workbook();for (let i = 0; i < options.worksheets.length; i++) {const sheetOption = options.worksheets[i];// 创建工作表const sheet = workbook.addWorksheet(sheetOption.sheetName || 'sheet' + (i + 1));// 添加数据行sheet.addRows(sheetOption.data);// 配置视图sheet.views = sheetOption.views;// 单元格合并处理【开始行,开始列,结束行,结束列】if (sheetOption.merges) {sheetOption.merges.forEach((item) => {sheet.mergeCells(item);});}// 工作表保护if (sheetOption.protect) {// const res = await sheet.protect(sheetOption.protect.password, sheetOption.protect.options);await sheet.protect(sheetOption.protect.password, sheetOption.protect.options);}// 单元格样式处理if (sheetOption.attrs.length) {sheetOption.attrs.forEach((item) => {const attr = item.attr || {};// 获取开始行-结束行; 开始列-结束列const rowStart = item.rowStart;const rowEnd = item.rowEnd;const colStart = item.colStart;const colEnd = item.colEnd;if (rowStart) { // 设置行for (let r = rowStart; r <= rowEnd; r++) {// 获取当前行const row = sheet.getRow(r);if (colStart) { // 列设置for (let c = colStart; c <= colEnd; c++) {// 获取当前单元格const cell = row.getCell(c);Object.keys(attr).forEach((key) => {// 给当前单元格设置定义的样式cell[key] = attr[key];});}} else {// 未设置列,整行设置【大纲级别】Object.keys(attr).forEach((key) => {row[key] = attr[key];});}}} else if (colStart) { // 未设置行,只设置了列for (let c = colStart; c <= colEnd; c++) {// 获取当前列,整列设置【大纲级别】const column = sheet.getColumn(c);Object.keys(attr).forEach((key) => {column[key] = attr[key];});}} else {// 没有设置具体的行列,则为整表设置Object.keys(attr).forEach((key) => {sheet[key] = attr[key];});}})}// 列宽设置if (sheetOption.columnsWidth) {for (let i = 0; i < sheet.columns.length; i++) {sheet.columns[i].width = sheetOption.columnsWidth[i]}}}// 生成excel文件workbook.xlsx.writeBuffer().then(buffer => {// application/octet-stream 二进制数据FileSaver.saveAs(new Blob([buffer], { type: 'application/octet-stream' }), options.fileName)})
}

使用(导出,导入)

//导出
const exportExcelFn = () => {const data = [{index: 1,title1: 'title1-1',title2: 'title1-2',title3: 'title1-3',title4: 'title1-4',title5: 'title1-5',title6: 'title1-6',title7: 'title1-7',title8: 'title1-8',title9: 'title1-9',title10: 'title1-10',},{index: 2,title1: 'title2-1',title2: 'title2-2',title3: 'title2-3',title4: 'title2-4',title5: 'title2-5',title6: 'title2-6',title7: 'title2-7',title8: 'title2-8',title9: 'title2-9',title10: 'title2-10',}]const opt = {fileName: '积分明细.xlsx',sheetInfos: [{fields: ['index', 'title1', 'title2', 'title3', 'title4', 'title5', 'title6', 'title7', 'title8', 'title9', 'title10'],headers: [['序号', '标题1', '标题2', '标题3', '标题4', '标题5', '标题6', '标题7', '标题8', '标题9', '标题10']],data: data,merges: [// { row: 1, col: 1, rowspan: 11, colspan: 1 },],attrs: [],columnsWidth: [20, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],sheetName: '导出数据测试'}]}//设置单元格样式opt.sheetInfos.map(item => {item.attrs.push({rowStart: 0,rowEnd: item.headers.length + item.data.length,colStart: 0,colEnd: item.headers[0].length - 1,attr: {alignment: { vertical: "middle", horizontal: "center" },// border: {//   top: { style: "thin" },//   left: { style: "thin" },//   bottom: { style: "thin" },//   right: { style: "thin" }// }}})// 设置表头填充颜色,字体加粗item.attrs.push({rowStart: 0,rowEnd: item.headers?.length - 1,colStart: 0,colEnd: item.headers[0].length - 1,attr: {fill: {type: "pattern",pattern: "solid",fgColor: { argb: "99CCFF" }},font: {bold: true}}})})exportExcel(opt)
}

<script setup>
import { readExcelFile } from '@/utils/excelHelper'const fileUploadFn = async (file) => {const excelData = await readExcelFile(file)console.log('Excel Data:', excelData)return false;
}
</script><template><div><el-upload :before-upload="fileUploadFn" accept=".xlsx, .xls"><el-button type="primary" class="upload">上传</el-button></el-upload></div>
</template>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51194.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MybatisPlus核心用法

MybatisPlus核心用法 目录 MybatisPlus核心用法1.使用MybatisPlus的基本步骤&#xff1a;2.MybatisPlus是如何获取实现CRUD的数据库表信息的&#xff1f;3.MybatisPlus的常用注解有哪些&#xff1f;如果表名称和实体类名称不符合约定该怎么做&#xff1f;IdType的常见类型有哪些…

漏洞复现-F6-11泛微-E-Cology-SQL

本文来自无问社区&#xff0c;更多漏洞信息可前往查看http://www.wwlib.cn/index.php/artread/artid/15575.html 0x01 产品简介 泛微协同管理应用平台e-cology是一套企业级大型协同管理平台 0x02 漏洞概述 该漏洞是由于泛微e-cology未对用户的输入进行有效的过滤&#xff0…

Python爬虫技术 第17节 使用BeautifulSoup

使用Python进行网页爬取是一个常见的任务&#xff0c;特别是当需要从网站上批量获取数据时。BeautifulSoup是一个非常流行的Python库&#xff0c;用于解析HTML和XML文档&#xff0c;非常适合用来提取网页中的信息。 下面我将通过一个简单的案例来介绍如何使用Python和Beautifu…

Skyeye云智能制造企业版源代码全部开放

智能制造一体化管理系统 [SpringBoot2 - 快速开发平台]&#xff0c;适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模…

vue3 快速入门 (六) : vue中调用HTTP请求

1. 本文环境 Vue版本 : 3.4.29Node.js版本 : v20.15.0系统 : Windows11 64位IDE : VsCode 1.91.0 2. 访问HTTP 在Vue中&#xff0c;访问HTTP&#xff0c;可以使用axios第三方库。 axios 是一个基于 promise 的网络请求库&#xff0c;可以用于浏览器和 node.js。 axios使用简…

DelegateExecution和EXecution有啥区别

DelegateExecution 和 Execution 都是 Activiti 引擎中用于表示流程实例的执行对象&#xff0c;但它们在具体使用上有一些区别&#xff1a; DelegateExecution • 接口&#xff1a;DelegateExecution 是一个接口&#xff0c;继承自 VariableScope 接口。它主要在扩展点&#…

遗传算法与深度学习实战——进化深度学习

遗传算法与深度学习实战——进化深度学习 0. 前言1. 进化深度学习1.1 进化深度学习简介1.2 进化计算简介 2. 进化深度学习应用场景3. 深度学习优化3.1 优化网络体系结构 4. 通过自动机器学习进行优化4.1 自动机器学习简介4.2 AutoML 工具 5. 进化深度学习应用5.1 模型选择&…

【mybatis的批量操作】

在日常开发中&#xff0c;如果要操作数据库的话&#xff0c;或多或少都会遇到批量数据的处理&#xff0c;我们公司使用的mybaits-plus作为持久层的框架&#xff0c;今天就简单介绍一下mybaits批量操作数据库的几种方式。 1.循环插入 其实这种方式并不是批量插入&#xff0c;只…

功能实现——使用 OpenPDF 将 HTML 转换为 PDF,并将其上传到 FTP 服务器

目录 1.需求分析2.项目环境搭建3.将 HTML 转换为 PDF3.1.代码实现mail.htmlHtmlToPDFController.javaPDFConverterService.javaPDFConverterServiceImpl.java 3.2.测试3.3.注意事项 4.将生成的 PDF 上传到 FTP 服务器4.1.搭建 FTP 服务器4.2.配置文件4.3.代码实现FtpUtil.javaF…

谷粒商城实战笔记-75-商品服务-API-品牌管理-品牌分类关联与级联更新

文章目录 一&#xff0c;引入Mybatis Plus分页插件二&#xff0c;品牌列表的模糊查询三&#xff0c;增加品牌测试数据四&#xff0c;开发后台品牌关联分类接口1&#xff0c;接口product/categorybrandrelation/catelog/list2&#xff0c;接口product/categorybrandrelation/sav…

拓扑排序与有向无环图 -- Kahn算法和深度优先搜索

拓扑排序与有向无环图 文章目录 拓扑排序与有向无环图1. 什么是拓扑排序快速排序&#xff08;Quick Sort&#xff09;拓扑排序&#xff08;Topological Sort&#xff09;主要区别 2. 拓扑排序与有向无环图之间的契合性3. Kahn算法实现拓扑排序算法思想算法步骤算法代码 4. 深度…

线性回归从零实现

《李沐动手学深度学习》P30 import numpy as np import matplotlib.pyplot as plt import random# y x * w b noise # x dimension: (num_samples, 2) # w dimension: (2, 1) # b dimension: (1, 1) # noise dimension: (num_samples, 1) def generate_data(num_samples, w…

汽车长翅膀:GPU 是如何加速深度学习模型的训练和推理过程的?

编者按&#xff1a;深度学习的飞速发展离不开硬件技术的突破&#xff0c;而 GPU 的崛起无疑是其中最大的推力之一。但你是否曾好奇过&#xff0c;为何一行简单的“.to(‘cuda’)”代码就能让模型的训练速度突飞猛进&#xff1f;本文正是为解答这个疑问而作。 作者以独特的视角&…

数仓架构解析(第45天)

系列文章目录 经典数仓架构传统离线大数据架构 文章目录 系列文章目录烂橙子-终生成长群群主前言1. 经典数仓架构2. 传统离线大数据架构 烂橙子-终生成长群群主 前言 经典数仓架构 传统离线大数据架构 背景解析 1. 经典数仓架构 1991年&#xff0c;比尔恩门&#xff08;Bill…

Python 中 Caffe 库的使用方法

Caffe 是一个由伯克利视觉与学习中心 (Berkeley Vision and Learning Center, BVLC) 开发的深度学习框架。它特别适用于图像分类和图像分割任务。以下是一个关于如何使用 Caffe 库的详细指南&#xff0c;包括安装、配置、构建和训练模型的步骤。 1. 安装 Caffe 安装 Caffe 可以…

Pinokio:一键安装开源 AI 应用

整合了几乎所有市面上开源的 AI 工具傻瓜式地一键安装AI 工具支持全平台&#xff1a;Windows、Mac、Linux官网&#xff1a;https://pinokio.computer项目仓库&#xff1a;GitHub - pinokiocomputer/pinokio: AI Browser文章地址&#xff1a;https://blog.i68.ltd/archives/Pino…

牛客算法题解:数字统计、两个数组的交集、点击消除

目录 BC153 [NOIP2010]数字统计 ▐ 题解 NC313 两个数组的交集 ▐ 题解 AB5 点击消除 ▐ 题解 BC153 [NOIP2010]数字统计 题目描述&#xff1a; 题目链接&#xff1a; [NOIP2010]数字统计_牛客题霸_牛客网 (nowcoder.com) ▐ 题解 题目要求统计出某段数组中一共有多少个…

关于Buffer和Channel的注意事项和细节

1.举例 package org.example.demo;import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.util.RandomAccess;/*** MappedByteBuffer可…

Linux入门级常用命令行(二)

目录 1、mv指令 2、rm指令 3、通配符* 4、chmod指令 5、tar指令 1、mv指令 功能 用于移动或重命名文件和目录的命令 基本用法 mv [选项] 源文件或目录 目标文件或目录 常用选项 -i&#xff1a;在覆盖文件之前提示用户确认。-f&#xff1a;强制移动或重命名&#xff0…

动量参数(Momentum Parameter)

动量参数&#xff08;Momentum Parameter&#xff09;在机器学习中指的是一种用于加速梯度下降算法的技术&#xff0c;特别是深度学习中优化神经网络权重时。简单来说&#xff0c;动量参数是一种帮助优化过程加速并减少震荡的技术。 具体来说&#xff0c;动量参数具有以下特点…