使用xlsx.js导出为excel,并实现自适应列宽

18 篇文章 10 订阅
订阅专栏
6 篇文章 0 订阅
订阅专栏

前言

  • 使用的js库: xlsx.js

1 思路:

计算每一列所有单元格的文本长度(包括列头),取最大值作为列宽

2 代码:

getCellWidth为核心方法,用于计算单元格宽度的
如果包含中文,则宽度为:文本长度2.1,否则为:文本长度1.1,这个是我多次测试得到的数值
可以在此方法增加其他规则

function getCellWidth(value) {
  
  // 判断是否为null或undefined
  if (value == null) {
    return 10
  } else if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) {
    // 判断是否包含中文
    return value.toString().length * 2.1
  } else {
    return value.toString().length * 1.1
    /* 另一种方案
    value = value.toString()
    return value.replace(/[\u0391-\uFFE5]/g, 'aa').length
    */
  }
}


// 经过评论反馈优化
function getCellWidth(value) {
  // 判断是否为null或undefined
  if (value == null) {
    return 10;
  } else if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) {
    // 中文的长度
    const chineseLength = value.match(/[\u4e00-\u9fa5]/g).length;
    // 其他不是中文的长度
    const otherLength = value.length - chineseLength;
    return chineseLength * 2.1 + otherLength * 1.1;
  } else {
    return value.toString().length * 1.1;
    /* 另一种方案
    value = value.toString()
    return value.replace(/[\u0391-\uFFE5]/g, 'aa').length
    */
  }
}


/**
 * 将table、json数据导出为excel
 * @param {object} options 
 * @param {[]} options.data 数据源
 * @param {"table"|"json"|"aoe"} options.dataType 数据类型 
 * @param {string} options.sheetName sheet名称
 * @param {boolean} options.saveFile 是否保存为文件,如果为false则返回workBook
 * @param {string} options.fileName 文件名称
 * @param {boolean} options.fitWidth是否自适应列宽(如果dataType="json",配置此属性将无效)
 * @param {[]} options.header xlsx内部参数
 */
export function exportTo(
  {
    data = [],
    dataType = 'table',
    sheetName = 'Sheet1',
    saveFile = true,
    fileName = new Date().$toString() + '.xlsx',
    fitWidth= true,
    header = []
  } = {}
) {
  try {
    if (!XLSX) throw 'exportTo: the plug-in "XLSX" is undefined.'
    if (!data || data.length === 0) throw 'exportTo: data is null or undefined.'

    let sheet = {}
    switch (dataType) {
      case 'table':
        sheet = XLSX.utils.table_to_sheet(data, { raw: true })
        break
      case 'json':
        sheet = XLSX.utils.json_to_sheet(data, { raw: true, header: header })

        if (fitWidth) {
          let colWidths = [],
            colNames = Object.keys(data[0]) // 所有列的名称数组

          // 计算每一列的所有单元格宽度
          // 先遍历行
          data.forEach((row) => {
            // 列序号
            let index = 0
            // 遍历列
            for (const key in row) {
              if (colWidths[index] == null) colWidths[index] = []

              switch (typeof row[key]) {
                case 'string':
                case 'number':
                case 'boolean':
                  colWidths[index].push(getCellWidth(row[key]))
                  break
                case 'object':
                case 'function':
                  colWidths[index].push(0)
                  break
              }
              index++
            }
          })

          sheet['!cols'] = []
          // 每一列取最大值最为列宽
          colWidths.forEach((widths, index) => {
            // 计算列头的宽度
            widths.push(getCellWidth(colNames[index]))
            // 设置最大值为列宽
            sheet['!cols'].push({ wch: Math.max(...widths) })
          })
        }
        break
      case 'aoe':
        // 未实现
        sheet = []
        break
    }

    let workBook = {
      SheetNames: [sheetName],
      Sheets: {
        [sheetName]: sheet
      }
    }

    if (saveFile) {
      XLSX.writeFile(workBook, fileName)
      return true
    } else {
      return workBook
    }
  } catch (error) {
    console.error('exportTo: ', error)
    throw error
  }
}

3 最终效果

在这里插入图片描述
在这里插入图片描述

后语

  • getCellWidth方法可根据实际场景优化编写,尽量简洁,如果做过多判断和计算,数据量大了就会变得很慢
  • exportTo方法在导出三列,4万行数据时的性能如下图,可参考
    在这里插入图片描述
  • 实现更复杂的导出功能,建议在后端服务实现,前端能力有限
  • 其实wps都有这功能,鼠标点一下就行了,不过用户是上帝啊
    在这里插入图片描述
