当前位置: 首页 > news >正文

【VB6|第23期】原来Jet.OLEDB也可以读取新版.xlsx的Excel文件

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


在这里插入图片描述


文章目录

  • 一、前言
  • 二、使用要求
  • 三、Jet.OLEDB读取旧版.xls格式的Excel
  • 四、Jet.OLEDB读取新版.xlsx格式的Excel
    • (4-1)前期绑定(静态绑定)
    • (4-2) 后期绑定(动态绑定)
    • (4-3)完整示例
  • 五、结束语


一、前言

上期文章《【VB6|第22期】用SQL的方式读取Excel数据》 介绍了通过 第三方库(Jet.OLEDB 读取 Excel 数据,读取了旧版 .xls 格式的 Excel 文件,对于新版我们留下了一个伏笔。

或许有人会建议考虑使用 Microsoft ACE OLEDB 提供程序来读取新版 .xlsx 格式的 Excel 文件。但是安装额外的程序,然后又因为 Excel 程序位数与额外程序位数等等兼容性问题,再调试来调试去的,显然对于用户来说不太友好,而且个人感觉很麻烦,所以本文不对此话题进行展开讨论。

本文主要讲解如何用 Jet.OLEDB 来读取新版 .xlsx 格式的 Excel 文件。话不多说,直接上教程。

二、使用要求

  • 安装了 MS Office 软件
  • 安装了最新版 WSP Office 软件

满足上述其中一条,我们就就有了实现 Jet.OLEDB 读取新版 .xlsx 格式的 Excel 文件 的基础。

三、Jet.OLEDB读取旧版.xls格式的Excel

在这里插入图片描述
在这里插入图片描述

示例代码:

Option Explicit
Private Sub CmdJet_Click()
On Error Resume Next
'函数说明:使用第三方库(Jet.OLEDB)读取Excel数据(.xls格式)
'创建作者:Commas
'创建时间:2023-08-06
'修改时间:
'------传参说明------
'------传参说明------'Excel文件的路径Dim sXLPath As String'sXLPath = App.Path & "\example.xlsx"sXLPath = App.Path & "\example.xls"' NO1:前期绑定(静态绑定)' 需要添加对Microsoft ActiveX Data Objects xx.x Library的引用(版本号根据ADO版本变化)Dim CN As New ADODB.ConnectionDim RS As New ADODB.Recordset' NO2:后期绑定(动态绑定)
'''    Dim CN As Object 'New ADODB.Connection
'''    Dim RS As Object 'New ADODB.Recordset
'''    Set CN = CreateObject("adodb.connection")
'''    Set RS = CreateObject("adodb.recordset")Dim CNStr As StringDim sqlQuery As String' 连接到Excel文件CNStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={path};Extended Properties=""Excel 8.0;HDR=Yes;"";"'CNStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={path};Extended Properties=""Excel 12.0;HDR=Yes;"";"CNStr = Replace(CNStr, "{path}", sXLPath)CN.Open CNStr' 构造SQL查询语句sqlQuery = "SELECT * FROM [Sheet1$A1:C5];"' 执行查询并将结果保存到记录集(Recordset)RS.Open sqlQuery, CN' 将数据读取到数组中Dim aryData() As VariantaryData = RS.GetRowsRS.CloseCN.Close'输出,获取二维数组的行数和列数Dim rows As Long, cols As Longrows = UBound(aryData, 1) + 1  ' 行数cols = UBound(aryData, 2) + 1 ' 列数' 遍历二维数组Dim i As Long, j As LongFor i = 0 To rows - 1For j = 0 To cols - 1' 访问二维数组中的元素Debug.Print "aryData(" & i & ", " & j & ") = " & aryData(i, j)Next jNext i
End Sub

返回结果:

aryData(0, 0) = 张三
aryData(0, 1) = 李小龙
aryData(0, 2) = 王五
aryData(0, 3) = 赵六
aryData(1, 0) = 技术部
aryData(1, 1) = 技术部
aryData(1, 2) = 市场部
aryData(1, 3) = 销售部
aryData(2, 0) = 18
aryData(2, 1) = 19
aryData(2, 2) = 20
aryData(2, 3) = 21

四、Jet.OLEDB读取新版.xlsx格式的Excel

实现的操作流程很简单,我们只需要在 三、Jet.OLEDB读取旧版.xls格式的Excel 的基础上,加上一个COM组件打开Excel就可以了。COM组件打开Excel 之前文章详细讨论过,这里就不再赘述,不清楚的小伙伴可以点击《【VB6|第19期】vb6通过COM组件操作Excel》查看,了解的小伙伴可以直接逃过看下文。

(4-1)前期绑定(静态绑定)

需要在工程引入中添加 Microsoft Excel xx.0 Object Library 的引用。

在这里插入图片描述

Dim XlApp As New Excel.Application
Dim XlBook As New Excel.WorkbookXlApp.Visible = False
Set XlBook = XlApp.Workbooks.Open(sXLPath)'嵌套 三、Jet.OLEDB读取旧版.xls格式的Excel 的代码
'实现SQL读取.xlsx和.xls格式的ExcelXlBook.Close
XlApp.Quit

(4-2) 后期绑定(动态绑定)

Dim XlApp As Object 'New Excel.Application
Dim XlBook As Object 'New Excel.WorkbookSet XlApp = VBA.CreateObject("Excel.Application")
XlApp.Visible = False
Set XlBook = XlApp.Workbooks.Open(sXLPath)'嵌套 三、Jet.OLEDB读取旧版.xls格式的Excel 的代码
'实现SQL读取.xlsx和.xls格式的ExcelXlBook.Close
XlApp.Quit

(4-3)完整示例

在这里插入图片描述
在这里插入图片描述
示例代码:

Private Sub CmdJetXLSX_Click()
On Error Resume Next
'函数说明:使用第三方库(Jet.OLEDB)读取Excel数据(.xls格式和.xlsx格式)
'创建作者:Commas
'创建时间:2023-08-08
'修改时间:
'------传参说明------
'------传参说明------'Excel文件的路径Dim sXLPath As StringsXLPath = App.Path & "\example.xlsx"'sXLPath = App.Path & "\example.xls"'======加上这个,就可以读取.xlsx格式的Excel文件啦======' NO1:前期绑定(静态绑定)
'''    Dim XlApp As New Excel.Application
'''    Dim XlBook As New Excel.Workbook' NO2:后期绑定(动态绑定)Dim XlApp As Object 'New Excel.ApplicationDim XlBook As Object 'New Excel.WorkbookSet XlApp = VBA.CreateObject("Excel.Application")XlApp.Visible = FalseSet XlBook = XlApp.Workbooks.Open(sXLPath)'======加上这个,就可以读取.xlsx格式的Excel文件啦======' NO1:前期绑定(静态绑定)' 需要添加对Microsoft ActiveX Data Objects xx.x Library的引用(版本号根据ADO版本变化)Dim CN As New ADODB.ConnectionDim RS As New ADODB.Recordset' NO2:后期绑定(动态绑定)
'''    Dim CN As Object 'New ADODB.Connection
'''    Dim RS As Object 'New ADODB.Recordset
'''    Set CN = CreateObject("adodb.connection")
'''    Set RS = CreateObject("adodb.recordset")Dim CNStr As StringDim sqlQuery As String' 连接到Excel文件CNStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={path};Extended Properties=""Excel 8.0;HDR=Yes;"";"'CNStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={path};Extended Properties=""Excel 12.0;HDR=Yes;"";"CNStr = Replace(CNStr, "{path}", sXLPath)CN.Open CNStr' 构造SQL查询语句sqlQuery = "SELECT * FROM [Sheet1$A1:C5];"' 执行查询并将结果保存到记录集(Recordset)RS.Open sqlQuery, CN' 将数据读取到数组中Dim aryData() As VariantaryData = RS.GetRowsRS.CloseCN.Close'======加上这个,就可以读取.xlsx格式的Excel文件啦======XlBook.CloseXlApp.Quit'======加上这个,就可以读取.xlsx格式的Excel文件啦======'输出,获取二维数组的行数和列数Dim rows As Long, cols As Longrows = UBound(aryData, 1) + 1  ' 行数cols = UBound(aryData, 2) + 1 ' 列数' 遍历二维数组Dim i As Long, j As LongFor i = 0 To rows - 1For j = 0 To cols - 1' 访问二维数组中的元素Debug.Print "aryData(" & i & ", " & j & ") = " & aryData(i, j)Next jNext i
End Sub

返回结果:

aryData(0, 0) = 张三
aryData(0, 1) = 李小龙
aryData(0, 2) = 王五
aryData(0, 3) = 赵六
aryData(1, 0) = 技术部
aryData(1, 1) = 技术部
aryData(1, 2) = 市场部
aryData(1, 3) = 销售部
aryData(2, 0) = 18
aryData(2, 1) = 19
aryData(2, 2) = 20
aryData(2, 3) = 21

五、结束语

经测试,用户只要安装 MS Office 或者 新版的 WPS Office,就可以用Jet.OLEDB 正常读取新版 .xlsxExcel 文件的数据啦。
本文也只是浅谈了一下使用教程,对原理感兴趣的小伙伴也可以继续研究微软的相关知识,或者大佬们也可以留言,为我们大家解惑。
编写教程不易,希望各位小伙伴可以给个赞,让更多的小伙伴可以看到,参与话题讨论中来。


参考文章:

  • 《Microsoft OLE DB Provider for Microsoft Jet》

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

相关文章:

【VB6|第23期】原来Jet.OLEDB也可以读取新版.xlsx的Excel文件

日期:2023年8月11日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xf…...

通过控制ros节点的启停,软实现人工控制和紧急停止功能的图示

通过控制ros节点的启停,软实现人工控制和紧急停止功能的图示 实现原理简介: 人工控制的节点: 键盘节点 方向盘节点 自动控制的节点: movebase 导航 autoware 等 底盘节点: 差速底盘 阿克曼底盘 控制节点&#xff1…...

面试热题(滑动窗口最大值)

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 输入:nums [1,3,-1,-3,5,3,6,7], k 3 输出:[3,3,5,…...

【代码】表格封装 + 高级查询 + 搜索 +分页器 (极简)

一、标题 查询条件按钮&#xff08;Header&#xff09; <!-- Header 标题搜索栏 --> <template><div><div class"header"><div class"h-left"><div class"title"><div class"desc-test">…...

ant.design 组件库中的 Tree 组件实现可搜索的树: React+and+ts

ant.design 组件库中的 Tree 组件实现可搜索的树&#xff0c;在这里我会详细介绍每个方法&#xff0c;以及容易踩坑的点。 效果图&#xff1a; 首先是要导入的文件 // React 自带的属性 import React, { useMemo, useState } from react; // antd 组件库中的&#xff0c;输入…...

Linux系统编程之信号(上)

一、信号概念 信号就是软件中断。每当程序收到一个信号&#xff0c;都需要按指定的方法去处理。以下是UNIX系统的信号表。 其中core表示产生一个复制了该进程内存映像的core文件&#xff0c;它保存了程序现场&#xff0c;可以使用gdb来调试。 二、signal() signal()函数用于改…...

23.Netty源码之内置解码器

highlight: arduino-light Netty内置的解码器 在前两节课我们介绍了 TCP 拆包/粘包的问题&#xff0c;以及如何使用 Netty 实现自定义协议的编解码。可以看到&#xff0c;网络通信的底层实现&#xff0c;Netty 都已经帮我们封装好了&#xff0c;我们只需要扩展 ChannelHandler …...

sigmoid ReLU 等激活函数总结

sigmoid ReLU sigoid和ReLU对比 1.sigmoid有梯度消失问题&#xff1a;当sigmoid的输出非常接近0或者1时&#xff0c;区域的梯度几乎为0&#xff0c;而ReLU在正区间的梯度总为1。如果Sigmoid没有正确初始化&#xff0c;它可能在正区间得到几乎为0的梯度。使模型无法有效训练。 …...

RabbitMQ 消息队列

文章目录 &#x1f370;有几个原因可以解释为什么要选择 RabbitMQ&#xff1a;&#x1f969;mq之间的对比&#x1f33d;RabbitMQ vs Apache Kafka&#x1f33d;RabbitMQ vs ActiveMQ&#x1f33d;RabbitMQ vs RocketMQ&#x1f33d;RabbitMQ vs Redis &#x1f969;linux docke…...

PHP实现在线进制转换器,10进制,2、4、8、16、32进制转换

1.接口文档 2.laravel实现代码 /*** 进制转换计算器* return \Illuminate\Http\JsonResponse*/public function binaryConvertCal(){$ten $this->request(ten);$two $this->request(two);$four $this->request(four);$eight $this->request(eight);$sixteen …...

报错 | Spring报错详解

Spring报错详解 一、前言二、报错提示三、分层解读1.最下面一层Caused by2.上一层Caused by3.最上层Caused by 四、总结五、解决方案 一、前言 本文主要是记录在初次学习Spring时遇到报错后的解读以及解决方案 二、报错提示 三、分层解读 遇到报错的时候&#xff0c;我们需要…...

PHP最简单自定义自己的框架数据库封装调用(五)

1、实现效果调用实现数据增删改查封装 2、index.php 入口定义数据库账号密码 <?php//定义当前请求模块 define("MODULE",index);//定义数据库 define(DB_HOST,localhost);//数据库地址 define(DB_DATABASE,aaa);//数据库 define(DB_USER,root);//数据库账号 def…...

使用Redis来实现点赞功能的基本思路

使用Redis来实现点赞功能是一种高效的选择&#xff0c;因为Redis是一个内存数据库&#xff0c;适用于处理高并发的数据操作。以下是一个基本的点赞功能在Redis中的设计示例&#xff1a; 假设我们有一个文章或帖子&#xff0c;用户可以对其进行点赞&#xff0c;取消点赞&#x…...

【黑马头条之app端文章搜索ES-MongoDB】

本笔记内容为黑马头条项目的app端文章搜索部分 目录 一、今日内容介绍 1、App端搜索-效果图 2、今日内容 二、搭建ElasticSearch环境 1、拉取镜像 2、创建容器 3、配置中文分词器 ik 4、使用postman测试 三、app端文章搜索 1、需求分析 2、思路分析 3、创建索引和…...

Nginx安装以及LVS-DR集群搭建

Nginx安装 1.环境准备 yum insatall -y make gcc gcc-c pcre-devel #pcre-devel -- pcre库 #安装openssl-devel yum install -y openssl-devel 2.tar安装包 3.解压软件包并创建软连接 tar -xf nginx-1.22.0.tar.gz -C /usr/local/ ln -s /usr/local/nginx-1.22.0/ /usr/local…...

后端开发9.商品类型模块

概述 简介 商品类型我设计的复杂了点,设计了多级类型 效果图 数据库设计...

spring框架自带的http工具RestTemplate用法

1. RestTemplate是什么&#xff1f; RestTemplate是由Spring框架提供的一个可用于应用中调用rest服务的类它简化了与http服务的通信方式。 RestTemplate是一个执行HTTP请求的同步阻塞式工具类&#xff0c;它仅仅只是在 HTTP 客户端库&#xff08;例如 JDK HttpURLConnection&a…...

【flink】Checkpoint expired before completing.

使用flink同步数据出现错误Checkpoint expired before completing. 11:32:34,455 WARN org.apache.flink.runtime.checkpoint.CheckpointFailureManager [Checkpoint Timer] - Failed to trigger or complete checkpoint 4 for job 1b1d41031ea45d15bdb3324004c2d749. (2 con…...

【论文阅读】NoDoze:使用自动来源分类对抗威胁警报疲劳(NDSS-2019)

NODOZE: Combatting Threat Alert Fatigue with Automated Provenance Triage 伊利诺伊大学芝加哥分校 Hassan W U, Guo S, Li D, et al. Nodoze: Combatting threat alert fatigue with automated provenance triage[C]//network and distributed systems security symposium.…...

【ARM64 常见汇编指令学习 16 -- ARM64 SMC 指令】

文章目录 ARMv8 同步异常同步异常指令SMC TYPE 上篇文章&#xff1a;ARM64 常见汇编指令学习 15 – ARM64 标志位的学习 下篇文章&#xff1a;ARM64 常见汇编指令学习 17 – ARM64 BFI 指令 ARMv8 同步异常 在ARMv8架构中&#xff0c;同步异常主要包括以下几种&#xff1a; Un…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...