前端使用xlsx导出数据生成Excel文件

news2024/11/17 11:42:56

xlsx的使用

        • 安装 xlsx
        • 引入 xlsx
        • 需要导出的数据源
        • 将数据源转成需要的二维数组
        • 定义 Excel 表头
        • 将定义好的表头添加到 body 中
        • 1 创建虚拟的 `workbook`
        • 2 将二维数组转成 `sheet`
        • `!merges` 设置单元格合并
        • `!cols` 设置列宽
        • `!rows` 设置行高
        • 3 向` workbook 中添加 sheet`
        • 4 导出 `workbook `
        • 完整示例:
        • 总结

安装 xlsx

xlsx 算是基础版本,不能对单元格进行样式(对齐方式、文字颜色、背景颜色等)的修饰,如果需要修饰单元格,可使用 xlsx-js-style

npm i xlsx

引入 xlsx

import xlsx from 'xlsx';

需要导出的数据源

// 一般我们拿到的是从接口中请求到的对象数组,在使用是需要转成二维数组,下面有介绍
const data = [
  { name: '商品01', mb_num: 50, mb_sum: 5000, pc_num: 30, pc_sum: 3000, total_num: 80, total_sum: 8000 },
  { name: '商品02', mb_num: 50, mb_sum: 5000, pc_num: 30, pc_sum: 3000, total_num: 80, total_sum: 8000 },
  { name: '商品03', mb_num: 50, mb_sum: 5000, pc_num: 30, pc_sum: 3000, total_num: 80, total_sum: 8000 },
]

将数据源转成需要的二维数组

const body = data.map(x => ([x.name, x.mb_num, x.mb_sum, x.pc_num, x.pc_sum, x.total_num, x.total_sum]))

// 转换后的数据为一个二维数组
[
  ['商品01', 50, 5000, 30, 3000, 80, 8000]
  ['商品02', 50, 5000, 30, 3000, 80, 8000]
  ['商品03', 50, 5000, 30, 3000, 80, 8000]
]

定义 Excel 表头

// 根据需要导出的目标 Excel格式,先定义好表头
const header = [
  ['一月(2022年01月)'], 
  ['商品名称', '手机客户端', '', '电脑客户端', '', '总计', ''], 
  ['', '销售数量', '销售金额', '销售数量', '销售金额', '销售数量', '销售金额']
]

将定义好的表头添加到 body 中

body.unshift(...header);

//分别为每一行单元格内的值,需要合并的单元格给一个空值进行站位
[
  ['一月(2022年01月)','','','','','','']
  ['商品名称', '手机客户端', '', '电脑客户端', '', '总计', '']
  ['', '销售数量', '销售金额', '销售数量', '销售金额', '销售数量', '销售金额']
  ['商品01', 50, 5000, 30, 3000, 80, 8000]
  ['商品02', 50, 5000, 30, 3000, 80, 8000]
  ['商品03', 50, 5000, 30, 3000, 80, 8000]
]

1 创建虚拟的 workbook

Excel整个表格可称为 workbook
里面的每张表分别是 sheet

const workbook = xlsx.utils.book_new();

2 将二维数组转成 sheet

// 这里我们举例是用 aoa_to_sheet ,所以是需要将数据源转成一个二维数组
const sheet = xlsx.utils.aoa_to_sheet(body);

// aoa_to_sheet  	是将【一个二维数组】转化成 sheet
// json_to_sheet 	是将【由对象组成的数组】转化成sheet
// table_to_sheet  	是将【table的dom】直接转成sheet

!merges 设置单元格合并

const merges = [
  { s: { r: 0, c: 0 }, e: { r: 0, c: 6 } },
  { s: { r: 1, c: 1 }, e: { r: 1, c: 2 } },
  { s: { r: 1, c: 3 }, e: { r: 1, c: 4 } },
  { s: { r: 1, c: 5 }, e: { r: 1, c: 6 } },
  { s: { r: 1, c: 0 }, e: { r: 2, c: 0 } },
]
sheet['!merges'] = merges; // 添加到sheet中