XLSX.js导出,支持单元格合并,背景色,列宽,字体大小等
en_kai的博客
12-02 6041
XLSX.js导出,支持单元格合并,背景色,列宽,字体大小等
VUE导出Excel,两种方法,方法二带样式:文字居中,自动换行,列宽设置,单元格合并,冻结表头等
03-29
SheetJS免费版的不支持格式,比如居中、自动换行都不行。xlsx-style是SheetJS的一个分支,且支持各种格式,可以做到文字居中,自动换行,列宽设置,单元格合并,冻结表头等。
Javascript导出Excel,自动合并单元格、自动列宽、有进度条
06-28
js导出execl,自动合并单元格,自动增行,增列
js 使用XLSX插件表格读取(封装版)复制即可用版
最新发布
Jw_1201的博客
09-13 236
项目中,多次使用到了读取表格。考虑到后续可能会修改表头(新增必填标志,或者删除必填标志,在后面加(***)注解什么的),2.多个表头需要校验,也一起封装起来,避免后面修改,多次改页面造成失误 mainBody.js。2.封装xlsx读取部分代码 vueExcelHandler.js
xlsx导出 自适应宽度
weixin_43779879的博客
03-25 935
xlsx导出 自适应宽度
js 前端 解析excel文件【.xlsx文件】信息内容
shengmeshi的博客
08-02 382
js 前端 解析excel文件【.xlsx文件】信息内容
js导出Exsl自定义文件,可设置宽度与高度
06-06
1.通过xlsx.core.min.js库,导出自定义Exsl表格. 2.可以自定义表格的宽度与高度
exceljs导出单元格设置列宽、文字居中
qq_42044542的博客
09-15 5641
对应代码: exportExcel() { // 导出的表头 let columns = [ { name: '90-100分', width: 50 }, { name: '80-89分', width: 50 }, { name: '70-79分', width: 50 }, { name: '60-69分', width: 50 }, { name: '0-59分', wid..
JS可调整列宽表格
03-16
NULL 博文链接:https://yangqianyu222.iteye.com/blog/435110
生成报表--导出excel(注释比较全,含excel格式的调整,列宽自适应,行数的限制)
jklimingzhi的专栏
07-18 1386
1.本导出excel方法需要poi-3.8-beta4.jar 2.本方法提供了导出至本地文件和导出至浏览器两种输出方法(如果要测导出浏览器,请注意传入HttpServletResponse 参数)。 3.本方法,将会导出.xsl文件,由于office限制excel存在65535行,所以,为了避免报错,为导出做出了限制,最多能导出内容65500行,加上标题和表头,最大容量为65503行数据。 ...
突破编程_前端_JS编程实例(自适应表格列宽
突破编程
03-08 1308
前端 JS 编程实例:自适应表格列宽
js 实现 表格设置为“100%”时获取表格的宽度
03-31
js 实现 表格设置为“100%”时获取表格的宽度! 值得下载看看!资源免费,大家分享!!
xlsx.full.jsJS生成excle文件,可设置行高
10-20
`xlsx.full.js` 是一个强大的库,它允许开发者用纯JavaScript来创建、读取和修改Excel文件,特别适合在Web应用程序中使用。这个库的核心是`XLSX`模块,它提供了丰富的功能,包括对Excel文件的各种格式支持。 标题中...
前端xlsx表格导出,宽度自适应简单版
m0_55921724的博客
06-09 810
前端表格导出
sheetJs / xlsx-js-style 纯前端实现导出 excel 表格及自定义单元格样式
热门推荐
aibujin的博客
08-01 1万+
sheetJs / xlsx-js-style 纯前端实现导出 excel 表格及自定义单元格样式
2024年最新!xlsxxlsx-style导出excel文件列宽、行高、样式、合并表格一步到位!
m0_58753305的博客
01-15 3354
下载导出excel文件,能添加列宽、行高、背景色、字体等样式,能合并表格。遇到的问题都附上了解决方案。
Vue实现Web导出Excel表格(自适应列)
weixin_63203565的博客
07-08 533
Vue实现Web导出Excel表格(自适应列),需要安装三个插件 xlsxxlsx-style、file-saver
javaScript Excel 导出 - 设置列宽,居中,样式
Dily_Su的博客
01-17 5679
使用 Lay-Excel插件,原本使用 xlsx.js 实现的,但是后来发现xlsx.js 中样式实现存在bug无法解决,于是改用lay-excel,lay-excel其实也是对xlsx.js 的封装,而本文则是对其进一步封装!!!
vue:功能【xlsx】纯前端导出Excel
1363648943的专栏
03-14 2409
2、sheetData 是一个数组,用于存储要导出的表格数据。在代码中,使用了一个名为 sheet1 的对象来定义表格的名称、数据、合并单元格和行高等信息。在给定的代码中,合并了一些特定的行和列,以创建标题行和表头的合并效果。4、最后,通过调用 OutExcelSheet.exportSheetExcel 函数,并传递以上参数,将生成的 Excel 文件导出到本地。注:生成的excel封装的方法如下(支持表头合并、导出excel 支持生成多个sheet工作表、表格可自适应宽度、自适应高度、合并表格)
使用XLSX.utils 导出excel
05-27
使用 XLSX.utils 导出 Excel 文件需要以下步骤: 1. 准备要导出的数据,可以是数组、对象等形式。 2. 将数据转换为工作簿(Workbook)对象。 3. 将工作簿对象写入文件。 下面是一个使用 XLSX.utils 导出 Excel 文件的示例代码: ```javascript // 准备要导出的数据 const data = [ ["姓名", "年龄", "地址"], ["张三", 20, "上海市浦东新区"], ["李四", 25, "北京市海淀区"] ]; // 将数据转换为工作簿对象 const ws = XLSX.utils.aoa_to_sheet(data); const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, "Sheet1"); // 将工作簿对象写入文件 XLSX.writeFile(wb, "data.xlsx"); ``` 在上面的示例代码中,我们首先准备了要导出的数据,然后使用 `XLSX.utils.aoa_to_sheet` 将数据转换为工作表对象,再使用 `XLSX.utils.book_new` 创建工作簿对象,将工作表对象添加到工作簿对象中,最后使用 `XLSX.writeFile` 将工作簿对象写入到文件中。这样就完成了使用 XLSX.utils 导出 Excel 文件的操作。
写文章

热门文章

  • 远程唤醒电脑WOL(Wake On LAN - 局域网唤醒) 85597
  • vscode使用prettier格式化代码不起作用、配置不生效的解决方法 67946
  • 在Web中使用jsmpeg.js低时延播放RTSP视频流(海康、大华)方案 - vue-jsmpeg-player 45869
  • 在Web网页播放网络摄像机(海康、大华等)RTSP视频流方案汇总 32456
  • 电脑睡眠、休眠后,电脑卡顿,CPU主频变得很低的解决方法 25871

分类专栏

  • svg 1篇
  • windows 1篇
  • uni-app 1篇
  • 编辑器 1篇
  • 数据库
  • MySQL 1篇
  • 前端 18篇
  • npm 3篇
  • element-ui 2篇
  • javascript 6篇
  • 高德地图 JS API 1篇
  • CSS 3篇
  • Web GIS 1篇
  • Vue 11篇
  • 流媒体 1篇
  • vscode 1篇
  • c#
  • c# 文件 1篇
  • 服务器 2篇
  • Tomcat 1篇
  • 教程 3篇

最新评论

  • Vue中使用leaflet地图框架学习记录

    weixin_45577889: 需要的,我也发现了这个问题

  • 远程唤醒电脑WOL(Wake On LAN - 局域网唤醒)

    打碎了阳光: 外网可以唤醒吗,还是只支持局域网内的唤醒呢

  • vscode使用prettier格式化代码不起作用、配置不生效的解决方法

    weixin_46316529: vue文件可以格式化,但是ts文件不能格式化

  • vue中使用EasyPlayer.js教程

    陳平安啊: 没看懂,有成功过的吗?

  • 记一次web中对svg图形拖动和缩放卡顿的性能优化(基于svg.js) - viewbox vs transform

    moannian: 源码连接没有用了

大家在看

  • 【火山引擎】AIGC图像风格化 | 风格实践 | PYTHON 49
  • 心理咨询评估|基于springBoot的学生心理咨询评估系统设计与实现(附项目源码+论文+数据库) 486
  • 有限元以及计算力学相关概念
  • java使用itext7依赖实现多种类型文档合并 78
  • Elasticsearch封装公共索引增删改查

最新文章

  • vue-cli4升级到vue-cli5的踩坑记录
  • Windows10/11无法查看历史访问的解决方法
  • uniapp的一些踩坑记录
2023年3篇
2022年14篇
2021年12篇
2020年8篇
2018年1篇

目录

目录

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云帆Plan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳坪山网站建设公司宜良本地网站优化策划学校网站优化方案seo优化提升网站权重网站代码优化有什么用汕头优化网站香蜜湖网站优化多少钱网站排名优化软件安全易速达网站好优化软件嘉善网站优化公司重庆网站改版优化新网站的优化推广南昌seo网站排名优化软件旅游网站搜索引擎优化的结论快排技术优化网站新乡资讯网站搭建优化如何优化网站推广方向崇左湖南网站优化推广宜昌本地网站优化多少钱成都网站排名优化公司独山网站优化与推广沁阳网站自然优化哪家有实力专业网站关键词优化找哪家公司常州天宁区网站优化昆明网站seo优化哪家技术好网站优化吧共青城网站排名优化婚纱摄影网站的优化方案漯河ai营销网站优化怎么样优化网站城中区网站seo优化排名香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化