前端使用xlsx-js-style导出Excel文件并修饰单元格样式

news2024/11/19 20:45:01

xlsx-js-style

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

安装

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

npm install xlsx-js-style

引入

import XLSXS from 'xlsx-js-style';

需要导出的数据源

// 一般我们拿到的是从接口中请求到的对象数组,在使用是需要转成二维数组,下面有介绍
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 表头

/*
    定义表头,每一行即是一个数组,数组中的元素即是一个个单元格内容。
    如果单元格不需要样式,那么每个元素类型为字符串即可。如:['一月(2022年01月)'], 
    如果单元格需要样式,那么数组中的元素就需要为一个个对象,在此对象中定义单元格的样式等等。
*/
    const header = [
      // 第一行,需要样式,则数组中元素为对象,进行定义样式。
      [
        {
          v: '一月(2023年01月)',
          t: 's',
          s: {
            // font 字体属性
            font: {
              bold: true,
              sz: 14,
              name: '宋体',
            },
            // alignment 对齐方式
            alignment: {
              vertical: 'center', // 垂直居中
              horizontal: 'center', // 水平居中
            },
            // border 边框属性
            border: {
              top: { style: 'thin' },
              bottom: { style: 'thin' },
              left: { style: 'thin' },
              right: { style: 'thin' }
            },
            // fill 颜色填充属性
            fill: {
              fgColor: { rgb: '87CEEB' },
            },
          },
        },
      ],
      ['商品名称', '手机客户端', '', '电脑客户端', '', '总计', ''],
      ['', '销售数量', '销售金额', '销售数量', '销售金额', '销售数量', '销售金额']
    ]

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

body.unshift(...header);

将二维数组转成 sheet

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

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

!merges 设置单元格合并

如果需要设置单元格合并,则定义好merges ,添加到 sheet 中。

merges 为一个对象数组,每个对象设定了单元格合并的规则。

{ s: { r: 0, c: 0 }, e: { r: 0, c: 2 } }, 即为一个规则,s:开始位置, e:结束位置, r:行, c:列

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中

!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中

创建虚拟的 workbook

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

const workbook = xlsx.utils.book_new();

向 workbook 中添加 sheet

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

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

导出 workbook

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

完整示例

import XLSXS from 'xlsx-js-style';
......

// 需要导出的数据源
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]))

/* 定义表头
    定义表头,每一行即是一个数组,数组中的元素即是一个个单元格内容。
    如果单元格不需要样式,那么每个元素类型为字符串即可。如:['一月(2022年01月)'], 
    如果单元格需要样式,那么数组中的元素就需要为一个个对象,在此对象中定义单元格的样式等等。
    这里只针对第一行进行举例:
*/

const header = [
  [
    {
      v: '一月(2023年01月)',
      t: 's',
      s: {
        // font 字体属性
        font: {
          bold: true,
          sz: 14,
          name: '宋体',
        },
        // alignment 对齐方式
        alignment: {
          vertical: 'center', // 垂直居中
          horizontal: 'center', // 水平居中
        },
        // fill 颜色填充属性
        fill: {
          fgColor: { rgb: '87CEEB' },
        },
      },
    },
  ],
  ['商品名称', '手机客户端', '', '电脑客户端', '', '总计', ''],
  ['', '销售数量', '销售金额', '销售数量', '销售金额', '销售数量', '销售金额']
]

body.unshift(...header);// 将定义好的表头添加到 body 中
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中,设置行高

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

效果图

在这里插入图片描述

总结

  • 创建虚拟的 workbook将数组转成 sheet向workbook中添加sheet导出workbook,这四个步骤是必要的。
  • 设置合并单元格设置列宽设置行高是可选的,根据需求进行添加。
  • 如果添加样式需要 border 则需要在被合并的单元格位置进行占位。

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

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

相关文章

elasticsearch实现简单的脚本排序(script sort)

文章目录1、背景2、分析3、构建数据3.1 mapping3.2 插入数据4、实现4.1 根据省升序排序4.1.1 dsl4.1.2 运行结果4.2 湖北省排第一4.2.1 dsl4.2.2 运行结果4.3 湖北省排第一,其余省升序排序,按照年龄倒序4.3.1 dsl4.3.2 java代码4.3.3 运行结果5、完整代码…

【自学Python】Python逻辑运算符

