vue导出excel,自定义多级表头高度

先看结果:

1、我的列表由于我的是有动态列的,所以下面的代码会对动态列进行判断处理:

导出结果:

2、直接贴代码,我对1、2、3行做了适配业务处理

导入依赖,没有的直接搜一下安装,然后导入即可

import { saveAs } from 'file-saver';

import * as ExcelJS from 'exceljs';

建议导入4.*的,如果导入报错,很可能是兼容问题,换一个版本

导出方法贴代码:

exportToExcel() {
            this.$nextTick(async () => {
            //const workbook = XLSX.utils.book_new();// new ExcelJS.Workbook();
            const workbook = new ExcelJS.Workbook();
            const worksheet = workbook.addWorksheet('Sheet1');
            // 设置多级表头
            if(this.data.checkbox4 == true){
                worksheet.mergeCells('A1:I1'); // 合并
            }else{
                worksheet.mergeCells('A1:H1'); // 合并
            }
            let cell =  worksheet.getCell('E1');
            cell.value = '明细分类账';
            cell.alignment = { horizontal: 'center', vertical: 'middle' };
            cell.font = { size: 24 }; // 设置字体大小

            worksheet.mergeCells('A2:C2'); // 合并
            const datestr = this.getDeatilDate();
            cell =  worksheet.getCell('A2');
            cell.value = datestr;
            cell.alignment = { horizontal: 'center', vertical: 'middle',wrapText: true };//wrapText: true允许换行

            if(this.data.checkbox4 == true){
                worksheet.mergeCells('E2:I2'); // 合并
            }else{
                worksheet.mergeCells('E2:H2'); // 合并
            }
            const dm = this.getDetailShow();
            cell =  worksheet.getCell('G2');
            cell.value = dm;
            cell.alignment = { horizontal: 'center', vertical: 'middle' };

            worksheet.mergeCells('A3:A4'); // 合并第一列的3、4行
            const cell1 =  worksheet.getCell('A3');
            cell1.value = '凭证日期';
            cell1.alignment = { horizontal: 'center', vertical: 'middle' };

            worksheet.mergeCells('B3:B4'); // 合并
            const cell2 =  worksheet.getCell('B3');
            cell2.value = '凭证字号';
            cell2.alignment = { horizontal: 'center', vertical: 'middle' };


            worksheet.mergeCells('C3:C4'); // 合并
            const cell3 =  worksheet.getCell('C3');
            cell3.value = '摘要';
            cell3.alignment = { horizontal: 'center', vertical: 'middle' };


            worksheet.mergeCells('D3:D4'); // 合并
            const cell4 =  worksheet.getCell('D3');
            cell4.value = '对方科目';
            cell4.alignment = { horizontal: 'center', vertical: 'middle' };

            worksheet.mergeCells('E3:E4'); // 合并
            const cell5 =  worksheet.getCell('E3');
            cell5.value = '借方';
            cell5.alignment = { horizontal: 'center', vertical: 'middle' };


            worksheet.mergeCells('F3:F4'); // 合并
            const cell6 =  worksheet.getCell('F3');
            cell6.value = '贷方';
            cell6.alignment = { horizontal: 'center', vertical: 'middle' };


            if(this.data.checkbox4 == true){
                worksheet.mergeCells('G3:G4'); // 合并
                const cell7 =  worksheet.getCell('G3');
                cell7.value = '实际发生额';
                cell7.alignment = { horizontal: 'center', vertical: 'middle' };

                worksheet.mergeCells('H3:I3'); // 合并
                const cell8 =  worksheet.getCell('H3');
                cell8.value = '余额';
                cell8.alignment = { horizontal: 'center', vertical: 'middle' };

                const cell9 =  worksheet.getCell('H4');
                cell9.value = '方向';
                cell9.alignment = { horizontal: 'center', vertical: 'middle' };

                const cell10 =  worksheet.getCell('I4');
                cell10.value = '金额';
                cell10.alignment = { horizontal: 'center', vertical: 'middle' };
            }else {
                worksheet.mergeCells('G3:H3'); // 合并
                worksheet.getCell('G3').value = '余额';
                const cell8 =  worksheet.getCell('H3');
                cell8.value = '余额';
                cell8.alignment = { horizontal: 'center', vertical: 'middle' };

                const cell9 =  worksheet.getCell('G4');
                cell9.value = '方向';
                cell9.alignment = { horizontal: 'center', vertical: 'middle' };

                const cell10 =  worksheet.getCell('H4');
                cell10.value = '金额';
                cell10.alignment = { horizontal: 'center', vertical: 'middle' };
                
            }
            
            // 添加数据行
            if(this.data.checkbox4 == true){
                this.tableData.forEach(row => {
                    const currow = worksheet.addRow([
                        row.billdate,
                        row.credname,
                        row.brief,
                        row.targetSubjectName,
                        row.debit,
                        row.credit,
                        (row.debit == null ? 0 : row.debit) - (row.credit == null ? 0 : row.credit),
                        row.todebit,
                        row.lastMoney
                    ]);
                    // 设置整行内容居中对齐
                    currow.eachCell({ includeEmpty: true }, (cell) => {
                        cell.alignment = { horizontal: 'center', vertical: 'middle' };
                    });
                });

            }else {
                this.tableData.forEach(row => {
                  const currow = worksheet.addRow([
                        row.billdate,
                        row.credname,
                        row.brief,
                        row.targetSubjectName,
                        row.debit,
                        row.credit,
                        row.todebit,
                        row.lastMoney
                    ]);
                    // 设置整行内容居中对齐
                    currow.eachCell({ includeEmpty: true }, (cell) => {
                        cell.alignment = { horizontal: 'center', vertical: 'middle' };
                    });
                });
            }
            // 获取最后一行的行号
            const lastRowNumber = worksheet.rowCount;

            // 获取当前日期
            const currentDate = new Date();
            // 格式化日期为 YYYY-MM-DD
            const formattedDate = currentDate.toISOString().split('T')[0]; // 使用toISOString方法并截取日期部分
            worksheet.mergeCells('A'+(lastRowNumber+1)+':C'+(lastRowNumber+1)); // 合并
            cell =  worksheet.getCell('A'+(lastRowNumber+1));
            cell.value = '操作员:'+this.opname;
            cell.alignment = { horizontal: 'center', vertical: 'middle' };

            worksheet.mergeCells('E'+(lastRowNumber+1)+':H'+(lastRowNumber+1)); // 合并
            cell =  worksheet.getCell('E'+(lastRowNumber+1));
            cell.value = '打印时间:'+formattedDate;
            cell.alignment = { horizontal: 'center', vertical: 'middle' };


            // // 设置列宽、由于我上面设置了多级表头,这里的就不需要设置表头和宽度了
            // worksheet.columns = [
            // { header: '凭证日期', key: 'billdate', width: 15,  },
            // { header: '凭证字号', key: 'credname', width: 15,  },
            // { header: '摘要', key: 'brief', width: 30, },
            // { header: '对方科目', key: 'targetSubjectName', },
            // { header: '借方', key: 'debit', width: 15,  },
            // { header: '贷方', key: 'credit', width: 15, },
            // { header: '实际发生额', key: 'happenMoney', width: 15, },
            // { header: '余额', key: 'hadmoney', width: 15, },
            // ];
            // 设置特定行的高度(例如第2行)
            const rowNumber = 2; // 行号从1开始
            const rowHeight = 80; // 设置为80
            const row = worksheet.getRow(rowNumber);
            row.height = rowHeight;
            // 导出 Excel 文件
            const buffer = await workbook.xlsx.writeBuffer();
            saveAs(new Blob([buffer]), '明细分类账.xlsx');
            });
        },

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【知识点】图与图论入门

