vite + xlsx + xlsx-style 导出 Excel

news2024/11/20 12:39:24

如下

npm i 依赖


npm i xlsx

npm i xlsx-style-vite

1、简单的使用:.vue文件中使用


const dataSource = ref([]) // 数据源

const columns = [
	{
		title: '用户名',
		key: 'userName',
		width: 120,
	},
	{
		title: '用户组',
		key: 'userGroup',
		width: 120,
	},
	{
		title: '状态',
		key: 'enable',
		width: 100,
	},
	{
		title: '余额',
		key: 'balance',
		width: 120,
	},
	{
		title: 'NB余额',
		key: 'nbBalance',
		width: 120,
	},
	{
		title: '创建时间',
		key: 'createTime',
		width: 180,
	},
	{
		title: '操作',
		key: 'action',
		width: 200,
		fixed: 'right',
	},
]


-------------------------------------------------------------------------------------------------

const transData = (columns: any, tableList: any) => {
	const obj = columns.reduce((acc: any, cur: any) => {
		if (!acc.titles && !acc.keys) {
			acc.titles = []
			acc.keys = []
		}
		acc.titles.push(cur.title)
		acc.keys.push(cur.key)
		return acc
	}, {})
	console.log('obj=', obj)
	
	const tableBody = tableList.map((item: any) => {
		return obj.keys.map((key: string) => item[key])
	})
	console.log('tableBody=', tableBody)
	
	return [obj.titles, ...tableBody]
}

const exportExcel = () => {
	const tableData = transData(columns, dataSource.value)
	console.log('tableData=', tableData)
	
	// 将数据数组转换为工作表
	const ws = XLSX.utils.aoa_to_sheet(tableData)
	
	// 创建workbook
	const wb = XLSX.utils.book_new()
	ws['!ref'] = `A1:AI${tableData.length}`
	
	// 设置列宽,这里只设置了前6列的列宽
	ws['!cols'] = [{ wpx: 120 }, { wpx: 100 }, { wpx: 110 }, { wpx: 110 }, { wpx: 110 }, { wpx: 110 }]
	
	/*
    合并单元格:【s:start合并开始、 e:end合并结束、r:row行、c:col列】
      如:
          { s: { r: 0, c: 0 }, e: { r: 0, c: 1 } },表示:A1 与 B1,合并为A1的内容
          
          其实就是:0:代表第一行,或第一列;1:代表第二行,或第二列;
	*/
	ws['!merges'] = [{ s: { r: 0, c: 0 }, e: { r: 0, c: 0 } }]
	
	// 将 工作表 添加到 workbook
	XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')
	
	// 将 workbook 写入文件
	XLSX.writeFile(wb, 'tablename.xlsx')
}


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述




给单元格添加样式

其他代码同上


const exportExcel = () => {
  const tableData = transData(columns, dataSource.value)
  console.log('tableData=', tableData)

  // 将数据数组转换为工作表
  const ws = XLSX.utils.aoa_to_sheet(tableData)

  // 创建workbook
  const wb = XLSX.utils.book_new()
  ws['!ref'] = `A1:AI${tableData.length}`

  // 设置列宽,这里只设置了前6列的列宽
  ws['!cols'] = [{ wpx: 120 }, { wpx: 100 }, { wpx: 110 }, { wpx: 110 }, { wpx: 110 }, { wpx: 110 }]

  /*
    合并单元格:【s:start合并开始、 e:end合并结束、r:row行、c:col列】
      如:
          { s: { r: 0, c: 0 }, e: { r: 0, c: 1 } },表示:A1 与 B1,合并为A1的内容

          其实就是:0:代表第一行,或第一列;1:代表第二行,或第二列;
  */
  ws['!merges'] = [{ s: { r: 0, c: 0 }, e: { r: 0, c: 0 } }]

  // 自定义表格样式
  for (let key in ws) {
    if (key == '!ref' || key == '!merges' || key == '!cols' || key == '!rows') {
      continue
    } else {
      console.log('key=', key)      

      // 通过key值,来选择筛选想要设置样式的单元格
      if (key == 'A2') {
        console.log('ws[key]=', ws[key])

        ws[key].s = {
          // 设置单元格样式
          fill: {
            // 设置背景色
            fgColor: { color: 'red' },
          },
          font: {
            // 设置字体
            name: '等线', // 字体名称
            sz: 16, // 字体大小
            bold: true, // 字体是否加粗
            color: {
              // 字体颜色
              rgb: '1890ff',
            },
          },
          border: {
            // 设置边框
            top: {
              style: 'thin',
              color: {
                rgb: '1890ff',
              },
            },
            bottom: {
              style: 'thin',
              color: {
                rgb: '1890ff',
              },
            },
          },
          alignment: {
            horizontal: 'center', // 横向(向左、向右、居中)
            vertical: 'center', // 纵向(向上、向下、居中)
            wrapText: true, // 设置单元格自动换行,目前仅对非合并单元格生效
            indent: 2, // 设置单元格缩进
          },
        }
      }
    }
  }

  // 将 工作表 添加到 workbook
  XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')

  // 将 workbook 写入文件
  XLSX.writeFile(wb, 'tablename.xlsx')
}