Python逻辑运算符 Python逻辑运算符教程 在 Python 中,逻辑运算符用于连接多个条件(一般来讲就是关系表达式),最终的结果是一个 bool 值。Python 的逻辑运算符主要包括 and(逻辑与)、or(逻辑或…

ArcGIS基础实验操作100例--实验88按距离分配空间

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 空间分析篇--实验88 按距离分配空间 目录 一、实验背景 二、实验数据 三、实验步骤 (1&am…

[白嫖]利用百度图片缓存规则作为图床

利用百度图片缓存规则作为图床先看一张图片:这张图片引用了百度的图片服务器:https://gimg2.baidu.com/image_search/srcpicx.zhimg.com/v2-a6f0db9230a0e4b67e70524217e009fe_1440w.jpg&app2020但实际上这张图片的源站在知乎:https://pi…

Nginx与LUA(2)

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~除了反向代理,Nginx另一个主要的功能就是「负载均衡」。所谓负载均衡,就是将请求分摊到多个服务器上执行,从而减轻单台服务器的…

使用 ADManager Plus 管理Microsoft 365许可证

作为 Microsoft 365 管理员,管理用户的 Microsoft 365 许可证,为新员工分配适当的 Microsoft 365 许可证,在员工离开组织时释放 Microsoft 365 许可证,以及将释放的许可证重新分配给其他用户,构成了日常活动的重要组成…

YGG 在 Branch.gg 的免费游戏 Castaways 中购买了 Genesis NFT

YGG 在 Branch.gg 的第一款免费 web3 游戏 Castaways 中购买了 NFT 资产。Branch.gg 是一家开发开放世界沙盒大型多人在线游戏(MMO)的游戏初创公司,玩家通过合作来确保他们的生存。 在公开市场购买时,YGG 已经获得了 1,000 个 Cas…

ShareSDK 常见问题

QQ-分享报错901111,9001010等 由于QQ现在需要审核后才可以分享(之前分享不需要审核),所以此错误解决方法只需通过腾讯开放平台的审核即可,另外要检查注册好的应用的基本信息,包名、md5签名和Bundle id是不…

上半年要完成的博客50

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

C++ 优先级队列的vector实现

前段时间在研究Astar算法,里面涉及到几个重要的知识点,链表数据结构、优先队列数据结构,在以前的工作中没有接触到,学习后发现真是好东西,对C的认知更深了一步,不废话了,下面正文: …

【正点原子FPGA连载】第十一章U-Boot使用实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十一章U-Boot使…

ESP32接入米家-小爱同学-IDF环境-巴法平台

0 引言 冬天床边没有开关,睡觉懒得关灯,想通过小爱同学控制灯的开关,但是不想换开关。 所以 想用ESP32接入米家,控制一个舵机实现开关控制。 文章目录0 引言1 MQTT协议2 ESP32 MQTT例程2.1 ESP-MQTT 库2.2.1 配置结构体 esp_mqt…

【Python基础】字符串基本操作(切片、格式化、编码)

文章目录一. 字符串1.1 字符串切片操作1.2 格式化字符串1.2.1 内容填充1.2.2 宽度精度1.3 编码解码一. 字符串 1.1 字符串切片操作 字符串是不可变类型 不具备增、删、改操作切片操作将产生新的对象,但如果是相同的字符串,对象不变。 操作格式&#xf…

③电子产品拆解分析-充电宝台灯

③电子产品拆解分析-充电宝台灯一、功能介绍二、电路分析以及器件作用1、TP4056锂电池充电电路分析2、锂电池保护电路分析3、台灯灯光控制电路一、功能介绍 ①可进行两档调光;②长按按键可显示电池电量;③可进行Macio USB安卓接口充电以及USB接口输出放…

【图文教程】云服务器上,Linux安装VSFTPD组件及遇到的问题

服务器做迁移,从AXX云迁移到Txx云上,迁移的话,需要把图片服务器也迁移过去。之前使用的是VSFTPD这次也还用这个吧。这里就记录下FTP服务器安装及遇到的问题。 1:安装VSFTP组件 使用yum命令安装。安装命令如下: yum -y install …

Ubuntu18.04 利用Systemback制作ISO系统镜像和还原

Ubuntu18.04 利用Systemback制作系统镜像和还原1、安装Systemback2、利用Systemback制作Live镜像3、 将大于4G的sblive文件转换成 ISO 文件(Systemback的界面中的转换选项不可用的情况)4、利用Systemback还原系统(利用Systemback还原系统出现…

一文详解 Linux Crontab 调度任务

最近接到这样一个任务: 定期(每天、每月)向“特定服务器”传输“软件服务”的运营数据,因此这里涉及到一个定时任务,计划使用Python语言添加Crontab依赖写一个定时任务的脚本,实现每天、每月向服务器上传运营数据。 这篇文章是我在…

界面控件DevExpress WPF中文指南 - 用主题设计器的后台视图升级主题

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。DevExpress WPF的Theme…

Chevereto v4 专业版搭建个人图床图文教程(博主自用)

Chevereto 是一个优秀的图床程序,有免费版和付费版之分,目前,Chevereto 已更新至 V4 版本,今天为大家分享一下使用 Chevereto v4 最新专业版搭建个人图床的过程。1. 准备工作PHP 版本要求 8.0 及以上,MySQL 版本支持 5…

.net5项目集成百度富文本编辑器umeditor最全教程(含源码)

目前百度的umeditor已经停止维护了,net版本的分支源码包也停留在了net farmework4左右的版本,对于想要集成这款富文本编辑器到net5平台,具有较大难度,主要体现在以下几个方面:umeditor源码需要改造,需要具有…