【VB6|第18期】基于libxl导出Excel之导出失败的解决方案

日期:2023年6月12日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006


在这里插入图片描述


文章目录

  • 一、前言
  • 二、排查错误
  • 三、解决问题
    • (3-1)调用问题的解决方案
    • (3-2)自身问题的解决方案


历史回顾:

《VB6使用libxl读写Excel浅谈(一)》


一、前言

基于libxl开发导出xlsx格式的Excel文件的功能,遇到一些奇奇怪怪的问题,导致提示“导出失败”,其实归根结底应该还是栈溢出导致的,但是问题隐藏的比较深,也是通过大量数据排查出来的,没有直接结论,而是带领大家一起分析一遍再解决问题,主要还是想分享这种分析的思想,且听我慢慢道来吧……

知识加油站:
xls格式:xls是Excel 97-2003版本中使用的文件格式。它是一种二进制文件格式,以二进制形式存储电子表格数据。xls格式的文件通常较大,并且在功能和兼容性方面存在一些限制。在Excel 2007及更高版本中,可以继续打开和编辑xls格式的文件,但在保存时会转换为xlsx格式。
xlsx格式:xlsx是Excel 2007及之后版本中引入的文件格式。它是基于XML(可扩展标记语言)的开放文件格式,以压缩形式存储电子表格数据。相比于xls格式,xlsx文件通常更小,并且支持更多的功能和选项。它提供了更好的数据恢复能力、更高的兼容性,并且支持使用新的功能,如条件格式、表格样式和更多的行列限制。

二、排查错误

一般情况下,在导出255个以内的sheet不会有问题,导出超过255个就可能会出现“导出失败”的情况,这个情况在xls格式的Excel文件确实是一个棘手的问题,在xlsx格式的Excel文件应该已经轻松解决了。于是我将问题锁定在了libxl库本身以及调用libxl上。至于为什么会怀疑libxl库本身,说多了那都是不愿回首的曾经啊,话不多说,还是回到正题上接着聊下去。功夫不负有心人,找到了几点错误,如下:

  • 【调用问题】:单元格样式的问题;
  • 【自身问题】:工作表表名sheetname超过15个中文字符或31个西文字符的问题;

三、解决问题

(3-1)调用问题的解决方案

当不设置单元格样式,不管数据多少都可以正常导出,这波操作直接把我整蒙了,难道要我导出没有样式的Excel文件给客户,这显然是不合乎常理的。冷静思考片刻,貌似这个库给我们的感觉就是,一直在创建指针,那会不会是指针创建太多了,栈被撑爆了。

接口函数:

'创建格式
Declare Function xlBookAddFormat Lib "lib4xl.dll" Alias "xlBookAddFormatA" (ByVal bookHandle As Long, ByVal formatHandle As Long) As Long
'创建字体
Declare Function xlBookAddFont Lib "lib4xl.dll" Alias "xlBookAddFontA" (ByVal bookHandle As Long, ByVal fontHandle As Long) As Long

每个单元格创建一个 formatHandlefontHandle 指针 ,如下:

'(1)创建格式与字体的指针
formatHandle = xlBookAddFormat(lngbook, 0)
fontHandle = xlBookAddFont(lngbook, 0)

'(2)给对应指针赋值(以下仅写几个样式作为示例而已)
'(2-1)单元格右边边框线
Call xlFormatSetBorderRight(formatHandle, 1)
'(2-2)字体格式
Call xlFontSetBold(fontHandle, 1)               '字体加粗
Call xlFontSetSize(fontHandle, FontSizs)        '字体大小
Call xlFormatSetFont(formatHandle, fontHandle)  '字体格式赋值到单元格格式

'(3)将指针样式赋值给单元格
'lngsheet:当前Excel中某个sheet的指针
'lngRow:单元格行数
'lngCol:单元格列数
'sFormula:单元格Excel公式
Call xlSheetWriteFormula(lngsheet, lngRow, lngCol, sFormula, formatHandle)

顺着这个思路,做了第一次尝试。
只创建一个 formatHandlefontHandle 指针,然后每个单元格重置指针的赋值,也就是上述代码的步骤(2),测试数据都可以正常导出了,欣喜之余,看了看导出的内容,发现所有单元格样式全部被设置为最后一次赋值的样式了,看来此法行不通;

大体方向对了,格式却变样了,所以又做了第二次尝试。
每种样式只创建一个 formatHandlefontHandle 指针,将创建好的 formatHandle 指针存于一个字典 dicFmtHdl 中,这样就极大减少了创建的指针的数量,同时又保证了每个单元格的样式。这次终于成功了,样本数据均通过测试;

小结一下,每个单元格都创建一个指针的话,那么指针数量是巨大的,同种类型的使用同一个指针是最佳的方式。只要指针数量控制在一定范围内,那么就可以正常导出Excel。libxl 的作者没有处理栈空间不足的问题,可能觉得指针就该发挥指针最大的用途吧。但是对于没有指针,或者弱指针类型的语言开发者来说可能会有些不太友好,毕竟开发思路会有些许差异的,适应适应就好,一切都是为了效率嘛。