// merges 为一个对象数组,每个对象设定了单元格合并的规则
// { s: { r: 0, c: 0 }, e: { r: 0, c: 2 } }, 即为一个规则,s:开始位置, e:结束位置, r:行, c:列

!cols 设置列宽

// cols 为一个对象数组,依次表示每一列的宽度
const cols = [
    { wch: 10 },
    { wch: 10 }, 
    { wch: 10 },
    { wch: 10 },
    { wch: 10 },
    { wch: 10 }, 
    { wch: 10 }
];
sheet['!cols'] = cols; // 添加到sheet中

!rows 设置行高

// rows 为一个对象数组,依次表示每一行的高度
const rows = [
    { hpx: 20 }, 
    { hpx: 16 },
    { hpx: 18 }
]
sheet['!rows'] = rows; // 添加到sheet中

3 向 workbook 中添加 sheet

xlsx.utils.book_append_sheet(workbook, sheet, 'sheet名称');

// 一个 workbook 允许添加多个 sheet,即可以同时创建多个表
// xlsx.utils.book_append_sheet(workbook, sheet2, 'sheet名称2');

4 导出 workbook

// 注意:定义导出 excel 的名称时需要加上后缀 .xlsx
xlsx.writeFile(workbook, 'excel名称.xlsx');

完整示例:

在这里插入图片描述

import xlsx from 'xlsx'; // 引入 xlsx
......

// 需要导出的数据源
const data = [
  { name: '商品01', mb_num: 50, mb_sum: 5000, pc_num: 30, pc_sum: 3000, total_num: 80, total_sum: 8000 },
  { name: '商品02', mb_num: 50, mb_sum: 5000, pc_num: 30, pc_sum: 3000, total_num: 80, total_sum: 8000 },
  { name: '商品03', mb_num: 50, mb_sum: 5000, pc_num: 30, pc_sum: 3000, total_num: 80, total_sum: 8000 },
]

// 将数据源转成我们需要的二维数组
const body = data.map(x => ([x.name, x.mb_num, x.mb_sum, x.pc_num, x.pc_sum, x.total_num, x.total_sum]))

// 定义Excel表头
const header = [
  ['一月(2022年01月)'],
  ['商品名称', '手机客户端', '', '电脑客户端', '', '总计', ''],
  ['', '销售数量', '销售金额', '销售数量', '销售金额', '销售数量', '销售金额']
]

body.unshift(...header);// 将定义好的表头添加到 body 中
const workbook = xlsx.utils.book_new();// 创建虚拟的 workbook
const sheet = xlsx.utils.aoa_to_sheet(body);// aoa_to_sheet 将二维数组转成 sheet
const merges = [
  { s: { r: 0, c: 0 }, e: { r: 0, c: 6 } },
  { s: { r: 1, c: 1 }, e: { r: 1, c: 2 } },
  { s: { r: 1, c: 3 }, e: { r: 1, c: 4 } },
  { s: { r: 1, c: 5 }, e: { r: 1, c: 6 } },
  { s: { r: 1, c: 0 }, e: { r: 2, c: 0 } },
]
sheet['!merges'] = merges; // 将merges添加到sheet中,设置合并单元格
const cols = [ { wch: 10 },{ wch: 10 },{ wch: 10 },{ wch: 10 },{ wch: 10 },{ wch: 10 },{ wch: 10 } ];
sheet['!cols'] = cols; // 将cols添加到sheet中,设置列宽
const rows = [ { hpx: 20 },{ hpx: 16 },{ hpx: 18 }]
sheet['!rows'] = rows; // 将rows添加到sheet中,设置行高

xlsx.utils.book_append_sheet(workbook, sheet, 'sheet名称'); // 向 workbook 中添加 sheet
xlsx.writeFile(workbook, 'excel名称.xlsx'); // 导出 workbook
// 注意:定义导出 excel 的名称时需要加上后缀 .xlsx

