vue3前端excel导出;组件表格,自定义表格导出;Vue3 + xlsx + xlsx-style

news2024/10/6 6:50:24

当画面有自定义的表格或者样式过于复杂的表格时,导出功能可以由前端实现

1. 使用的插件 : sheet.js-xlsx

文档地址:https://docs.sheetjs.com/
中文地址:https://geekdaxue.co/read/SheetJS-docs-zh/README.md
xlsx-style:https://www.npmjs.com/package/xlsx-style
在这里插入图片描述

2. 安装引用

安装插件-vue3

yarn add xlsx 
yarn add xlsx-style-vite (有样式需求才需要安装;背景色等)

引用插件

import * as XLSX from 'xlsx';
import * as XLSX_STYLE from 'xlsx-style-vite'

3. 组件表格的导出(无样式)

以ant design vue 表格为例,只导出表格内容

<a-table :columns="columns" :dataSource="detaildata" :scroll="{ x: 'max-content',y:700 }" ></table?>
<a-button @click="exportData">导出</a-button>

<script>
   //数据处理为数组
	const transData=(columns, tableList)=> {
       const obj = columns.reduce((acc, cur) => {
         if (!acc.titles && !acc.keys) {
           acc.titles = [];
           acc.keys = [];
         }
         acc.titles.push(cur.title);
         acc.keys.push(cur.dataIndex);
         return acc;
       }, {});
       const tableBody = tableList.map((item,i) => {
         return obj.keys.map((key,index) => item[key]);
       });
       return [ obj.titles, ...tableBody ];
    }
     const exportData=()=>{
          const tableData = transData(
              columns.value,
              detaildata.value
          );
          // 将数据数组转换为工作表
          const ws = XLSX.utils.aoa_to_sheet(tableData);
          // 创建 workbook
          const wb = XLSX.utils.book_new();
          ws['!ref'] = `A1:AI${tableData.length}`;
          //设置列宽
          ws["!cols"] = [
            {wpx: 120}, 
            {wpx: 100},
            {wpx: 110},
            {wpx: 110},];
          //合并单元格
          ws['!merges'] = [{ s: { r: 0, c: 0 }, e: { r: 0, c: 1 } }]
          // 将 工作表 添加到 workbook
          XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
          // 将 workbook 写入文件
          XLSX.writeFile(wb, 'tablename.xlsx');
  }
</script>

3. 自定义表格的导出 (div拼成的表格)

比如这种前端拼成的,又附带各种样式的表格
在这里插入图片描述
一些常用的格式:
(1):合并单元格
(2):列宽
(3):背景色
(4):字体相关-大小粗细颜色字体等
(5):表格线,边框
详细的格式可以参考:
https://www.jianshu.com/p/869375439fee
https://www.npmjs.com/package/xlsx-style

数据处理就不写了,数据处理为数组就可以了
const toExcel=()=>{
	const data = [
	        ['左上表头','','','右上',''],
	        ['标题1','','','',''],
	        ['标题','测试合并','','',''],
	        ['固定标题','123','123','',''],
	        ['左下表头','','','右下',''],
			['2021','¥28337','测试数据','北京','黑龙江'],
			......
	    ]
	const worksheet = XLSX.utils.aoa_to_sheet([headers, ...data])
	const workbook = XLSX.utils.book_new()
	worksheet['!ref'] = `A1:AI${data.length}`
	
	//列宽 按excel的列顺序排列,对应A列,B列, C列......
	worksheet["!cols"] = [
	  {wpx: 200}, 
	  {wpx: 80},
	  {wpx: 80},
	  {wpx: 110}, 
	  {wpx: 110},
	];
	
	/* 
	合并单元格 默认合并当前格的右侧格子
	{ s: { r: 0, c: 0 }, e: { r: 0, c: 1 } }
	A1 与 B1 合并 内容为 A1 的内容
	
	s:start 合并开始 e:end 合并结束
	r:row 行 c:col 列 
	*/
	
	worksheet['!merges'] = [
	  { s: { r: 0, c: 0 }, e: { r: 0, c: 1 } },
	  { s: { r: 0, c: 4 }, e: { r: 0, c: 5 } },
	  { s: { r: 4, c: 0 }, e: { r: 4, c: 1 } },
	  ......
	];
	
	//表格详细样式
	for (let key in worksheet) {
	   if (key == '!ref' || key == '!merges' || key == '!cols' || key == '!rows') {
	     continue
	   } else {
		 //通过key值来选择筛选想要的设置样式的单元格
	     if (key.substring(1)=='1'||key.substring(1)=='5'|| key == 'A2') {
	        worksheet[key].s = { // 设置单元格样式
	            fill: { // 设置背景色
	              fgColor: { rgb: 'F2F3F7' },
	            },
	            font: { // 设置字体
	              name: '等线', // 字体名称
	              sz: 16, // 字体大小
	              bold: true, // 字体是否加粗
	              color:{ //字体颜色
	                    rgb:'ed263d'
	               }
	            },
	            border:{ //设置边框
	              top: {
	                  style: 'thin',
	                  color:{
	                      rgb:'e5e7eb'
	                  }
	              },
	              bottom: {
	                  style: 'thin',
	                  color:{
	                      rgb:'e5e7eb'
	                  }
	              }
	          },
	          alignment: {
	            horizontal: 'center', // 横向(向左、向右、居中)
	            vertical: 'center', // 纵向(向上、向下、居中)
	            wrapText: true, // 设置单元格自动换行,目前仅对非合并单元格生效
	            indent: 0 // 设置单元格缩进
	          }
	        }
	     }else if(key == 'B1'){
	     	......
	     }
	   }
	}
	
	XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1')
	const tmpDown = new Blob([
	    s2ab(
	    XLSX_STYLE.write(workbook, {
	        bookType: 'xlsx',
	        bookSST: false,
	        type: 'binary',
	        cellStyles: true,
	    })
	    ),
	])
	downloadExcelFile(tmpDown, 'excelname' + '.xlsx')
}

