当前位置: 首页 > news >正文

纯前端实现导出excel

项目背景:

vue2

插件:

xlsx;xlsx-style;file-saver

说明:

单独使用 xlsx插件,也可以将网页上的table导出成excel,但是导出的excel,没有样式

结合xlsx-style;file-saver,可以实现带样式的excel文件

具体实现代码:

import * as XLSX from 'xlsx'
import * as XLSXStyle from 'xlsx-style'import XLSX_SAVE from 'file-saver'export function exportToExcel(columns,dataSource,filename) {const headers = columns.filter(col => col.key !== 'operation') // 过滤掉 operation 列.map(col => col.title)const dataIndexes = columns.filter(col => col.key !== 'operation') // 过滤掉 operation 列.map(col => col.dataIndex)// 重构数据,使其匹配表头const data = dataSource.map((row,index) => {let newRow = {}dataIndexes.forEach((dataIndex, index) => {newRow[headers[index]] = row[dataIndex]})return newRow})// 将表头和数据合并data.unshift(headers.reduce((acc, cur) => ((acc[cur] = cur), acc), {}))// 将数据转换为工作表const worksheet = XLSX.utils.json_to_sheet(data, { skipHeader: true })// 设置整个表格的边框const range = XLSX.utils.decode_range(worksheet['!ref'])for (let R = range.s.r; R <= range.e.r; R++) {for (let C = range.s.c; C <= range.e.c; C++) {const cellAddress = XLSX.utils.encode_cell({ r: R, c: C })if (!worksheet[cellAddress]) {worksheet[cellAddress] = { t: 's', v: '' } // 新建空单元格对象}if (!worksheet[cellAddress].s) {worksheet[cellAddress].s = {} // 新建样式对象}worksheet[cellAddress].s.border = {top: { style: 'medium', color: { rgb: '000000' } },bottom: { style: 'medium', color: { rgb: '000000' } },left: { style: 'medium', color: { rgb: '000000' } },right: { style: 'medium', color: { rgb: '000000' } },}}}for(let i=0;i<columns.length;i++){const list = dataSource.map(item=>{const val = item[columns[i].dataIndex];if(val){if(columns[i].dataIndex == 'indexnum'){return 5;}else if(val.toString().charCodeAt(0) > 255){return val.toString().length * 2;}else{return val.toString().length;}}else{return 1;}})const maxLength = Math.max(list);const width = maxLength * 1.1;if(!worksheet["!cols"]) worksheet["!cols"] = [];if(!worksheet["!cols"][i]) worksheet["!cols"][i] = {wch:8};worksheet["!cols"][i].wch = width;}// 创建一个新的工作簿并将工作表添加到工作簿中const workbook = XLSX.utils.book_new()XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1')// 导出工作簿为 Excel 文件// console.log('xlsx-style', XLSXStyle)let wbout = XLSXStyle.write(workbook, {type: 'binary',bookType: 'xlsx',});XLSX_SAVE.saveAs(new Blob([s2ab(wbout)], {type: 'application/octet-stream',}),`${filename}.xlsx`)
}

 使用时调用:

exportToExcel(columns,dataSource,'demo列表')

避坑:

安装xlsx-style后,在使用时,大概率会报错:

Can‘t resolve ‘./cptable‘ in ‘xxx\node_modules_xlsx

解决方式:

在根目录下的vue.config.js(没有的话自己创建一个) 

加入下面的代码

module.exports = {configureWebpack: {externals: {'./cptable': 'var cptable'}}
}

然后重启项目 

相关文章:

  • Steam邮件推送内容有哪些?配置教程详解!
  • QT实现人脸识别
  • 模版与策略模式
  • 百度文心智能体,创建属于自己的智能体应用
  • 安全管理中心-集中管控(6点)
  • C++ 结构体对齐详解
  • 一个易于使用、与Android系统良好整合的多合一游戏模拟器
  • 计算机网络 静态路由及动态路由RIP
  • JSON.parse 解析NaN, Infinity, -Infinity失败
  • 如何通过编程获取桌面分辨率、操作像素点颜色、保存位图和JPG格式图片,以及图片数据的处理和存储方式
  • 锂电池安全监测中会用到哪些气体传感器?
  • Java程序之可爱的小兔兔
  • 【初阶数据结构】深入解析栈:探索底层逻辑
  • 计算机网络面试HTTP篇二
  • 北京互联网企业出海服务小程序开发的主要功能
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • k8s 面向应用开发者的基础命令
  • mongo索引构建
  • nginx 配置多 域名 + 多 https
  • scala基础语法(二)
  • Spark RDD学习: aggregate函数
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • supervisor 永不挂掉的进程 安装以及使用
  • vue-router的history模式发布配置
  • XForms - 更强大的Form
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 对象引论
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 什么软件可以剪辑音乐?
  • 使用 QuickBI 搭建酷炫可视化分析
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 如何用纯 CSS 创作一个货车 loader
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • # Panda3d 碰撞检测系统介绍
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #职场发展#其他
  • %@ page import=%的用法
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (九十四)函数和二维数组
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十)c52学习之旅-定时器实验
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (原)Matlab的svmtrain和svmclassify
  • (转)人的集合论——移山之道
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .net wcf memory gates checking failed
  • .NET 分布式技术比较
  • .net反编译的九款神器
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET轻量级ORM组件Dapper葵花宝典
  • .net中生成excel后调整宽度
  • .net中应用SQL缓存(实例使用)