总结

其中,创建虚拟的 workbook将数组转成 sheet向workbook中添加sheet导出workbook,这四个步骤是必要的。
设置合并单元格设置列宽设置行高是可选的,根据需求进行添加。

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

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

相关文章

JavaWeb 简单的图书管理系统(jsp+servlet)

关于与需要的文件下载字体颜色分类:黑色 表示正文蓝色 表示一个超链接,点击可以跳转页面橙色 表示一级标题或项目的包名绿色 表示子级内容中含有代码或解释的标题紫色 表示一个代码块的标题红色 表示()外的文件是()内文件的子类,实现类或依赖浅灰 表示解释或其类型高…

Vue封装Axios实现全局的loading自动显示效果

在 vue 项目中,我们通常会使用 Axios 库来与后台进行数据交互。而当我们发起 ajax 请求时,常常需要在页面上显示一个加载框(Loading 效果),然后等数据返回后自动将其隐藏。要实现这个功能,我们可以在每次请…

尚品汇前台项目总结

这是我的第一篇个人博客,主要是对我学习前端过程中的一些主记录。由于我在江苏,从2022年过完年,一直到年中,疫情反反复复,又正是大三,马上面临就业难题,我选择了前端。 从html,css,js基础,webAP…

15个awk的经典实战案例

目录 一、插入几个新字段 二、格式化个空白 三、筛选IPV4地址 命令及结果 第一种查询方式 第二种查询方式 第三种查询方式 四、读取.ini配置文件中的某段 命令及结果 第一种查询方式 第二种查询方式 五、根据某字段去重 命令及结果 第一种方式 第二种方式 六、…

你是这样的 CSS,19个唯美的边框

作者:niemvuilaptrin 译者:前端小智 来源:medium 有梦想,有干货,微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整…

Vue之插槽

1. 插槽是什么 插槽就是子组件中的提供给父组件使用的一个占位符,用 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的标签。简单理解就是子组件中留下个“坑”,父组件可以使…

STM32入门教程课程简介(B站江科大自化协学习记录)

课程简介 STM32最小系统板面包板硬件平台 硬件设备 STM32面包板入门套件 Windows电脑 万用表、示波器、镊子、剪刀等 软件介绍 Keil MDK 5.24.1 是一款嵌入式软件开发工具,它提供了一个完整的开发环境,包括编译器、调试器和仿真器。它支持各种微控制…

微信小程序富文本解析器rich-text、web-view、wxParse、mp-html、towxml对比

微信小程序解析富文本html大概有几种方式,我用过的有这三种rich-text、web-view、wxParse、mp-html,各有各的优缺点,接下来聊一聊。 一、rich-text 二、web-view 三、wxParse 四、mp-html 五、towxml 一、rich-text rich-text富文本组件…

XSS漏洞攻防

目录XSS攻击简介XSS攻击的危害XSS攻击分类XSS产生原因实战靶场搭建构造xss攻击脚本弹窗警告页面嵌套页面重定向弹窗警告并重定向图片标签利用绕开过滤的脚本存储型xss基本演示访问恶意代码(网站种马)XSS获取键盘记录XSS盲打htmlspecialchars()函数自动xs…

SpringBoot - ZooKeeper

SpringBoot - ZooKeeper1、Curator框架的集成2、构建zookeeper客户端3、Master选举3.1、LeaderSelector3.2、LeaderLatch4、成员组注册5、节点监听1、Curator框架的集成 <dependency><groupId>org.apache.curator</groupId><artifactId>curator-recip…

博客系统前端实现

目录 1.预期效果 2.实现博客列表页 3.实现博客正文页 4.实现博客登录页 5.实现博客编辑页面 1.预期效果 对前端html,css,js有大致的了解后,现在我们实现了一个博客系统的前端页面.一共分为四个页面没分别是:登陆页面,博客列表页,博客正文页,博客编辑页 我们看下四个界面…

