Vue3.0导出数据为自定义样式Excel

news2024/11/28 15:41:40

前言


当下开发web应用系统的时候,我们往往会遇到需要把网页上面的数据导出到excel这样的需求,真实的企业项目里对应一些导出财务报表、员工信息、交易记录、考勤打卡记录…等等需求,本文将对此做探讨。

开始前补充: 网上是有些牛人已经把这个功能封装成组件了,但每个人的封装逻辑五花八门,组件的功能也很有限,不一定真能完全符合自己的业务需求,找相应的API也很麻烦,存在不太敢用,不会用等问题,那么本文将教你如何自己封装,如何自己自定义相关功能,如何自定义Excel的样式 ,尤其是导出excel后自定义样式,这在一些现存封装好的组件是不好实现的,本文可以实现!

本文导出Excel方法的优点: 网页上的table与导出Excel之后的table完全独立,也就是说你导出Excel之后的内容与网页没有直接联系,这意味着数据导出到Excel后:

  • 有非常强的定制性 ,实在不理解这句话也没关系,本文看完你自然就明白了。

  • 能跨浏览器兼容,甚至是某E浏览器。

  • 导出非常快,不卡顿!

编码思路


采用HTML字符串拼接的方法,拼接出一个table,即可显示到Excel;换句话来说使用HTML的语法写出来的table能展示到excel上面,还能携带样式!请用心看完拼接过程,拼接看懂了,你会90%了!

1、定义拼接函数

/**
 * 
 * @param {表头集合} header 
 * @param {表格数据} table 
 * @param {文件名} name 
 * @param {表格名} tname 
 * @param {回调方法} callback 
 */
function transform(header, table, name, tname, callback) {
    ...
}

2、表格模板字符串拼接

// 定义表格模板字符串
let tableInnerHTML = ""
let headerData = header
let bodyData = table
//这里对应是表格数据,我们只需要传过来即可 
// 拼接完全使用thead、tbody、tr、td、th,并且相应的tr、th、td里
// 视情况可以自己写一些 colspan(合并列) 及 rowspan(合并行)等高级操作
tableInnerHTML += "<thead><tr>";
// 表头拼接--start
tableInnerHTML += `<th colspan=${headerData.length} style="background:#CCFFFF;border:solid;">` + tname + "</th></tr>"
tableInnerHTML += "<tr>"
headerData.forEach(item => {
   tableInnerHTML += `<th rowspan="1" style="background:#FFFFCC; border:solid">${item}</th>`
})
tableInnerHTML += "</tr></thead>";
// 表头拼接--end
tableInnerHTML += "<tbody>"
// tbody拼接--start
bodyData.forEach(item => {
    tableInnerHTML += "<tr>"
    // 这里视实际项目情况可以作一些过滤~
    for (let key in item) {
       tableInnerHTML += `<td align="center" style="border:solid">${item[key]}</td>`
    }
    tableInnerHTML += "</tr>"
})
tableInnerHTML += "</tbody>";
// tbody拼接--end 

3、定义打印函数

/**
 * 
 * @param {表格模板字符串} table 
 * @param {文件名} name 
 * @param {回调方法} callback 
 */
function tableToExcel (table, name, callback) {
    ...
}

4、生成 Blob 文件对象,并下载

let template = `<html><head><meta charset="UTF-8"></head><body><table>${table}</table></body></html>`;
let format = function (s, c) {
    return s.replace(/{(w+)}/g,
            function (m, p) {
                return c[p];
            });
};
let ctx = {
    worksheet: name || "Worksheet",
    table: table
};
let blob = new Blob([format(template, ctx)]);
let a = document.createElement("a");
a.href = URL.createObjectURL(blob);
a.download = name; //这里这个name就是对应的文件名! 
a.click();
a.remove();
callback("success"); /*这里调用我们自己传入的回调方法,这样导出Excel完成后你就能 在外面知道导出完毕,并且再往下做自己其他的逻辑*/

5、调用示例

let headerData = ["序号", "姓名", "年龄", "性别", "爱好", "发量", "薪水"]
let table = [
    {
        index: 1,
        name: '武松',
        age: 18,
        sex: '男',
        hobby: '打虎',
        hair: '满头长发',
        salaried: '每月五十文'
    }
];
let fileName = '测试导出xlsx'
let tabelName = '梁山贼寇调查表'
transform(headerData, table, fileName, tabelName, (v) => {
    console.log('callback: ', v)
})

至此编码完毕!上效果:

兼容性问题处理


  • getExplorer 用于判断浏览器类型,主要针对IE浏览器做兼容性处理,这段代码使用后基本上不会有任何兼容性问题

  • Cleanup 用于关闭进行IE浏览器兼容处理时开启的定时器