/*用到的方法*/
export function s2ab(s) {
  if (typeof ArrayBuffer !== 'undefined') {
    const buf = new ArrayBuffer(s.length)
    const view = new Uint8Array(buf);
    for (let i = 0; i != s.length; ++i) {
      view[i] = s.charCodeAt(i) & 0xff
    }
    return buf
  } else {
    const buf = new Array(s.length)
    for (let i = 0; i != s.length; ++i) {
      buf[i] = s.charCodeAt(i) & 0xff
    }
    return buf
  }
}

/**
 * 使用 a 标签下载文件
 */
export function downloadExcelFile(obj, fileName){
  const a_node = document.createElement('a')
  a_node.download = fileName
  if ('msSaveOrOpenBlob' in navigator) {
    window.navigator.msSaveOrOpenBlob(obj, fileName)
  } else {
    a_node.href = URL.createObjectURL(obj)
  }
  a_node.click()
  setTimeout(() => {
    URL.revokeObjectURL(obj)
  }, 2000)
}

参考文章:https://blog.csdn.net/Cai181191/article/details/131130926

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

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

相关文章

⭐北邮复试刷题LCR 052. 递增顺序搜索树__DFS (力扣119经典题变种挑战)

LCR 052. 递增顺序搜索树 给你一棵二叉搜索树&#xff0c;请 按中序遍历 将其重新排列为一棵递增顺序搜索树&#xff0c;使树中最左边的节点成为树的根节点&#xff0c;并且每个节点没有左子节点&#xff0c;只有一个右子节点。 示例 1&#xff1a; 输入&#xff1a;root [5,…

跨境电商消息多发脚本制作需要用到的代码!

在跨境电商的运营中&#xff0c;为了更有效地推广产品、提升品牌知名度并增强与消费者的互动&#xff0c;消息群发成为了一个重要的营销手段。 为了实现这一目的&#xff0c;许多跨境电商团队会选择制作消息多发脚本&#xff0c;通过自动化发送消息来提高效率和覆盖面&#xf…

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习三(leetcode真题剖析)

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习三 01.字母大小写全排列02.优美的排列03.N 皇后04.有效的数独 01.字母大小写全排列 题目链接&#xff1a;https://leetcode.cn/problems/letter-case-permutation/ 给定一个字符串 s &#xff0c;通过将字符串 s 中的每个字…

获取discord上自己创建的服务器的服务器ID、频道ID以及discord的登录token(用于第三方登录)

在服务器图标上右键点击-》复制服务器ID 在频道上右键点击-》复制频道ID F12->手机模式-》application-》local storage-》填写过滤条件【token】 我开发的chatgpt网站&#xff1a; https://chat.xutongbao.top

铌酸锂芯片与精密划片机:科技突破引领半导体制造新潮流

在当今快速发展的半导体行业中&#xff0c;一种结合了铌酸锂芯片与精密划片机的创新技术正在崭露头角。这种技术不仅引领着半导体制造领域的进步&#xff0c;更为其他产业带来了前所未有的变革。 铌酸锂芯片是一种新型的微电子芯片&#xff0c;它使用铌酸锂作为基底材料&#x…

dp入门(模板题)

解法一&#xff1a; 双指针&#xff0c;没必要开数组直接边输边算&#xff0c;max至少要2个数&#xff0c;补一个数时的特判 #include <iostream> #include <vector> #include <algorithm> using namespace std; #define endl \nint main() {ios::sync_wit…

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(二)