(3-2)自身问题的解决方案

众所周知,工作表表名sheetname被定义不得超过31个字符,并无字节的限制。这么说来,那么超过31个字符就导出失败,极有可能是libxl库的问题,测试结果如下:

  • 字母+数字<=31
  • 中文<16(可以感受出来,1个中文等于2个“位置”)

以上条件是可以导出的,中文最大只能是15个字符,这极度不合理呀,这样我们只能另辟蹊径了,除了新建sheet可以命名之外,我们还可以对sheet进行重命名。

新建sheet

Declare Function xlBookAddSheet Lib "lib4xl.dll" Alias "xlBookAddSheetA" (ByVal bookHandle As Long, ByVal name As String, ByVal sheetHandle As Long) As Long

sheetname重命名

Declare Sub xlSheetSetName Lib "lib4xl.dll" Alias "xlSheetSetNameA" (ByVal sheetHandle As Long, ByVal name As String)

于是,新建的时候采用“sheet+数字”,让其不大于31字符,然后再重命名成自己想要的中文名称,如下所示:

'(1)新建sheet,让其以“字母+数字”命名sheetname,并控制其不得大于31个字符
lngsheet = xlBookAddSheet(lngbook, h, 0)

'(2)对sheet一堆操作
'此处省略一万行代码

'(3)将其命名成中文,最大可以达到31个中文字符,或者中文+字母+数字总共不得超过31个字符;
Call xlSheetSetName(lngsheet, "自己想要的中文名称")

正所谓关上一扇门的同时也打开一扇窗,虽然接口函数 xlBookAddSheet 有点小问题,不过重命名函数 xlSheetSetName 还是可以扛住,样本数据测试通过,完美手工^ - ^


版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/130915267

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

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

相关文章

安装Hive

安装Hive 准备 安装Java环境&#xff1a;Hive需要Java环境支持&#xff0c;所以需要先安装Java。安装文档&#xff1a;http://t.csdn.cn/deBJu 安装MySQL数据库。http://t.csdn.cn/d24pN 下载Hive 下载Hive的二进制文件。 链接&#xff1a;https://pan.baidu.com/s/1fdg7…

ubuntu 22.04部署dzzoffice及安装onlyoffice插件

目录 一、配置阿里源 二、安装数据库 三、安装依赖组件 &#xff08;一&#xff09;安装php7.4 &#xff08;二&#xff09;安装apache2 四、下载 dzzoffice 五、安装dzzoffice 六、安装onlyoffice插件 &#xff08;一&#xff09;从github下载小胡版onlyoffice替代原来…

Spring MVC 的创建连接和使用

目录 前言&#xff1a; MVC 是什么&#xff1f; 1. Spring MVC 项目的创建和连接&#xff1a; 1.1 创建 1.2 连接 2. RequestMapping 注解使用详析&#xff1a; 2.1 指定请求类型&#xff1a; 2.1.1 指定 GET 请求 2.1.2 指定 POST 请求 3. 参数的获取与传递&#xff1a; 3.1 传…

若依微服务 + seata1.5.2版本分布式事务(安装配置nacos+部署)

若依官方使用的1.4.0版本seata&#xff0c;版本较低配置相对更麻烦一些 一、seata服务端下载&#xff0c;下载方式介绍两种入口&#xff0c;如下&#xff1a; 1、找到对应版本&#xff0c;下载 binary 即可。 下载包名为&#xff1a;seata-server-1.5.2.zip 2. github上下载 …

Stable Diffusion WebUI 本地安装教学

Stable diffusion AI的绘图工具&#xff0c;这是一种扩散模型&#xff0c;可以通过不断去噪来获得最终的艺术作品。这款工具是当前最受欢迎的AI绘图工具之一&#xff0c;不仅是还是开源的&#xff0c;而且其中的AUTOMATIC111 Stable-diffusion-webui版本深受AI绘图玩家的喜爱&a…

《统计学习方法》——条件随机场#习题解答#

引言 这是统计学习方法第十一章条件随机场的阅读笔记&#xff0c;包含所有公式的详细推导。 条件随机场(conditional random field,CRF)是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型&#xff0c;其特点是假设输出随机变量构成马尔可夫随机场。 建议先阅…

低学历又如何?我这样的程序员照样可以逆袭

今天分享的这个主题&#xff0c;很可能会带来争议&#xff0c;因为目前优秀毕业生0年就可以拿到 20K 的待遇&#xff0c;这里暂且抛开硕士&#xff0c;985&#xff0c;211的 Top 前几高学校本科生。 毕竟今天的主题的初衷是地点低的程序员如何才能 2-3 年实现 20K 的目的&…

naive-ui NPopconfirm怎么用vue3的h()渲染

先看效果 然后我先贴代码&#xff0c; 你们看懂的先运行下&#xff0c; 文章后面我教你怎么 添加这种有template&#xff0c;有slot插槽的组件 h(NPopconfirm,{positiveButtonProps: {size: tiny,color: #007293,bordered: true,},negativeButtonProps: {size: tiny,color: #…