var idTmr; // 定义一个定时器对象
function getExplorer() {
    var explorer = window.navigator.userAgent;
    if (explorer.indexOf("MSIE") >= 0) {
        return "ie"; // ie 
    } else if (explorer.indexOf("Firefox") >= 0) {
        return "Firefox"; // firefox 
    } else if (explorer.indexOf("Chrome") >= 0) {
        return "Chrome"; // Chrome 
    } else if (explorer.indexOf("Opera") >= 0) {
        return "Opera"; // Opera 
    } else if (explorer.indexOf("Safari") >= 0) {
        return "Safari"; // Safari 
    };
};
if (getExplorer() !== "Safari" && name.substr(-1, 4) !== ".xls") {
    name += ".xls";
}
if (getExplorer() === "ie") {
    var curTbl = table;
    var oXL = new ActiveXObject("Excel.Application");
    var oWB = oXL.Workbooks.Add();
    var xlsheet = oWB.Worksheets(1);
    var sel = document.body.createTextRange();
    sel.moveToElementText(curTbl);
    sel.select();
    sel.execCommand("Copy");
    xlsheet.Paste();
    oXL.Visible = true;
    try {
        var fname = oXL.Application.GetSaveAsFilename("Excel.xls", "Excel Spreadsheets (*.xls), *.xls");
    } catch (e) {
        print("Nested catch caught " + e);
    } finally {
        oWB.SaveAs(fname); // 
        oWB.Close(savechanges = false);
        oXL.Quit(); oXL = null;
        idTmr = setInterval(Cleanup(), 1);
    }
} else {
    // 无需作兼容处理的浏览器直接使用上面的打印方法即可
    tableToExcel(tableInnerHTML, name, callback);
}

function Cleanup() {
    window.clearInterval(idTmr);
}

最后导出封装


可以在项目中创建一个exportExcel.js文件,并在项目中导出方法:export default transform,这样就可以不用局限于在Vue里使用,哪怕是Jquery、React等其他前端框架,你只需要将封装好的方法引入即可。

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

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

相关文章

【IoT】项目管理:如何做好端到端的项目管理?

今天主要来谈谈项目管理这个话题。 首先来看一个我在网络上看到的一个关于项目管理的案例或者是段子。 将项目管理的作用及意义非常直观地展示了出来。 有一个植树搞绿化的企业&#xff0c;在公司内部设置有五个部门&#xff0c;分别是&#xff1a; 运输部门&#xff1b;挖坑部…

nginx 平滑升级

背景介绍 因为一些原因&#xff0c;比如说 Nginx 发现漏洞、应用一些新的模块等等&#xff0c;想对 Nginx 的版本进行更新&#xff0c;最简单的做法就是停止当前的 Nginx 服务&#xff0c;然后开启新的 Nginx 服务。但是这样会导致在一段时间内&#xff0c;用户是无法访问服务…

2023/3/10 Vue核心知识的学习- Vue - v-model双向绑定原理

https://www.jianshu.com/p/2682b5a26869 定义&#xff1a;vue中双向绑定就是指v-model指令&#xff0c;可以绑定一个响应式数据到视图&#xff0c;同时视图中变化能同步改变该值。 通过Object.defineProperty( )对属性设置一个set函数&#xff0c;当数据改变了就会来触发这个…

索引设计的一些小技巧(上)

文章目录 主键索引为频繁查询的字段建立索引避免为"大字段"建立索引选择区分度大的列作为索引尽量为ORDER BY 和 GROUP BY 后面的字段建立索引不要在条件中使用函数不要建立太多的索引频繁增删改的字段不要建立索引索引失效的常见场景主键索引 大家在设计主键的时候…

数据安全—数据完整性校验

1、数据安全保障三要素即 保密性 完整性、可用性机密性&#xff1a;要求数据不被他人轻易获取&#xff0c;需要进行数据加密。完整性&#xff1a;要求数据不被他人随意修改&#xff0c;需要进行签名技术可用性&#xff1a;要求服务不被他人恶意攻击&#xff0c;需要进行数据校验…

别再说前端导出excel麻烦了(xlsx插件用法)

如果是为了解决el-teable的固定列导出问题&#xff0c;直接移动至文章末 本文使用的插件按照指令&#xff08;第一个为一起按照&#xff0c;下面的是独立按照&#xff09; npm install --save xlsx file-saver或 npm install --save xlsx npm install --save file-saver表格…

【Thingsboard+ChirpStack+LoRaWAN 网关+LoRa节点】通讯过程

这里写目录标题 4.通讯流程图:5.thingsboard 集成 chirpstack 上下行通讯5.1上行消息:5.2下行信息:5.3 上行数据分析5.4 下行数据分析6.thingsboard中设备管理实现:lora节点、网关、lora server、以及物联网平台四部分的数据通讯 实验结果: 描述:在thingsboard中修改某个…

SpringBoot【基础篇】---- 基础配置

SpringBoot【基础篇】---- 基础配置1. 属性配置2. 配置文件分类3. yaml 文件4. yaml 数据读取1. 读取单一数据2. 读取全部数据3. 读取对象数据yaml 文件中的数据引用1. 属性配置 SpringBoot 通过配置文件 application.properties 就可以修改默认的配置&#xff0c;那咱们就先找…

