vxe-table v4.8+ 与 v3.10+ 导出 xlsx、支持导出合并、设置样式、宽高、边框、字体、背景、超链接、图片的详细介绍,一篇就够了
Vxe UI vue vxe-table v4.8+ 与 v3.10+ 导出 xlsx、支持导出合并、设置样式、宽高、边框、字体、背景、超链接、图片等、所有常用的 Excel 格式都能自定义,使用非常简单,纯前端实现复杂的导出。
安装插件
npm install vxe-pc-ui@4.2.39 vxe-table@4.8.0 @vxe-ui/plugin-export-xlsx@4.0.7 exceljs@4.4.0
// ...
import { VxeUI } from 'vxe-pc-ui'
import VxeUIPluginExportXLSX from '@vxe-ui/plugin-export-xlsx'
// ...VxeUI.use(VxeUIPluginExportXLSX)
在 index.html 引入对应的解析库,把对应的 js 下载到本地引入。
<script src="https://vxeui.com/umd/exceljs@4.4.0/dist/exceljs.min.js"></script>
默认导出
默认支持文本和单元格合并等导出,只需要开启对应的功能就可以直接使用了。


<template><div><vxe-button @click="exportEvent">高级导出</vxe-button><vxe-grid ref="gridRef" v-bind="gridOptions"></vxe-grid></div>
</template><script setup>
import { ref, reactive } from 'vue'const gridRef = ref()const gridOptions = reactive({border: true,showFooter: true,mergeCells: [{ row: 0, col: 2, rowspan: 2, colspan: 2 },{ row: 2, col: 1, rowspan: 3, colspan: 2 }],exportConfig: {type: 'xlsx'},columns: [{ field: 'seq', type: 'seq', width: 70 },{title: '分组1',children: [{ field: 'name', title: 'Name' },{ field: 'role', title: 'Role' }]},{ field: 'sex', title: 'Sex' },{ field: 'age', title: 'Age' }],data: [{ id: 10001, name: '张三', role: 'Develop', sex: 'Man', age: 28, address: 'test abc' },{ id: 10002, name: '李四', role: 'Test', sex: 'Women', age: 22, address: '广东省' },{ id: 10003, name: '王五', role: 'PM', sex: 'Man', age: 32, address: '上海' },{ id: 10004, name: '老六', role: 'Designer', sex: 'Women', age: 24, address: 'Shanghai' },{ id: 10005, name: '小七', role: 'Designer', sex: 'Man', age: 37, address: '广东省' },{ id: 10006, name: '小八', role: 'Designer', sex: 'Man', age: 39, address: 'Shanghai' }],footerData: [{ seq: '合计', name: '12人', no1: 356 }]
})const exportEvent = () => {const $grid = gridRef.valueif ($grid) {$grid.openExport()}
}
</script>
参数说明
通过 sheetMethod 自定义方法实现,参数说明 exportConfig.sheetMethod({
workbook 工作簿对象
worksheet 表对象
options 当前参数
})
自定义边框

