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

 更新时间:2023年08月29日 09:52:12   作者:swimxu  
这篇文章主要给大家介绍了关于前端js使用xlsx-js-style导出Excel文件并修饰单元格样式的相关资料,前端开发过程中经常遇到导出excel的需求,需要的朋友可以参考下

安装

导出 excel 较常见的 js 库是之一是 xlsxxlsx 算是基础版本,不能对单元格进行样式(对齐方式、文字颜色、背景颜色等)的修饰,如果需要修饰单元格,可使用 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 则需要在被合并的单元格位置进行占位。

到此这篇关于前端js使用xlsx-js-style导出Excel文件并修饰单元格样式的文章就介绍到这了,更多相关前端导出Excel并修饰单元格内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript使用Fetch的方法详解

    JavaScript使用Fetch的方法详解

    Fetch API提供了一个JavaScript接口,用于访问和操纵HTTP管道的部分。它还提供了一个全局 fetch()方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源。本文将详解JS如何使用Fetch,感兴趣的可以学习一下
    2022-05-05
  • JavaScript中保留小数点后N位方法总结

    JavaScript中保留小数点后N位方法总结

    这篇文章主要为大家详细介绍了JavaScript中保留小数点后N位的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-06-06
  • 前端性能优化建议

    前端性能优化建议

    这篇文章主要分享了一些前端性能优化的建议,帮助大家提高页面性能,感兴趣的朋友可以了解下
    2020-09-09
  • js中 new Date().getTime()得到的是毫秒数时间戳

    js中 new Date().getTime()得到的是毫秒数时间戳

    今天在写一个函数的时候需要用的一个时间戳方便调用不同的随机数 那么时间戳就是比较好的方式,主要怕浏览器缓存数据,下面就为大家简单介绍一下
    2023-07-07
  • 原生JS实现ajax与ajax的跨域请求实例

    原生JS实现ajax与ajax的跨域请求实例

    下面小编就为大家分享一篇原生JS实现ajax与ajax的跨域请求实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • webpack文件打包错误异常

    webpack文件打包错误异常

    这篇文章主要介绍了webpack文件打包错误异常,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 超详细的JS弹出窗口代码大全

    超详细的JS弹出窗口代码大全

    这篇文章主要为大家分享超详细的JS弹出窗口代码大全,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • JavaScript 通过模式匹配实现重载

    JavaScript 通过模式匹配实现重载

    昨天rank同学向我提出一个问题,在实际应用中有些接口需要提供类似于函数重载的功能,以方便开发者组织代码逻辑,简化使用者调用。
    2010-08-08
  • 一文带你了解async/await的使用

    一文带你了解async/await的使用

    async/await 让异步代码变成同步的方式,从而使代码更具表现力和可读性;还统一了异步编程的经验;以及提供了更好的错误堆栈跟踪。本文就来讲讲async/await的使用,需要的可以参考一下
    2022-09-09
  • el-input 标签中密码的显示和隐藏功能的实例代码

    el-input 标签中密码的显示和隐藏功能的实例代码

    本文通过实例代码给大家介绍了el-input 标签中密码的显示和隐藏 ,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07

最新评论