使用 C# 枚举 Excel 工作簿中单元格的有效方法

2024-01-10

枚举工作簿中每个工作表中的每个单元格的最有效方法是什么?

对于包含约 130,000 个单元格的工作簿,下面的方法似乎相当有效。在我的机器上,打开文件大约需要 26 秒,枚举单元大约需要 5 秒。不过,我不是 Excel 专家,并且希望与更广泛的社区一起验证此代码片段。

DateTime timer = DateTime.Now;
Microsoft.Office.Interop.Excel.Application excelApplication = new Microsoft.Office.Interop.Excel.Application();
try
{
    exampleFile = new FileInfo(Path.Combine(System.Environment.CurrentDirectory, "Large.xlsx"));
    excelApplication.Workbooks.Open(exampleFile.FullName, false, false, missing, missing, missing, true, missing, missing, true, missing, missing, missing, missing, missing);
    Console.WriteLine(string.Format("Took {0} seconds to open file", (DateTime.Now - timer).Seconds.ToString()));

    timer = DateTime.Now;
    foreach(Workbook workbook in excelApplication.Workbooks)
    {
            foreach(Worksheet sheet in workbook.Sheets)
            {
            int i = 0, iRowMax, iColMax;
            string data = String.Empty;

            Object[,] rangeData = (System.Object[,]) sheet.UsedRange.Cells.get_Value(missing);

            if (rangeData != null)
            {
                iRowMax = rangeData.GetUpperBound(0);                       
                iColMax = rangeData.GetUpperBound(1);                                                       

                for (int iRow = 1; iRow < iRowMax; iRow++)
                {
                        for(int iCol = 1; iCol < iColMax; iCol++)
                    {
                        data = rangeData[iRow, iCol] != null ? rangeData[iRow, iCol].ToString() : string.Empty;
                        if (i % 100 == 0)
                        {
                            Console.WriteLine(String.Format("Processed {0} cells.", i));
                        }

                        i++;
                    }                                                                                                   
                }   
            }
        }

        workbook.Close(false, missing, missing);
    }

    Console.WriteLine(string.Format("Took {0} seconds to parse file", (DateTime.Now - timer).Seconds.ToString()));              
    }
    finally
    {
        excelApplication.Workbooks.Close();             
        excelApplication.Quit();                  
    }                   

Edit:

值得一提的是,我想使用 PIA 和互操作来访问 Excel 工作簿的属性,这些属性不是由直接与 Excel 文件一起使用的 API 公开的。


当您逐个单元格执行操作时,Excel PIA Interop 非常慢。

您应该选择要提取的范围,就像您对Worksheet.UsedRange属性,然后通过调用一步读取整个范围的值get_Value()(或者只是简单地阅读Value or Value2属性,我不记得是哪一个)了。

这将产生一个object[,],即二维数组,可以轻松枚举并且快速读取。

EDIT:我刚刚阅读了您的实际代码,并意识到它实际上按照我的建议进行。为我在回答之前没有正确阅读问题而感到羞耻。在这种情况下,你无法让它变得更快。 Excel PIA 互操作速度很慢。如果您需要更快的解决方案,则必须将 jExcelApi 从 Java 迁移到 C#(这不是一件非常困难的事情)或使用一些商业组件。我建议不惜一切代价避免使用 OLEDB 接口,以保持理智。

不相关但有用的提示:您应该使用 ??操作员。真的很方便。代替

data = rangeData[iRow, iCol] != null ? rangeData[iRow, iCol].ToString() : string.Empty;

你可以写

data = Convert.ToString(rangeData[iRow, iCol]) ?? string.Empty;