k8s 基本架构

k8s 中支持的 node 数 和 pod 数 k8s 也是逐步发展过来的&#xff0c;来看看以前和现在支持的 node 数 和 pod 数对比 node 即 节点 &#xff0c; 早期的 k8s 版本能够支持 100 台节点&#xff0c;现在 k8s 可以支持到 2000 台了 pod 数&#xff0c;早期的版本可以支持 1000 …

CleanMyMacX4.13.4中文免费版mac电脑管家

CleanMyMac X这款软件集成清理、mac保护、速度优化维护、应用程序管理和文件管理5大功能&#xff0c;使用过程安全高效&#xff0c;用户不必担心误操作导致系统的崩溃。作为一款专业的mac电脑系统管家&#xff0c;CleanMymac X一直致力于更加智能、便捷地全方位维护我们的电脑&…

最近跳槽,压力真大...

前几天&#xff0c;跟个老朋友吃饭&#xff0c;他最近想跳槽去大厂&#xff0c;觉得压力很大&#xff0c;问我能不能分享些所谓的经验套路。 每次有这类请求&#xff0c;都觉得有些有趣&#xff0c;不知道你发现没有大家身边真的有很多人不知道怎么面试&#xff0c;也不知道怎…

数据库表的操作

目录 前言 1.创建表 2.查看表 2.1查看表结构 2.2查看表中插入的数据 3.修改表 4.删除表 总结 前言 前面已经介绍了对数据库的操作&#xff0c;今天我们介绍的是数据库表的操作&#xff0c;数据库表简单可以理解为存储数据的介质。有了这个认识之后&#xff0c;下面我们…

系统架构设计师 2:计算机基础

一、计算机硬件 1 处理器&#xff08;CPU&#xff09; 处理器是计算机系统运算和控制的核心部件。 1.1 指令集 处理器的指令集按照其复杂程度可分为复杂指令集&#xff08;CISC&#xff09;与精简指令集&#xff08;RISC&#xff09;。 随着研究的深入&#xff0c;RISC已经…

Python面向对象编程1-面向过程的简单纸牌游戏程序 项目1.6 完整的猜大小纸牌游戏

总项目目标&#xff1a;用面向过程思想设计一个简单的纸牌游戏程序&#xff0c;称为"Higher or Lower"&#xff08;高还是低&#xff09;。游戏中&#xff0c;玩家需要猜测接下来的一张牌是比当前牌高还是低。根据猜测的准确性&#xff0c;玩家可以得到或失去相应的积…

2024考研408-计算机组成原理第三章-存储系统

文章目录 前言一、存储器概述1.1、层次结构1.2、存储器分类1.2.1、层次分类1.2.2、存储介质分类1.2.3、存取方式1.2.4、按照信息的可更改性&#xff08;读写、只读区别&#xff09; 1.3、存储器性能指标知识回顾 二、主存储器2.1、主存储器的基本组成&#xff08;介绍DRAM&…

专业是要选软工还是人工智能?

大家好&#xff0c;我是帅地。 在帅地的训练营里&#xff0c;也有不少 26 届的学员&#xff0c;不过大一即将过去&#xff0c;部分学校是到了大一后面或者大二才开始细分专业方向的&#xff0c;包括一些想要转专业的同学&#xff0c;也需要选择一个细分的方向&#xff0c;而且…

Python基础知识进阶之数据爬虫

一、爬虫概述 爬虫是指利用网络抓取模块对某个网站或者某个应用中有价值的信息进行提取。还可以模拟用户在浏览器或者APP应用上的操作行为&#xff0c;实现程序自动化。简单来说就是我们把互联网有价值的信息都比喻成大的蜘蛛网&#xff0c;而各个节点就是存放的数据&#xff0…

Vue-Element-Admin项目学习笔记(7)用Node.js写一个简单后端接口

前情回顾&#xff1a; vue-element-admin项目学习笔记&#xff08;1&#xff09;安装、配置、启动项目 vue-element-admin项目学习笔记&#xff08;2&#xff09;main.js 文件分析 vue-element-admin项目学习笔记&#xff08;3&#xff09;路由分析一:静态路由 vue-element-adm…

黑苹果 或者 Mac 因 mds资源占用过高,导致频繁死机

开机后不久&#xff0c;风扇狂转&#xff0c;温度升高&#xff0c;然后死机&#xff0c;关机。 1. 使用 “Apple 诊断”测试 Mac 先看看硬件层面是否有问题。 使用“Apple 诊断”测试 Mac。 这款 Mac 的处理器是 Intel &#xff0c;开启 Mac&#xff0c;然后在 Mac 启动时立…

状态机编程实例-嵌套switch-case法

嵌入式软件开发中&#xff0c;状态机编程是一个比较实用的代码实现方式&#xff0c;特别适用于事件驱动的系统。 本篇&#xff0c;以一个炸弹拆除的小游戏为例&#xff0c;介绍状态机编程的思路。 C/C语言实现状态机编程的方式有很多&#xff0c;本篇先来介绍最简单最容易理解…