热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

前端导出Excel实践指北

点击上方程序员成长指北,关注公众号回复1,加入高级Node交流群Hello,各位勇敢的小伙伴,大家好,我是你们的嘴强王者小五,身体健康,脑子没病.本人有

点击上方 程序员成长指北,关注公众号

回复1,加入高级Node交流群

Hello, 各位勇敢的小伙伴, 大家好, 我是你们的嘴强王者小五, 身体健康, 脑子没病.

本人有丰富的脱发技巧, 能让你一跃成为资深大咖.

一看就会一写就废是本人的主旨, 菜到抠脚是本人的特点, 卑微中透着一丝丝刚强, 傻人有傻福是对我最大的安慰.

欢迎来到小五随笔系列前端导出Excel在线指北.

写在前面

双手奉上代码链接 传送门 - ajun568

双脚奉上最终效果图

观前提醒

???? 本文最终实现效果如上图, 具体功能为: 导出Excel + 多个Sheet + 可合并的多行表头. 代码部分采用 React+TS 作为工具进行编写.

准备工作

???? 安装 xlsx.js npm install xlsx

???? 写入Excel文件: XLSX.write(workbook, writeOpts)

workbook ????

  • SheetNames @types string[]: 当前 Sheet 的名称

  • Sheets: 当前sheet的对象, 格式如下

[SheetNames]: {"!refs": "A1:G7", // 表示从 第1行第A列 到 第7行第G列"!cols": [{wpx: 80} ... ], // 表示 列宽 80px"!rows": [{hpx: 20} ... ], // 表示 行高 20px"!merges": [{s: {r: 0, c: 2}, e: {r: 0, c: 3}} ... ], // 表示 将 第0行第2列 和 第0行第3列 进行合并 (s: start, e: end, c: column, r: row)"A1": {v: "姓名"}, // 表示第1行第A列 显示数据为 "姓名", 以此类推 ......
}

writeOpts ????

{type, // 数据编码, 本文采用 binary 二进制格式bookType, // 导出类型, 本文采用 xlsx 类型compression, // 是否使用 Gzip 压缩
}

下载文件

想要下载文件, 我小A第一个表示不服, 申请出战

通过 URL.createObjectURL(Object) 来创建下载所需的 URL. 由于每次调用都会产生新的 URL 对象, 故使用后记得释放, 释放方法 URL.revokeObjectURL(FileUrl)

通过模拟 click 事件触发 a 标签, 以实现下载

const saveAs = (obj: Blob, fileName?: string): void => {const temp = document.createElement('a')temp.download = fileName || 'download'temp.href = URL.createObjectURL(obj)temp.click()setTimeout(() =>  { URL.revokeObjectURL(temp.href) }, 100)
}

头部处理

Mock数据: 详细数据请跳转 Github, 在 mock.ts 中查看

Header 部分数据格式

[...{key: 'animal',value: '动物',child: [{key: 'dog',value: '狗',child: [{key: 'corgi',value: '柯基',},{key: 'husky',value: '哈士奇',},],},{key: 'tiger',value: '老虎',},],},...
]

Data 部分数据格式

[{name: '黄刀小五',desc: '基于搜索引擎的复制粘贴攻城狮',watermelon: '喜欢',banana: '不喜欢',corgi: '喜欢',husky: '喜欢',tiger: '不喜欢',},...
]

头部数据处理

???? 分析

????‍♂️ Code

excel2.png

????‍♂️ Image

Merged 数据

{s: { // startr: x, // rowc: y, // column},e: { ... } // end
}

???? 分析

  • 将处理后的头部数据看成一个矩阵

  • 行或列中, 相邻元素若相同, 则进行合并

tips: 本文采用的是判断相邻 value 值是否相等进行合并, 若有需求, 建议改写为对象形式加以完善.

????‍♂️ Code

excel4.png

????‍♂️ Image

生成sheet数据

  • 利用Object.assign进行对象合并

  • 利用String.fromCharCode(65 + i)对列进行大写字母的转换

????‍♂️ Code

excel13.png

????‍♂️ Image

转换字节流

利用 new ArrayBuffer(str) 创建一个缓冲区, 使用 new Uint8Array(buf) 引用

因为 unicode 编码是 0~65535, 而 Uint8Array 范围为 0~255, 故需要按位与 0xFF, 以保持位数一致

const s2ab = (str: string): ArrayBuffer => {let buf = new ArrayBuffer(str.length)let view = new Uint8Array(buf)for (let i = 0; i !== str.length; ++i) {view[i] = str.charCodeAt(i) & 0xFF}return buf
}

导出文件

结合前文 准备工作 部分所讲, 导出的代码逻辑就出来了, 直接上代码

excel14.png

结束语

开源版本不支持设置样式, 若有需求, 可采用 付费版本 或使用 xlsx-style, 使用方法与本文一致. 大家可参照文档自行添加样式部分.

参考????链接

【Github】 SheetJS ~ js-xlsx

【mySoul】 优雅 | 前后端优雅的导入导出Excel

【Seefly】 前端使用xlsx.js导出有复杂表头的excel

关于本文

来源:黄刀小五

https://segmentfault.com/a/1190000040067999

如果觉得这篇文章还不错

点击下面卡片关注我

来个【分享、点赞、在看】三连支持一下吧

   “分享、点赞、在看” 支持一波 


推荐阅读
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 必须先赞下国人npm库作品:node-images(https:github.comzhangyuanweinode-images),封装了跨平台的C++逻辑,形成nodejsAP ... [详细]
  • React 小白初入门
    推荐学习:React官方文档:https:react.docschina.orgReact菜鸟教程:https:www.runoob.c ... [详细]
  • 开发中,EXT封装的.NET控件,使用了ExtJsExtenderControl的开源控件,发现个问题,就是每次控件加载,都需要调EXT_ALL.JS文件,600K,导致页面加载很慢。想对这个问题进行 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 本文介绍了JavaScript进化到TypeScript的历史和背景,解释了TypeScript相对于JavaScript的优势和特点。作者分享了自己对TypeScript的观察和认识,并提到了在项目开发中使用TypeScript的好处。最后,作者表示对TypeScript进行尝试和探索的态度。 ... [详细]
  • 简述在某个项目中需要分析PHP代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑ÿ ... [详细]
  • Vue cli2.0 项目中使用Monaco Editor编辑器
    monaco-editor是微软出的一条开源web在线编辑器支持多种语言,代码高亮,代码提示等功能,与VisualStudioCode功能几乎相同。在项目中可能会用带代码编 ... [详细]
  • Node.js详细安装及环境配置
    1、下载安装根据自己电脑系统及位数选择,我这里选择windows64位.msi格式安装包(官网:https:odejs.orgzh-cndownload).msi和.zip格式区别 ... [详细]
  • 初级_vue.js初级教程01.简介
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了vue.js初级教程--01.简介相关的知识,希望对你有一定的参考价值。Vue特点 ... [详细]
author-avatar
花谢五月天
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有