在这种情况下,甚至不需要 String.Empty,因为Convert.ToString(对象) http://msdn.microsoft.com/en-us/library/astxcyeh.aspx皈依者null无论如何都是一个空字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 C# 枚举 Excel 工作簿中单元格的有效方法 的相关文章

  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • Django 检索 S3 存储桶中的文件列表

    我目前正在研究 django 与 S3 交互的方式 我发现 boto 库很有帮助 但有兴趣创建一个函数来返回特定存储桶内的文件列表的名称 因此我可以循环遍历并仅下载通过特定目录的文件的一部分 import boto from boto s3
  • Python 中的字符串连接与字符串替换

    在 Python 中 我不知道何时何地使用字符串连接与字符串替换 由于字符串连接在性能上有了很大的提升 这 变得更加 是一种风格决定而不是实际决定吗 举一个具体的例子 应该如何处理灵活 URI 的构造 DOMAIN http stackov
  • 如何在powershell的提升模式下执行命令集

    我尝试了以下方法在管理员模式下执行命令 PS gt start process powershell verb runas app Get AppxPackage all Where Object Name like ReleaseName
  • OpenRasta 入门 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 您好 有人可以建议开始使用 OpenRasta 的方法吗 也许是文章 教程 示例应用程序和文档 有一些博客文章 OpenRasta简介 h
  • $.post 和 $.ajax 之间的区别?

    很好奇是否有人知道数据参数有什么区别 我有一个 post方法需要一个 myform serialize 作为我的数据参数并且有效 如果我尝试使用相同的 ajax 方法 它不起作用 因为我的数据参数看起来不正确 有谁知道其中的区别以及我可以用
  • 如果这些容器属于不同的层,那么每个应用程序拥有许多 Castle Windsor 容器是否正确?

    我最近一直在玩温莎城堡 并意识到我可以用它来支持我目前已经使用的类似容器的对象 到目前为止 我只阅读了有关每个应用程序只有一个容器实例的应用程序的信息 如果这些容器属于不同的层 那么每个应用程序有许多容器是否正确 我问这个问题的原因是因为我
  • 如何根据R中行之间的日期差异过滤行?

    每个内id 我想保留至少相隔 91 天的行 在我的数据框中df below id 1有 5 行并且id 2有 1 行 For id 1 我想只保留第一 第三和第五行 这是因为如果我们比较第一个日期和第二个日期 它们相差 32 天 因此 删除
  • 将属性添加到类型而不是类型实例的隐式转换

    我正在阅读一些较旧的 Scala 帖子 以更好地理解类型类 然后我运行了 穿过this one https stackoverflow com questions 8524878 implicit conversion vs type cl
  • 在 HTML 中调用 Google Apps 脚本函数

    我担任一支运动队的教练并为其建立了一个网站 我想在管理页面添加一个按钮 单击该按钮即可快速向团队中的每个人发送电子邮件 这封电子邮件的内容如下 今天的日程安排已更改 请访问网站了解更多信息 我确信通过 Outlook 中的通讯组列表或其他东
  • Android:PhoneLookup 的目录数据提供程序

    我正在编写一个自定义 Android 联系人目录 我已经实现了 ContactsContract Directory 提供程序 并且从手机应用程序中进行搜索工作正常 我现在面临的问题是 当我有来电 去电时 Android 拨号器不会查询我注
  • 使用 pywinauto 检查复选框不起作用

    我从 pip 安装了最后一个 pywinauto 模块 我不知道如何使用 Check UnCheck GetCheckState 方法 这是我非常简单的代码示例 from pywinauto import application Start
  • 测试 numpy 数组中的每个元素是否位于两个值之间的简单方法?

    我想知道是否有一种语法上简单的方法来检查 numpy 数组中的每个元素是否位于两个数字之间 换句话说 就像numpy array 1 2 3 4 5 lt 5将返回array True True True True False 我想知道是否
  • antlr 文字字符串匹配:我做错了什么?

    我已经使用antlr 3天了 我可以解析表达式 编写侦听器 解释解析树 这是梦想成真 但后来我尝试匹配文字字符串 foo 但失败了 我可以找到很多声称可以做到这一点的例子 我都试过了 所以我创建了一个小项目来匹配文字字符串 我一定是在做一些
  • C#:如何将DLL嵌入到资源文件中(程序目录中没有DLL副本)

    我有一个需要 X dll 的 C 应用程序 项目 A 我已经将生成X dll的项目添加到A中作为Visual Studio中的参考 我还将 X dll 的发布版本作为二进制文件添加到 A 中的资源文件中 我已经告诉A项目了not将 X dl
  • 在 R 中合并列

    我想使用 R 将数据框的两列合并为一长列 下面有一个可重现的数据 data lt data frame x c 4 5 6 7 7 7 y c 3 4 5 6 7 7 data x y 1 4 3 2 5 4 3 6 5 4 7 6 5 7
  • Waypoint npm - 错误:无法解析“waypoint”

    我有一个 vue 项目并安装了 waypoints npm install waypoints 我尝试导入它 import waypoint from waypoints 但出现错误 错误 无法解析 Mypath 中的 路径点 我究竟做错了
  • 我需要服务器向所有客户端发送消息(Python、套接字)

    这是我的服务器程序 它如何将从每个客户端接收到的数据发送到每个其他客户端 import socket import os from threading import Thread import thread def listener cli
  • '#' 在 Mocha 中有特殊含义吗?

    describe indexOf it doSth 在 Mocha 中有特殊含义吗 什么是describe and it实际上呢 抱歉 没有找到相关文档describe and it describe and it遵循一种称为BDD 意思是
  • 使用 Zend 框架 2 未在 JSON 中呈现 404 HTTP 错误

    我正在使用 zend Framework2 创建一个简单的 Restful api 并且我参考了 Rob Allen 关于该主题的注释以及 http hounddog github com blog getting started with
  • 使用 C# 枚举 Excel 工作簿中单元格的有效方法

    枚举工作簿中每个工作表中的每个单元格的最有效方法是什么 对于包含约 130 000 个单元格的工作簿 下面的方法似乎相当有效 在我的机器上 打开文件大约需要 26 秒 枚举单元大约需要 5 秒 不过 我不是 Excel 专家 并且希望与更广