const transData = (columns: any, tableList: any) => {
  const obj = columns.reduce((acc: any, cur: any) => {
    if (!acc.titles && !acc.keys) {
      acc.titles = []
      acc.keys = []
    }
    acc.titles.push(cur.title)
    acc.keys.push(cur.key)
    return acc
  }, {})
  console.log('obj=', obj)

  const tableBody = tableList.map((item: any) => {
    return obj.keys.map((key: string) => item[key])
  })
  console.log('tableBody=', tableBody)

  return [obj.titles, ...tableBody]
}

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

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

相关文章

MySQL 视图与事务

文章目录 视图事务事物的四大特性(ACID)事务的开启和结束事物隔离级别现象脏读不可重复度幻读 隔离级别读未提交(READ UNCOMMITTED)读提交 (READ COMMITTED)可重复读 (REPECTABLE READ)串行化 (SERIALIZABLE) 查看与设置事务隔离级别重复读的…

【前端 13】Vue快速入门

Vue快速入门 在现代Web开发中,尽管通过HTML、CSS和JavaScript我们能够构建出美观且功能丰富的页面,但随着项目规模的增大,这种传统的开发方式在效率上逐渐显得力不从心。为了提高开发效率,前端开发者们引入了多种框架和库&#x…

Python酷库之旅-第三方库Pandas(050)

目录 一、用法精讲 181、pandas.Series.var方法 181-1、语法 181-2、参数 181-3、功能 181-4、返回值 181-5、说明 181-6、用法 181-6-1、数据准备 181-6-2、代码示例 181-6-3、结果输出 182、pandas.Series.kurtosis方法 182-1、语法 182-2、参数 182-3、功能 …

异步通信方式的两种消息传输模型

文章目录 一、点对点模型1.1 什么是点对点模型1.2 点对点模型的特点 二、发布订阅模型2.1 什么是发布订阅模型2.2 发布订阅模式的日常案例2.3 发布订阅模型的特点 三、总结参考资料 一、点对点模型 1.1 什么是点对点模型 点对点模型(也叫队列模型) 1.2…

Shiro安全框架与SpringBoot的整合(下)

目录 一、整合前的配置 1.1 导入shiro依赖 1.2 config配置 1.2.1 ShiroConfig(⭐) 1.2.2 MyConfig(拦截器配置) 3. 拦截器(LoginInterceptor) 二、认证登录 2.1. controller 2.2 service和serviceImpl(不用) 2.3 mapper …

[Meachines] [Easy] Blocky Jar包反编译

信息收集 IP AddressOpening Ports10.10.10.37TCP:21,22,80,25565 $ nmap -p- 10.10.10.37 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp ProFTPD 1.3.5a 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu …

自动驾驶的六个级别是什么?