<template><div><vxe-button @click="exportEvent">点击导出</vxe-button><vxe-grid ref="gridRef" v-bind="gridOptions"></vxe-grid></div>
</template><script setup>
import { ref, reactive } from 'vue'const gridRef = ref()const gridOptions = reactive({border: true,showFooter: true,exportConfig: {sheetMethod (params) {const { worksheet } = paramsworksheet.eachRow(excelRow => {excelRow.eachCell(excelCell => {// 设置单元格边框excelCell.border = {top: {style: 'thin',color: {argb: 'ff0000'}},left: {style: 'thin',color: {argb: 'ff0000'}},bottom: {style: 'thin',color: {argb: 'ff0000'}},right: {style: 'thin',color: {argb: 'ff0000'}}}})})}},columns: [{ field: 'seq', type: 'seq', width: 70 },{title: '分组1',children: [{ field: 'name', title: 'Name' },{ field: 'role', title: 'Role' }]},{ field: 'sex', title: 'Sex' },{ field: 'no1', title: 'NO1' },{ field: 'no2', title: 'NO2 String', cellType: 'string' }],data: [{ id: 10001, name: '张三', role: 'Develop', sex: 'Man', no1: '028', no2: '028' },{ id: 10002, name: '李四', role: '研发', sex: 'Women', no1: '220', no2: '220' },{ id: 10003, name: '王五', role: '产品经理', sex: 'Man', no1: '003200', no2: '003200' },{ id: 10004, name: '老六', role: 'Designer', sex: 'Women', no1: '02040', no2: '02040' }],footerData: [{ seq: '合计', name: '12人', no1: '356' }]
})const exportEvent = () => {const $grid = gridRef.valueif ($grid) {$grid.exportData({type: 'xlsx'})}
}
</script>
自定义字体

<template><div><vxe-button @click="exportEvent">点击导出</vxe-button><vxe-grid ref="gridRef" v-bind="gridOptions"></vxe-grid></div>
</template><script setup>
import { ref, reactive } from 'vue'const gridRef = ref()const gridOptions = reactive({border: true,showFooter: true,exportConfig: {sheetMethod (params) {const { worksheet } = paramsworksheet.eachRow(excelRow => {excelRow.eachCell(excelCell => {// 设置单元格字体excelCell.font = {bold: true,size: 16,color: {argb: 'ff0000'}}})})}},columns: [{ field: 'seq', type: 'seq', width: 70 },{title: '分组1',children: [{ field: 'name', title: 'Name' },{ field: 'role', title: 'Role' }]},{ field: 'sex', title: 'Sex' },{ field: 'no1', title: 'NO1' },{ field: 'no2', title: 'NO2 String', cellType: 'string' }],data: [{ id: 10001, name: '张三', role: 'Develop', sex: 'Man', no1: '028', no2: '028' },{ id: 10002, name: '李四', role: '研发', sex: 'Women', no1: '220', no2: '220' },{ id: 10003, name: '王五', role: '产品经理', sex: 'Man', no1: '003200', no2: '003200' },{ id: 10004, name: '老六', role: 'Designer', sex: 'Women', no1: '02040', no2: '02040' }],footerData: [{ seq: '合计', name: '12人', no1: '356' }]
})const exportEvent = () => {const $grid = gridRef.valueif ($grid) {$grid.exportData({type: 'xlsx'})}
}
</script>
自定义表头背景

<template><div><vxe-button @click="exportEvent">点击导出</vxe-button><vxe-grid ref="gridRef" v-bind="gridOptions"></vxe-grid></div>
</template><script setup>
import { ref, reactive } from 'vue'const gridRef = ref()const gridOptions = reactive({border: true,showFooter: true,exportConfig: {sheetMethod (params) {const { worksheet } = paramsworksheet.eachRow((excelRow, rowIndex) => {if (rowIndex <= 2) {excelRow.eachCell(excelCell => {// 填充单元格背景excelCell.fill = {type: 'pattern',pattern: 'solid',fgColor: {argb: 'c5d9f1'}}})}})}},columns: [{ field: 'seq', type: 'seq', width: 70 },{title: '分组1',children: [{ field: 'name', title: 'Name' },{ field: 'role', title: 'Role' }]},{ field: 'sex', title: 'Sex' },{ field: 'no1', title: 'NO1' },{ field: 'no2', title: 'NO2 String', cellType: 'string' }],data: [{ id: 10001, name: '张三', role: 'Develop', sex: 'Man', no1: '028', no2: '028' },{ id: 10002, name: '李四', role: '研发', sex: 'Women', no1: '220', no2: '220' },{ id: 10003, name: '王五', role: '产品经理', sex: 'Man', no1: '003200', no2: '003200' },{ id: 10004, name: '老六', role: 'Designer', sex: 'Women', no1: '02040', no2: '02040' }],footerData: [{ seq: '合计', name: '12人', no1: '356' }]
})const exportEvent = () => {const $grid = gridRef.valueif ($grid) {$grid.exportData({type: 'xlsx'})}
}
</script>
自定义列宽
覆盖默认的列宽

<template><div><vxe-button @click="exportEvent">点击导出</vxe-button><vxe-grid ref="gridRef" v-bind="gridOptions"></vxe-grid></div>
</template><script setup>
import { ref, reactive } from 'vue'const gridRef = ref()const gridOptions = reactive({border: true,showFooter: true,exportConfig: {async sheetMethod (params) {const { worksheet } = paramsworksheet.columns.forEach(sheetColumn => {// 设置列宽sheetColumn.width = 16})}},columns: [{ field: 'seq', type: 'seq', width: 70 },{title: '分组1',children: [{ field: 'name', title: 'Name' },{ field: 'role', title: 'Role' }]},{ field: 'sex', title: 'Sex' },{ field: 'no1', title: 'NO1' },{ field: 'no2', title: 'NO2 String', cellType: 'string' }],data: [{ id: 10001, name: '张三', role: 'Develop', sex: 'Man', no1: '028', no2: '028' },{ id: 10002, name: '李四', role: '研发', sex: 'Women', no1: '220', no2: '220' },{ id: 10003, name: '王五', role: '产品经理', sex: 'Man', no1: '003200', no2: '003200' },{ id: 10004, name: '老六', role: 'Designer', sex: 'Women', no1: '02040', no2: '02040' }],footerData: [{ seq: '合计', name: '12人', no1: '356' }]
})const exportEvent = () => {const $grid = gridRef.valueif ($grid) {$grid.exportData({type: 'xlsx'})}
}
</script>
自定义行高
覆盖默认的行高

<template><div><vxe-button @click="exportEvent">点击导出</vxe-button><vxe-grid ref="gridRef" v-bind="gridOptions"></vxe-grid></div>
</template><script setup>
import { ref, reactive } from 'vue'const gridRef = ref()const gridOptions = reactive({border: true,showFooter: true,exportConfig: {async sheetMethod (params) {const { worksheet } = paramsworksheet.eachRow((excelRow, rowIndex) => {// 设置行高excelRow.height = 60})}},columns: [{ field: 'seq', type: 'seq', width: 70 },{title: '分组1',children: [{ field: 'name', title: 'Name' },{ field: 'role', title: 'Role' }]},{ field: 'sex', title: 'Sex' },{ field: 'no1', title: 'NO1' },{ field: 'no2', title: 'NO2 String', cellType: 'string' }],data: [{ id: 10001, name: '张三', role: 'Develop', sex: 'Man', no1: '028', no2: '028' },{ id: 10002, name: '李四', role: '研发', sex: 'Women', no1: '220', no2: '220' },{ id: 10003, name: '王五', role: '产品经理', sex: 'Man', no1: '003200', no2: '003200' },{ id: 10004, name: '老六', role: 'Designer', sex: 'Women', no1: '02040', no2: '02040' }],footerData: [{ seq: '合计', name: '12人', no1: '356' }]
})const exportEvent = () => {const $grid = gridRef.valueif ($grid) {$grid.exportData({type: 'xlsx'})}
}
</script>
添加超链接

<template><div><vxe-button @click="exportEvent">点击导出</vxe-button><vxe-grid ref="gridRef" v-bind="gridOptions"></vxe-grid></div>
</template><script setup>
import { ref, reactive } from 'vue'const gridRef = ref()const gridOptions = reactive({border: true,showFooter: true,exportConfig: {sheetMethod (params) {const { worksheet } = paramsworksheet.eachRow((excelRow, rowIndex) => {if (rowIndex > 2) {excelRow.eachCell((excelCell, columnIndex) => {if (columnIndex === 2) {// 设置指定单元格为超链接excelCell.value = {text: `${excelCell.value}`,hyperlink: 'https://vxeui.com',tooltip: 'vxeui.com'}// 设置单元格字体excelCell.font = {color: {argb: '0000ff'}}}})}})}},columns: [{ field: 'seq', type: 'seq', width: 70 },{title: '分组1',children: [{ field: 'name', title: 'Name' },{ field: 'role', title: 'Role' }]},{ field: 'sex', title: 'Sex' },{ field: 'no1', title: 'NO1' },{ field: 'no2', title: 'NO2 String', cellType: 'string' }],data: [{ id: 10001, name: '张三', role: 'Develop', sex: 'Man', no1: '028', no2: '028' },{ id: 10002, name: '李四', role: '研发', sex: 'Women', no1: '220', no2: '220' },{ id: 10003, name: '王五', role: '产品经理', sex: 'Man', no1: '003200', no2: '003200' },{ id: 10004, name: '老六', role: 'Designer', sex: 'Women', no1: '02040', no2: '02040' }],footerData: [{ seq: '合计', name: '12人', no1: '356' }]
})const exportEvent = () => {const $grid = gridRef.valueif ($grid) {$grid.exportData({type: 'xlsx'})}
}
</script>
添加图片
图片支持 buffer 和 base64 格式。

<template><div><vxe-button @click="exportEvent">点击导出</vxe-button><vxe-grid ref="gridRef" v-bind="gridOptions"></vxe-grid></div>
</template><script setup>
import { ref, reactive } from 'vue'const gridRef = ref()const gridOptions = reactive({border: true,showFooter: true,exportConfig: {async sheetMethod (params) {const { worksheet, workbook } = params// 加载图片const buffer1 = await fetch('https://vxeui.com/logo.png').then(res => res.arrayBuffer())const imageId1 = workbook.addImage({buffer: buffer1,extension: 'png'})worksheet.eachRow((excelRow, rowIndex) => {if (rowIndex > 2) {// 设置行高excelRow.height = 60excelRow.eachCell((excelCell, columnIndex) => {if (columnIndex === 2) {// 将图片添加到单元格worksheet.addImage(imageId1, {tl: { col: columnIndex - 1, row: rowIndex - 1 },ext: { width: 40, height: 40 }})}})}})}},columns: [{ field: 'seq', type: 'seq', width: 70 },{title: '分组1',children: [{ field: 'name', title: 'Name' },{ field: 'role', title: 'Role' }]},{ field: 'sex', title: 'Sex' },{ field: 'no1', title: 'NO1' },{ field: 'no2', title: 'NO2 String', cellType: 'string' }],data: [{ id: 10001, name: '张三', role: 'Develop', sex: 'Man', no1: '028', no2: '028' },{ id: 10002, name: '李四', role: '研发', sex: 'Women', no1: '220', no2: '220' },{ id: 10003, name: '王五', role: '产品经理', sex: 'Man', no1: '003200', no2: '003200' },{ id: 10004, name: '老六', role: 'Designer', sex: 'Women', no1: '02040', no2: '02040' }],footerData: [{ seq: '合计', name: '12人', no1: '356' }]
})
const exportEvent = () => {const $grid = gridRef.valueif ($grid) {$grid.exportData({type: 'xlsx'})}
}
</script>
github https://github.com/x-extends/vxe-table
gitee
相关文章:
vxe-table v4.8+ 与 v3.10+ 导出 xlsx、支持导出合并、设置样式、宽高、边框、字体、背景、超链接、图片的详细介绍,一篇就够了
Vxe UI vue vxe-table v4.8 与 v3.10 导出 xlsx、支持导出合并、设置样式、宽高、边框、字体、背景、超链接、图片等、所有常用的 Excel 格式都能自定义,使用非常简单,纯前端实现复杂的导出。 安装插件 npm install vxe-pc-ui4.2.39 vxe-table4.8.0 vx…...
江协科技STM32学习- P36 SPI通信外设
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...
【大数据】ClickHouse常见的表引擎及建表语法
ClickHouse 中最强大的表引擎当属 MergeTree (合并树)引擎及该系列(*MergeTree)中的其他引擎。接下来我们就仔细了解下MergeTree 及该系列的其他引擎的使用场景及建表语法。 MergeTree MergeTree 系列的引擎被设计用于插入极大量…...
explain执行计划分析 ref_
这里写目录标题 什么是ExplainExplain命令扩展explain extendedexplain partitions 两点重要提示本文示例使用的数据库表Explain命令(关键字)explain简单示例explain结果列说明【id列】【select_type列】【table列】【type列】 【possible_keys列】【key列】【key_len列】【ref…...
网络学习/复习4传输层
1,0...
Notepad++ 更改字体大小和颜色
前言 在长时间编程或文本编辑过程中,合适的字体大小和颜色可以显著提高工作效率和减少眼睛疲劳。Notepad 提供了丰富的自定义选项,让你可以根据个人喜好调整编辑器的外观。 步骤详解 1. 更改字体大小 打开 Notepad 启动 Notepad 编辑器。 进入设置菜…...
基于SSM+小程序的宿舍管理系统(宿舍1)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 本宿舍管理系统小程序有管理员和学生两个角色。 1、管理员功能有个人中心,公告信息管理,班级管理,学生管理,宿舍信息管理,宿舍…...
【案例分享】TeeChart 如何为人类绩效解决方案提供数据洞察
“过去二十年来,我们一直在使用 Steema Software 产品,尤其是 TeeChart,这是我们软件开发的基础部分。看到 TeeChart 在这段时间里不断发展、改进和增加功能,真是太棒了,这极大地增强了我们的产品。Steema 的客户和技术…...
细谈 Linux 中的多路复用epoll
大家好,我是 V 哥。在 Linux 中,epoll 是一种多路复用机制,用于高效地处理大量文件描述符(file descriptor, FD)事件。与传统的select和poll相比,epoll具有更高的性能和可扩展性,特别是在大规模…...
51c自动驾驶~合集4
我自己的原文哦~ https://blog.51cto.com/whaosoft/12413878 #MCTrack 迈驰&旷视最新MCTrack:KITTI/nuScenes/Waymo三榜单SOTA paper:MCTrack: A Unified 3D Multi-Object Tracking Framework for Autonomous Driving code:https://gi…...
回归预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元多输入单输出回归预测
要在MATLAB中实现BO-BiGRU(贝叶斯优化双向门控循环单元)进行多输入单输出回归预测,您需要执行以下步骤: 数据准备:准备您的训练数据和测试数据。 模型构建:构建BO-BiGRU模型,可以使用MATLAB中的…...
2-ARM Linux驱动开发-设备树平台驱动
一、概述 设备树(Device Tree)是一种描述硬件的数据结构,用于将硬件设备的信息传递给操作系统内核。它的主要作用是使内核能够以一种统一、灵活的方式了解硬件平台的细节,包括设备的拓扑结构、资源分配(如内存地址、中断号等)等信…...
C语言函数与递归
函数 函数是指将一组能完成一个功能或多个功能的语句放在一起的代码结构。在C语言程序中,至少会包含一个函数,主函数main()。本章将详细讲解关于函数的相关内容。 1、库函数 ⭕️C语言库函数是指在C语言标准库中预先定义好的函数,这些函数包…...
Linux下的Debugfs
debugfs 1. 简介 类似sysfs、procfs,debugfs 也是一种内存文件系统。不过不同于sysfs一个kobject对应一个文件,procfs和进程相关的特性,debugfs的灵活度很大,可以根据需求对指定的变量进行导出并提供读写接口。debugfs又是一个Li…...
【FFmpeg】调整音频文件的音量
1、调整音量的命令 1)音量调整为当前音量的十倍 ffmpeg -i inputfile -vol 1000 outputfile 2)音量调整为当前音量的一半 ffmpeg -i input.wav -filter:a "volume=0.5" output.wav3)静音 ffmpeg -i input.wav -filter:a "volume=0" output.wav4)…...
mac 打开访达快捷键
一、使用快捷键组合 1. Command N 在当前桌面或应用程序窗口中,按下“Command N”组合键可以快速打开一个新的访达窗口。这就像在 Windows 系统中通过“Ctrl N”打开新的资源管理器窗口一样。 2. Command Tab 切换 如果访达已经打开,只是被其他应…...
Ubuntu学习笔记 - Day2
文章目录 学习目标:学习内容:学习笔记:Linux系统启动过程内核引导运行init运行级别系统初始化建立终端用户登录系统 Ubuntu关机关机流程相关命令 Linux系统目录结构查看目录目录结构 文件基本属性读写权限命令 下载文件的方法安装wget工具下载…...
c++基础12比较/逻辑运算符
比较/逻辑运算符 布尔比较运算符逻辑运算符位运算符(也用于逻辑运算)1<a<10怎么表达T140399判断是否为两位数代码 布尔 在C中,布尔类型是一种基本数据类型,用于表示逻辑值,即真(true)或假…...
mac-ubuntu虚拟机(扩容-共享-vmtools)
一、磁盘扩容 使用GParted工具对Linux磁盘空间进行扩展 https://blog.csdn.net/Time_Waxk/article/details/105675468 经过上面的方式后还不够,需要再进行下面的操作 lvextend 用于扩展逻辑卷的大小,-l 选项允许指定大小。resize2fs 用于调整文件系统的…...
数学建模学习(135):使用Python基于WSM、WPM、WASPAS的多准则决策分析
1. 算法介绍 多标准决策分析(Multi-Criteria Decision Analysis, MCDA)是帮助决策者在复杂环境下做出合理选择的重要工具。WSM(加权和法)、WPM(加权乘积法)、WASPAS(加权和乘积评估法)是 MCDA 中的三种常用算法。它们广泛应用于工程、经济、供应链管理等多个领域,用于…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...
