获取 Excel 文件中的所有工作表名称,可以通过 OleDbConnection 获取表架构

1. Microsoft.Jet.OLEDB.4.0 提供程序:
    用于支持 Excel 972003 (.xls) 文件格式。
    Extended Properties="Excel 8.0;HDR=YES;IMEX=1":Excel 8.0 表示 .xls 格式,HDR=YES 表示第一行作为列名,IMEX=1 用于处理混合数据类型的情况。

2. Microsoft.ACE.OLEDB.12.0 提供程序:
    用于支持 .xlsx 文件格式。

using System;
using System.Data;
using System.Data.OleDb;class ExcelSheetNames
{public static void Main(string[] args){// Excel文件的路径string fileName = "your_excel_file_path_here";  // 替换为实际文件路径string connString;// 根据文件格式选择连接字符串if (fileName.EndsWith(".xls")){connString = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source=" + fileName + ";" +"Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\";ReadOnly=True;";}else if (fileName.EndsWith(".xlsx")){connString = "Provider=Microsoft.ACE.OLEDB.12.0;" +"Data Source=" + fileName + ";" +"Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\";ReadOnly=True;";}else{Console.WriteLine("不支持的文件格式");return;}// 创建连接对象OleDbConnection objConn = new OleDbConnection(connString);try{// 尝试打开数据库连接objConn.Open();// 获取Excel文件中的数据表(工作表)信息DataTable dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);// 遍历DataTable,获取所有工作表的名称foreach (DataRow row in dt.Rows){// 读取表名,通常表名以 "$" 结尾string sheetName = row["TABLE_NAME"].ToString();// 输出工作表名称Console.WriteLine(sheetName);}}catch (Exception ex){Console.WriteLine("出现错误: " + ex.Message);}finally{// 关闭连接if (objConn.State == ConnectionState.Open){objConn.Close();}}}
}

使用 OpenXML 获取 Excel 文件中的工作表名称通常比通过 OleDbConnection 方式更高效,特别是当你只需要读取结构信息(如工作表名称)而不是整个数据表时。主要有以下几个原因:

 OpenXML 优势:
1. 轻量级和高效:OpenXML 不依赖于安装外部驱动程序(如 OLEDB 驱动),并且直接操作 Excel 文件的 XML 结构,因此更轻量,效率更高,特别是只获取工作表信息时。
2. 无文件锁定问题:OpenXML 以只读方式访问文件,不受 Excel 文件是否被打开的限制,不会遇到文件锁定的问题。
3. 不需要额外配置:使用 OleDbConnection 时,你需要考虑不同的连接字符串(如 Jet 和 ACE 提供程序),而 OpenXML 仅需要 .xlsx 文件格式(不支持 .xls)。
4. 跨平台支持:OpenXML 是纯托管代码,因此在不同平台上(如 Windows 和 Linux)都能运行,而 OLEDB 是 Windows 专有的技术。

 OpenXML 获取工作表名称示例代码:csharp

using System;
using DocumentFormat.OpenXml.Packaging;
using System.Linq;class ExcelSheetNames
{public static void Main(string[] args){// Excel文件的路径string fileName = "your_excel_file_path_here";  // 替换为实际文件路径try{// 打开Excel文档using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false)){// 获取工作簿的结构var workbookPart = document.WorkbookPart;// 遍历所有的工作表var sheets = workbookPart.Workbook.Sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>();foreach (var sheet in sheets){// 输出每个工作表的名称Console.WriteLine("Sheet Name: " + sheet.Name);}}}catch (Exception ex){Console.WriteLine("出现错误: " + ex.Message);}}
}


 代码说明:
1. SpreadsheetDocument.Open:通过 OpenXML 的 SpreadsheetDocument 打开 Excel 文件。这是一个只读操作(第二个参数为 false),所以即使文件被占用,也可以安全读取。
   
2. workbookPart.Workbook.Sheets:获取工作簿中的 Sheets 集合,包含所有的工作表信息。

3. 遍历工作表:每个 Sheet 对象有一个 Name 属性,表示工作表的名称。

4. 异常处理:捕获任何可能的异常,如文件路径错误、格式错误等。

 OpenXML vs OleDbConnection 性能比较:

 读取速度:如果只获取工作表名称,OpenXML 的速度通常更快,因为它直接解析文件的 XML 结构,而不需要创建复杂的数据库连接和查询。
  
 资源使用:OpenXML 是轻量级的库,内存和 CPU 占用更低,而 OleDbConnection 需要加载外部提供程序(如 ACE.OLEDB),相对较重。

 文件类型支持:OpenXML 仅支持 .xlsx 格式,不支持旧版本的 .xls 文件。如果你需要处理 .xls,则 OleDbConnection 是必要的。

 总结:
如果你只需要读取 .xlsx 文件的工作表名称,并希望避免文件锁定问题或配置复杂性,OpenXML 是更高效、可靠的选择。OleDbConnection 虽然功能强大,但主要适用于需要读取和操作数据的场景。

OleDbConnection 和 OpenXML 之间的效率差异取决于多个因素,包括你的操作场景、数据量以及使用方式。以下是对两者的效率分析,帮助理解在不同场景下的性能表现。

 1. OleDbConnection 性能分析
   
优点:
 处理复杂查询: 如果需要对 Excel 文件进行复杂的数据查询、过滤或聚合,OleDbConnection 的 SQL 查询能力会更有效率。你可以像查询数据库一样对 Excel 数据进行操作。
 支持 .xls 文件: OleDbConnection 可以处理早期的 .xls 格式文件,以及 .xlsx 格式。
  
缺点:
 外部依赖: 需要外部 OLEDB 驱动,可能存在驱动安装问题和兼容性问题,尤其是在不同系统环境下。
 开销较大: 打开连接时需要额外的系统资源开销,比如加载提供程序、创建数据库连接等。
 文件锁定问题: 如果文件被 Excel 打开,可能会遇到文件锁定,导致无法读取。
 效率较低: 对于仅需要读取元数据(如工作表名称)或轻量级的读取操作,OleDbConnection 的性能可能不如 OpenXML,因为它相当于模拟数据库查询,开销较大。

 2. OpenXML 性能分析

优点:
 高效读取元数据: OpenXML 直接读取 Excel 文件的 XML 结构,尤其是像获取工作表名称这种元数据操作,速度非常快,几乎没有多余的系统资源消耗。
 无外部依赖: 不需要依赖外部驱动或提供程序,避免了配置问题。
 无文件锁定问题: 可以在 Excel 文件被打开时以只读方式访问文件,避免文件锁定问题。
 轻量级: 适用于仅读取或操作 Excel 文件结构的场景,如读取工作表名称、读取单元格内容等。

缺点:
 只支持 .xlsx 文件: OpenXML 不支持 .xls 文件,只能用于处理基于 XML 的 Excel 文件格式(Office 2007 及更高版本的 .xlsx 文件)。
 无复杂查询功能: 不能像 OleDbConnection 一样使用 SQL 进行复杂的数据查询,OpenXML 只提供基础的文件读取和写入功能。

 3. 性能对比:实际场景

 读取工作表名称: 
   对于只需要获取 Excel 文件中的工作表名称,OpenXML 明显更快。因为 OpenXML 直接从文件的 XML 结构中读取工作表信息,省去了建立数据库连接的开销。而 OleDbConnection 需要建立连接、创建查询,并返回结果,这一过程相对慢。
  
 大数据量读取:
   如果需要从 Excel 中读取大量数据,OleDbConnection 和 OpenXML 的性能取决于数据操作方式。OleDbConnection 可以使用 SQL 进行筛选和聚合,因此在某些特定情况下可能表现更好。而 OpenXML 则直接从文件结构中逐行读取数据,适合批量导出,但没有高级查询功能。
  
 文件格式:
   如果你的文件是 .xls 格式(Excel 972003),OleDbConnection 是必要的,因为 OpenXML 不支持该格式。
   如果是 .xlsx 格式文件,OpenXML 通常在性能上表现更好,尤其是对于简单的读取操作。

 4. 定量性能差异示例

假设场景:从 Excel 文件中获取所有工作表名称,并且文件大小为几MB(中等大小)。

 OleDbConnection:
   初始化 OLEDB 提供程序并建立连接耗时约 100ms  200ms(具体时间取决于系统环境和驱动程序)。
   获取工作表名称的操作时间约为 几十毫秒(因为它需要执行 SQL 查询)。
  
 OpenXML:
   打开文件并直接读取工作表名称耗时约 10ms  50ms。因为不需要数据库连接和查询,OpenXML 更适合这种轻量级操作。

 5. 结论

 OpenXML 更快: 对于获取元数据(如工作表名称)或处理较小的 Excel 文件,OpenXML 在效率上显著优于 OleDbConnection,尤其是在不需要数据库功能的情况下。
 OleDbConnection 更强大: 在需要进行复杂的查询、筛选或聚合操作时,OleDbConnection 通过 SQL 查询功能可能更具优势,但这会增加性能开销。

 适用场景总结:
 简单读取(如获取工作表名称)或文件结构操作:OpenXML 是最佳选择,轻量且高效。
 需要对 .xls 和 .xlsx 文件进行兼容,或需要执行复杂查询:使用 OleDbConnection 较为合适,尽管它在性能上稍逊,但支持更多功能。

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

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

相关文章

图像分割-DeepLab

DeepLabV3源码链接&#xff1a;https://github.com/bubbliiiing/deeplabv3-plus-pytorch&#xff08;打不开私信我获取&#xff09; 一、简介 一般的模型如Unet一般用于医学领域&#xff0c;小目标&#xff0c;如细胞分割。 为了增大感受野&#xff08;从而更好的获得全局特征…

LeetCode 18.四数之和

LeetCode 18.四数之和 C 思路&#x1f9d0;&#xff1a; 由题意得&#xff0c;四个数组里面的整数相加需要得到target这个目标值&#xff0c;且结果不能重复&#xff0c;那么我们可以用排序双指针的方式进行解答&#xff0c;将该数组变为升序数组&#xff0c;然后固定左边两个数…

建站工具Halo

建站工具Halo 项目及文档快速体验启动成功 类似wordpress的建站工具&#xff0c;使用java技术栈Springboot开发&#xff0c;对java开发者友好。 项目及文档 https://github.com/halo-dev/halo 快速体验 为了快速体验&#xff0c;直接使用docker compose部署。也可在源码基础…

人工智能+医学

医学影响的内型&#xff1a;(X光片、计算机断层扫描、磁共振成像、超声波&#xff09; ITK snap医学图像读取 医学影像领域常见任务: 图像分类、语义分割、疾病预测、目标检测、图像配准、图像生成(应用少)、图像增强、生成放射学报告。 需要有很强的可解释…

指针进阶(三)(C 语言)

目录 一、回调函数二、快速排序函数 qsort1. qsort() 函数原型2. 使用 qsort() 函数 三、仿照 qsort 函数设计一个可以排序任意类型数组的冒泡函数1. 函数原型2. 函数设计思路 一、回调函数 在 C 语言中&#xff0c;回调函数是一种通过函数指针调用的函数&#xff0c;也就是一…

Spring Boot驱动的植物健康监测革命

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理植物健康系统的相关信息成为必然。开发合适…

软件测试学习笔记丨Selenium学习笔记:常用页面信息对比方法expected_conditions

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22514 本文为霍格沃兹测试开发学社的学习经历分享&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 说明&#xff1a;本篇博客基于sel…

开拓鸿蒙测试新境界,龙测科技引领自动化测试未来

在当今科技舞台上&#xff0c;鸿蒙 OS 以非凡先进性强势登场&#xff0c;打破传统操作系统格局&#xff0c;为软件测试领域带来全新机遇与艰巨挑战。 一、鸿蒙 OS 的辉煌崛起 &#xff08;一&#xff09;壮丽发展历程与卓越市场地位 鸿蒙 OS 的发展如波澜壮阔的史诗。2023 年…

JavaScript进阶:手写代码挑战(一)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript手写代码篇 #1024程序员节&#xff5c;征文# 在现代Web开发中&#xff0c…

中国移动机器人将投入养老场景;华为与APUS共筑AI医疗多场景应用

AgeTech News 一周行业大事件 华为与APUS合作&#xff0c;共筑AI医疗多场景应用 中国移动展出人形机器人&#xff0c;预计投入养老等场景 作为科技与奥富能签约&#xff0c;共拓智能适老化改造领域 天与养老与香港科技园&#xff0c;共探智慧养老新模式 中山大学合作中国…

[Python学习日记-53] Python 中的正则表达式模块 —— re

[Python学习日记-53] Python 中的正则表达式模块 —— re 简介 re 模块 练习 简介 我们在编程的时候经常会遇到想在一段文字当中找出电话号码、身份证号、身高、年龄之类的信息&#xff0c;就像下面的数据一样 # 文件名&#xff1a;美丽学姐联系方式.txt 姓名 地区 …

微信小程序美团点餐

引言&#xff1a;外卖已经成为了都市人的必备&#xff0c;在无数个来不及&#xff08;懒得&#xff09;做饭的时刻拯救孤单寂寞的胃。美团外卖无疑是外卖届的领头羊&#xff0c;它的很多功能与设计都值得我们学习。本文将从五个方面&#xff0c;对美团外卖展开产品分析&#xf…

【ArcGIS Pro实操第4期】绘制三维地图

【ArcGIS Pro实操第4期】绘制三维地图 ArcGIS Pro绘制三维地图-以DEM高程为例参考 如何使用ArcGIS Pro将栅格数据用三维的形式进行表达&#xff1f;在ArcGIS里可以使用ArcScene来实现&#xff0c;ArcGIS Pro实现原理跟ArcScene一致。由于Esri未来将不再对ArcGIS更新&#xff0c…

深入浅出神经网络:从基础原理到高级应用

第5章 神经网络 更加详细内容可以看这篇文章 5.1 神经元模型 神经网络的基本单元是神经元模型。神经元模拟了生物神经元的行为&#xff0c;通过接收输入信号&#xff0c;进行加权求和&#xff0c;然后经过激活函数输出结果。 数学上&#xff0c;一个简单的神经元可以表示为&…

pipeline开发笔记

pipeline开发笔记 jenkins常用插件Build Authorization Token Root配置GitLab的webhooks(钩子)配置构建触发器--示例 piblish over sshBlue OceanWorkspace Cleanup PluginGit插件PipelineLocalization: Chinese (Simplified) --中文显示Build Environment Plugin 显示构建过程…

ArcGIS 10.8 安装教程

目录 一、ArcGIS10.8二、安装链接三、安装教程四、ArcGIS实战 &#xff08;一&#xff09;ArcGIS10.8 1. 概述 ArcGIS 10.8是由美国Esri公司开发的GIS平台&#xff0c;用于处理、分析、显示和管理地理数据&#xff0c;并实现数据共享。它具有新特性和功能&#xff0c;性能更…

iOS MPNowPlayingInfoCenter 通知栏、锁屏 显示当前播放的媒体信息

前言 MPNowPlayingInfoCenter 是 iOS 框架 MediaPlayer 中的一个类&#xff0c;主要用于管理锁屏界面、控制中心、通知中心中显示的“当前播放”媒体信息。它允许开发者向用户展示正在播放的音乐或媒体信息&#xff0c;并控制媒体播放。 通过 MPNowPlayingInfoCenter&#xf…

新电脑Win11家庭中文版跳过联网激活方法(教程)

预装Win11家庭中文版的新电脑&#xff0c;如何跳过联网激活&#xff1b;由于微软限制必须要联网激活&#xff0c;需要使用已有的微软账户登入或者注册新的微软账户后才可以继续开机使用&#xff0c;Win11联网后系统会自动激活。下面介绍一下初次开机初始化电脑时如何跳过联网激…

猫咪掉毛还容易应激,哪款宠物空气净化器可以吸毛且低噪?

今年的双十一第一波优惠我没有抢&#xff0c;因为我在犹豫我真的必须要买宠物空气净化器&#xff0c;但是会不会有很多副作用等等问题&#xff0c;让我一直不敢下手。 一直犹豫买不买是因为我家养了一只爱掉毛的小猫咪&#xff0c;家里每天都是想着要清理猫咪掉下来的猫毛&…

又是一年 1024

今天是 1024 程序员节&#xff0c;现在是一名大数据讲师&#xff0c;我和往常一样&#xff0c;依旧在讲课中度过。对于很多程序员来说&#xff0c;这一天也许是属于代码、调试和无数行 SQL 查询的&#xff0c;而对于我来说&#xff0c;虽然工作内容不同&#xff0c;却也和数据、…