何为图论 见名知意,图论 (Graph Theory) 就是研究 图 (Graph) 的数学理论和方法。图是一种抽象的数据结构,由 节点 (Node) 和 连接这些节点的 边 (Edge) 组成。图论在计算机科学、网络分析、物流、社会网络分析等领域有广泛的应用。 如下,这…

【AI模型对比】AI新宠Kimi与ChatGPT的全面对比:技术、性能、应用全揭秘

文章目录 Moss前沿AI技术背景Kimi人工智能的技术积淀ChatGPT的技术优势 详细对比列表模型研发Kimi大模型的研发历程ChatGPT的发展演进 参数规模与架构Kimi大模型的参数规模解析ChatGPT的参数体系 模型表现与局限性Kimi大模型的表现ChatGPT的表现 结论:如何选择适合自…

攻防世界 ctf刷题 新手区1-10

unserialize3 因为我上个笔记写了 php返序列化 所以先趁热打铁 看这个题目名字 我们就知道是 反序列化呀 因为flag有值所以 我们先输个 111 看看有没有线索 没线索但是这边 有个发现就是他是使用get方式传参的 可能他会把我们的输入 进行传入后台有可能进行反…

FlightGear+MATLAB+飞行手柄实现实时飞控视景系统

文章目录 一、软件配置二、FlightGearMATLAB联合仿真第一步 复制文件第二步 新建文件夹第三步 打开demo第四步 demo说明第五步 打开Simulink第六步 连接FlightGear第七步 设置FlightGear第八步 生成FlightGear连接文件FlightGear的设置Network的设置File的设置生成.bat文件 第九…

AC高可靠

在真实网络中,一台AC可能要管理上百台AP,因此对与AC的可靠性要求目前有4种解决方案 分别是VRRP双机热备,双链路冷备,双链路热备,N1备份 简述 VRRP双机热备份 主备AC两个独立的IP地址,通过VRRP对外虚拟为同…

动手学深度学习d2l包M4芯片 gpu加速

conda创建环境 CONDA_SUBDIRosx-arm64 conda create -n ml python3.9 -c conda-forge conda env config vars set CONDA_SUBDIRosx-arm64 conda activate mlpip安装包 pip install --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/n…