功能:vue:浏览器打印小票、打印参数配置

一、需求说明 1、要实现点击打印小票按钮&#xff0c;弹出预览弹框&#xff0c;点击弹框里面的打印&#xff0c;则实现浏览器打印预览&#xff0c;以及浏览器打印。 2、根据对应需求可以做步骤的加减&#xff0c;本例多了一个本地预览。 3、环境&#xff1a;pc端打印、chrome浏…

在 TypeScript 中导入 JavaScript 包,解决声明文件报错问题

前言 如果你在 TypeScript 中引入了一个纯 JavaScript 包&#xff0c;那很有可能会看到这样的报错&#xff1a; Could not find a declaration file for module ‘koumoul/vjsf/lib/VJsf’. ‘c:/*/node_modules/koumoul/vjsf/lib/VJsf.js’ implicitly has an ‘any’ type. …

uniapp拍照+上传后台 + pc端上传后台

uniapp 一、拍照&#xff0c;拿到本地路径 首先调用uniapp的api实现拍照 uni.chooseImage({sourceType: [camera,album],//拍照或是打开系统相册选择照片count: 3, //最多三张success(res) {if (Array.isArray(res.tempFilePaths)) {//最多选择三张&#xff0c;如果多选删掉…

新安webpack插件后编译报错compiler.plugin is not a function

安装使用generate-asset-webpack-plugin时报错TypeError&#xff1a;compiler.plugin is not a function&#xff0c;网上搜索了一下大概就是webpack5与这些插件不匹配。推荐的方法几乎都是换一个适配的插件版本&#xff0c;但我所需要的这个插件在npm上最近更新时间是7年前&am…

Vue 之 插件 轮播组件 vue-awesome-swiper 的简单使用整理

Vue 之 插件 轮播组件 vue-awesome-swiper 的简单使用整理 目录 Vue 之 插件 轮播组件 vue-awesome-swiper 的简单使用整理 一、简单介绍 二、安装 vue-awesome-swiper 三、引入&#xff08;全局或局部引入&#xff09; 四、简单使用 一、简单介绍 Vue 开发的一些知识整理…

八个步骤实现一个Web项目(在线聊天室)

实现一个在线网页的聊天室 Hello&#xff0c;今天给大家带来的是我的一个Web项目的开发过程的相关步骤&#xff0c;这个项目实现的功能是一个Web在线聊天室&#xff0c;简单的来说就是实现在网页版的聊天框&#xff0c;能够实现对于用户信息进行注册&#xff0c;登录&#xff…

vue3、ts如何封装 axios,使用mock.js

今天我们一起来看一看 vue3ts如何优雅的封装axios&#xff0c;并结合 mock.js 实现敏捷开发&#xff1b; 但是我们要注意区分 Axios 和 Ajax &#xff1a; Ajax 是一种技术统称&#xff0c;技术内容包括&#xff1a;HTML 或 XHTML, CSS, JavaScript, DOM, XML, XSLT, 以及最重要…

Vue首次加载太慢之性能优化

Vue首次加载太慢之性能优化前言一、防止编译文件中出现map文件二、vue-router 路由懒加载三、使用gzip压缩四、使用CDN加载第三方库第一步&#xff1a;引入资源第二步&#xff1a;添加配置第三步&#xff1a;去掉原有的引用五、去掉代码中的console.log前言 首页加载很慢的问题…

Vite4 + Vue3 + vue-router4 动态路由

动态路由&#xff0c;基本上每一个项目都能接触到这个东西&#xff0c;通俗一点就是我们的菜单是根据后端接口返回的数据进行动态生成的。表面上是对菜单的一个展现处理&#xff0c;其实内部就是对router的一个数据处理。当然你只对菜单做处理也是可以的&#xff0c;但是没有任…