【K哥爬虫普法】字节前高管,离职后入侵今日头条数据库,是阴谋、还是利诱?

案情介绍 2016年至2017年间&#xff0c;张洪禹、宋某、侯明强作为被告单位上海晟品网络科技有限公司主管人员&#xff0c;在上海市共谋采用技术手段抓取北京字节跳动网络技术有限公司&#xff08;办公地点位于本市海淀区北三环西路43号中航广场&#xff09;服务器中存储的视频数…

23模式--代理模式

本篇主要聊一些23中模型中的代理模式&#xff1a; 看一下百度百科的解释&#xff1a; 代理模式的定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合或者不能直接引用另一个对象&#xff0c;而代理对象可以在客户端和目…

Python连接MySQL实现增删改查详细教程

文章目录前言一、环境准备二、操作步骤1.安装Python依赖库2.创建测试数据表3. 编写操作数据库核心类4. 测试数据添加5. 测试数据删除6. 测试数据更新7. 测试数据查询三、完整代码总结前言 Python语言经过了很多年的发展&#xff0c;生态非常丰富&#xff0c;热度只增不减&…

微搭问搭001-如何清空表单的数据

韩老师&#xff0c;我点关闭按钮后&#xff0c;弹窗从新打开&#xff0c;里面的数据还在&#xff0c;这个可以从新打开清除不&#xff1f; 点关闭的时候清掉 就是清楚不掉也&#xff1f;咋清掉 清掉表单内容有属性可以做到&#xff1f; $page.widgets.id**.value “” 就可以实…

HCIP-5.4OSPF路由聚合、缺省路由

1、路由聚合 OSPF 是一种链路状态路由协议&#xff0c;因此 OSPF路由器不传输路由&#xff0c;而是传输链路状态信息。因此&#xff0c;OSPF 路由通过汇总 LSA 来控制链路状态信息的传输&#xff0c;从而减小 LSDB 数据库的大小&#xff0c;进而控制路由的汇总。 由于OSPF路由…

Object对象键值的输出循序到底如何排列的?

1.日常摸鱼看八股 今天又是复习八股文的一天&#xff0c;发现还是彻底懂得原理才好和面试官吹牛批呀。 接着来看看我chat大宝贝的回答&#xff1a; 在现代浏览器中&#xff0c;Object 对象的键值输出循序是比较稳定的&#xff0c;通常是按照如下顺序输出&#xff1a; 所有的数…

打怪升级之如何发送HEX进制的数据出去

Hex数据老大难 不少人都困扰于如何将电脑中读取到的string类型的数据变成整形发送出去。一半来说&#xff0c;不论你调用的通信方式是串口的还是网络的&#xff0c;亦或是PCIE的&#xff0c;其在电脑端的实际情况都是以系统API的形式呈现的。而系统API函数提供的接口&#xff…

项目实战典型案例23——-注册上nacos上的部分服务总是出现频繁掉线的情况

注册上nacos上的部分服务总是出现频繁掉线的情况一&#xff1a;背景介绍二&#xff1a;思路&方案解决问题过程涉及到的知识nacos服务注册和服务发现一&#xff1a;背景介绍 spring cloud项目通过nacos作为服务中心和配置中心&#xff0c;出现的问题是其中几个服务总是出现…

【电子通识】案例:从YS-CH341T USB转IIC和UART模块使用学习如何找资料

最近在调一个充电芯片&#xff0c;要用到IIC与充电芯片通信来读取和写入充电芯片寄存器&#xff0c;控制充电芯片的各种参数。从以前老员工那里捡到一个这样的模块&#xff0c;模块背面写了YS-CH341T。看着有IIC通信的样子&#xff0c;所以先在网上找一下资料。首先先在网上找到…

npm安装依赖包:405 Method Not Allowed...

运用npm安装依赖包时报错&#xff0c;错误如下。 解决思路&#xff1a; 关注到错误信息上写明了 Method Not Allowed&#xff0c;其后注明了 GET请求以及一个url&#xff0c;说明极有可能是不允许向这个路由发送GET请求&#xff1b; 在浏览器中尝试打开这个地址&#xff0c;结…

在分析了共50亿美元的加密融资之后,我们发现了这些

对加密市场嗅觉敏锐的玩家来说&#xff0c;市场中项目融资是不得不关注的选项&#xff0c;不少优质项目拿到了巨额融资之后&#xff0c;被大家所关注&#xff0c;在20-21年期间&#xff0c;行业内也出现了不少一级机构&#xff0c;布局早期项目&#xff0c;获取时代红利已经成为…

圆桌(满足客人空座需求,合理安排客人入座圆桌,准备最少的椅子)

CSDN周赛第30期第四题算法解析。 (本文获得CSDN质量评分【91】)【学习的细节是欢悦的历程】Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址&#xff1a;https://lq…