app-1 App 逆向环境准备(mumu模拟器+magisk+LSPosed+算法助手+抓包(socksDroid+charles)+Frida环境搭建

一、前言 本篇是基于 mumu模拟器 进行环境配置记录。(真机的后面博客记录) 二、mumu模拟器magiskLSPosed算法助手 2.1、mumu模拟器 选择 mumu 模拟器,下载地址:https://mumu.163.com 安装完成后打开,找到设置中心进…

uniapp 封装自定义头部导航栏

封装原因 项目中有时候需要使用自定义的头部导航栏,原生的无法满足需求 参数 属性名描述示例title标题字符串:首页bgColor背景色字符串:#ffftype左侧的操作内容字符串:all,详细值请在下方查看 参数解释 type all…

【书生大模型实战营】Python 基础知识-L0G2000

前言:本文是书生大模型实战营系列的第2篇文章,是入门岛的第二个任务,主题为:Python基础知识。 官方教程参考链接:Tutorial/docs/L0/Python at camp4 InternLM/Tutorial 1.任务概览 本关为Python基础关卡&#xff0…

Ubuntu22.04深度学习环境安装【cuda+cudnn】

为了复现一篇深度学习论文,特意安装了Linux系统。前一天已经安装Linux显卡驱动,现在需要安装cuda、cudnn等。 论文代码 论文PDF 确定包版本: 根据论文提供的代码。在requirements.txt中发现cuda版本为11.7,cudnn为8.5.0,python没…

微信小程序实现图片拖拽调换位置效果 -- 开箱即用

在编写类似发布朋友圈功能的功能时,需要实现图片的拖拽排序,删除图片等功能。 一、效果展示 **博主的小程序首页也采用了该示例代码,可以在威信中搜索:我的百宝工具箱 二、示例代码 1.1、在自己的小程序中创建组件 1.2、组件…

Spring框架-IoC的使用(基于XML和注解两种方式)

一、Spring IoC使用-基于XML 1 IoC使用-基于XML 使用SpringIoC组件创建并管理对象 1.1 创建实体类 package com.feng.ioc.bean;import java.util.Date;/*** program: spring-ioc-demo1* description: 学生实体类* author: FF* create: 2024-12-04 18:53**/ public class Stud…

圆通开放平台快递物流查询API对接流程

作为一家深受用户信赖的快递物流服务商,圆通快递通过开放平台为用户提供高效的快递物流查询API。圆通开放平台是将圆通下单、轨迹、工单及基础服多种服务接口通过开放平台赋能客户,帮助客户快速建立全面的物流解决方案的共联平台。平台现有接口文档统一管…

如何防御ARP欺骗 保护IP安全

在数字化浪潮席卷全球的今天,网络安全威胁如同暗流涌动,时刻考验着我们的防范能力。其中,ARP欺骗攻击作为一种隐蔽性强、成本低廉且危害严重的网络攻击手段,成为众多网络安全事件中的一颗“毒瘤”。那么我们究竟是如何防御ARP欺骗…

云数据库 HBase

HBase 是一个分布式、可扩展的列式 NoSQL 数据库,源自 Google 的 Bigtable 论文,并是 Apache Hadoop 生态系统的一部分。它特别适用于需要处理大规模数据集的场景,尤其是那些要求高吞吐量和低延迟的数据访问。HBase 支持分布式存储&#xff0…

泷羽sec学习打卡-shell命令8

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于shell的那些事儿-shell8 until循环(直到为止)case语句func函数定义实践是检验真理的唯一标准 别问&…

车机端同步outlook日历

最近在开发一个车机上的日历助手,其中一个需求就是要实现手机端日历和车机端日历数据的同步。然而这种需求似乎没办法实现,毕竟手机日历是手机厂商自己带的系统应用,根本不能和车机端实现数据同步的。 那么只能去其他公共的平台寻求一些机会&…

从零开始学TiDB(1) 核心组件架构概述

首先TiDB深度兼容MySQL 5.7 1. TiDB Server SQL语句的解析与编译:首先一条SQL语句最先到达的地方是TiDB Server集群,TiDB Server是无状态的,不存储数据,SQL 发过来之后TiDB Server 负责 解析,优化,编译 这…

Linux絮絮叨(三) Ubuntu桌面版添加中文拼音输入法

步骤很详细,直接上教程 一. 配置安装简体拼音输入法 #安装相应的平台支持包 sudo apt install ibus-gtk ibus-gtk3# 安装简体拼音输入法 sudo apt install ibus-pinyin安装完成如果下面的步骤找不到对应输入法可以重启一下,一般不需要 二. 添加简体拼音…

RTCMultiConnection 跨域问题解决

js套件地址 https://github.com/muaz-khan/RTCMultiConnection server套件地址 https://github.com/muaz-khan/RTCMultiConnection-Server 要解决的就是server代码的跨域问题 原装写法: 解决写法: // 喜欢组合语法的自己组 const io new ioServer.S…