在我们开始探索人工智能的世界时&#xff0c;了解如何与之有效沉浸交流是至关重要的。想象一下&#xff0c;你手中有一把钥匙&#xff0c;可以解锁与OpenAI的GPT模型沟通的无限可能。这把钥匙就是——正确的提示词&#xff08;prompts&#xff09;。无论你是AI领域的新手&#…

SaaS智慧校园管理平台全套源码,支持二次开发,项目使用

什么是电子班牌系统&#xff1f; 电子班牌用来显示班级信息&#xff0c;班级活动信息以及学校的通知信息。信息内容为文字、图片、视频、FLASH等&#xff0c;为学生和老师提供新颖的师生交流及校园服务平台。融合了多媒体信息发布、家校互通、物联控制、教务管理、日常办公等一…

求人脸底库匹配用时统计记录

1、 注意事项 1、预热 2、torch 异步 import torch import time torch.cuda.synchronize()device torch.device(cuda:2) data_type torch.float32t1 time.time() a torch.rand((40000000,512),dtypedata_type,devicedevice) b torch.rand((512,1),dtypedata_type,device…

Linux:Jenkins用户权限和管理

1.下载插件 由于Jenkins的默认权限管理并不是很精细所以我们安装一个插件进行权限的一个管理 插件名称为&#xff1a;Role-based Authorization Strategy 安装完插件我们再去配置一下 进入全局安全配置 选择这个Role-Based Strategy策略然后保存 2.创建角色 我们这里主要使…

Stable Diffusion 模型分享:Dark Sushi Mix 大颗寿司Mix

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

学习鸿蒙基础(4)

1.条件渲染 ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态&#xff0c;使用if、else和else if渲染对应状态下的UI内容。 当if、else if后跟随的状态判断中使用的状态变量值变化时&#xff0c;条件渲染语句会进行更新。。 Entry Component struct PageIfElse {Stat…

pytorch保存张量为图片

这里用到的是torchvision中的save_image。 废话不多说&#xff0c;直接来代码&#xff1a; import torch from torchvision.utils import save_image B, C, H, W 64, 3, 32, 32 input_tensor torch.randn(B, C, H, W) save_image(input_tensor, "hh.png", nrow8)…

easyui 手风琴Accordion 面板的高度设置

今天接到一个新的小需求&#xff0c;如下图&#xff0c;当预算表单只有一个时&#xff0c;要求不显示预算表单这块的内容。 考虑到页面创建时用到了表单的回调和点击方法&#xff0c;所以不能单纯的移除&#xff0c;移除右侧表格的创建会报错&#xff0c;所以只能隐藏。 隐藏…

缓存篇—缓存穿透

当发生缓存雪崩或击穿时&#xff0c;数据库中还是保存了应用要访问的数据&#xff0c;一旦缓存恢复相对应的数据&#xff0c;就可以减轻数据库的压力&#xff0c;而缓存穿透就不一样了。 当用户访问的数据&#xff0c;既不在缓存中&#xff0c;也不在数据库中&#xff0c;导致…

搭建sql-labs靶机环境

phpstudy&#xff08;小皮面板&#xff09; 先下载phpstudy&#xff08;小皮面板&#xff09;软件&#xff0c;方便我们快速搭建环境&#xff0c;该软件程序包集成最新的ApachePHPMySQLngix,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境.该程序不仅包括PHP调试…

petalinux_zynq7 驱动DAC以及ADC模块之四:python实现http_api

前文&#xff1a; petalinux_zynq7 C语言驱动DAC以及ADC模块之一&#xff1a;建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C语言驱动DAC以及ADC模块之二&#xff1a;petalinuxhttps://blog.csdn.net/qq_27158179/article/details/1362…

世界顶级名校计算机专业学习使用教材汇总

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-IauYk2cGjEyljid0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

前端架构: 实现脚手架终端UI样式之ANSI escape code, Chalk, Ora介绍

在脚手架当中实现命令行的UI显示 1 &#xff09;概述 在命令行中&#xff0c;如果想实现除传统的常规文本以外的内容比如想对字体进行加粗斜体下划线&#xff0c;包括对它改变颜色改变前景色改变后景色等等需要借助一个叫做 ANSI escape code 这样的一个概念它其实是一个标准&…

穿越Redis单线程迷雾:从面试场景到技术内核的解读

目录 ​编辑 前言 Redis中的多线程 I/O多线程 Redis中的多进程 结论 延伸阅读 前言 很多人都遇到过这么一道面试题&#xff1a;Redis是单线程还是多线程&#xff1f;这个问题既简单又复杂。说他简单是因为大多数人都知道Redis是单线程&#xff0c;说复杂是因为这个答案…