自动驾驶汽车和先进的驾驶辅助系统(ADAS)预计将帮助拯救全球数百万人的生命,消除拥堵,减少排放,并使我们能够在人而不是汽车周围重建城市。 自动驾驶的世界并不只由一个维度组成。从没有任何自动化到完整的自主体验&a…

VScode调试Python代码

用Python debugger 参考 vscode-python的debug 教学(最全)

动手学深度学习55 循环神经网络 RNN 的实现

动手学深度学习55 循环神经网络 RNN 的实现 从零开始实现简洁实现QA 课件:https://zh-v2.d2l.ai/chapter_recurrent-neural-networks/rnn-scratch.html 从零开始实现 %matplotlib inline import math import torch from torch import nn from torch.nn import fun…

【前端逆向】最佳JS反编译利器,原来就是chrome!

有时候需要反编译别人的 min.js。 比如简单改库、看看别人的 min,js 干了什么,有没有重复加载?此时就需要去反编译Javascript。 Vscode 里面有一些反编译插件,某某Beautify等等。但这些插件看人品,运气不好搞的话,反…

力扣高频SQL 50题(基础版)第二十题

文章目录 力扣高频SQL 50题(基础版)第二十题2356.每位教师所教授的科目种类的数量题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50题(基础版)第二十题 2356.每位教师所教授的科目种类的数量 题目说明 表: Te…

算法——二分查找(day10)

目录 69. x 的平方根 题目解析: 算法解析: 代码: 35. 搜索插入位置 题目解析: 算法解析: 代码: 69. x 的平方根 69. x 的平方根 - 力扣(LeetCode) 题目解析: 老…

2025第十九届中国欧亚国际军民两用技术及西安国防电子航空航天暨无人机展

2025第十九届中国欧亚国际军民两用技术及西安国防电子航空航天暨无人机展 时间:2025年3月14-16日 地点:西安国际会展中心 详询主办方陆先生 I38(前三位) I82I(中间四位) 9I72(后面四位&am…

中间层 k8s(Kubernetes) 到底是什么,架构是怎么样的?

你是一个程序员,你用代码写了一个博客应用服务,并将它部署在了云平台上。 但应用服务太过受欢迎,访问量太大,经常会挂。 所以你用了一些工具自动重启挂掉的应用服务,并且将应用服务部署在了好几个服务器上,…

【C++】实验六

题目: 1、苹果和虫子 描述:你买了一箱n个苹果,很不幸的是买完时箱子里混进了一条虫子。虫子每x小时能吃掉一个苹果,假设虫子在吃完一个苹果之前不会吃另一个,那么经过y小时你还有多少个完整的苹果? 输入…

Linux基础复习(三)

前言 接Linux基础复习二 一、常用命令及其解释 Tab补全 在上一篇文章配置了IP然后通过远程SSH连接软件控制主机,在配置过程中会发现有些命令过于长,那么,Tab键补全就可以很好的帮助我们去快速的敲出命令,同时如果有些命令有遗…

AJAX(1)——axios库的使用

什么是AJAX? AJAX是异步的JavaScript和XML。简单来说,就是使用XMLHttpRequest对象与服务器通信。它可以使用JSON,XML,HTML和text文本等格式发送和接收数据。AJAX最吸引人的就是它异步的特性,也就是说它可以在不重新刷新页面的情况下与服务器通信&#…

免费【2024】springboot 宠物救助管理系统的设计与实现

博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

成为git砖家(4): git status 命令简介

1. untracked 和 tracked 状态 Remember that each file in your working directory can be in one of two states: tracked or untracked. Tracked files are files that were in the last snapshot, as well as any newly staged files; they can be unmodified, modified, o…

Feign自定义调用第三方接口并实现负载均衡

Feign自定义调用第三方接口并实现负载均衡 Feign简介: Feign 是一个声明式的、模板化的HTTP客户端,用于简化HTTP客户端的开发。它是Spring Cloud Netflix微服务套件中的一部分,使得编写Java HTTP客户端变得更加容易。它的原理主要是代理模式…