【问题标题】:C# Efficient way to iterate over excel worksheetC#迭代excel工作表的有效方法
【发布时间】:2018-12-02 19:36:01
【问题描述】:

我有以下代码:

string result = "";
for(int i=2; i<=excelRange.Rows.Count; i++)
{
    result += excelRange.Cells[i, 2].Value2;
}

对于包含几百个条目的 Excel 文件,这需要 5 秒。有没有更有效的方法,也许?我只想要从 B2 到 Bn 的值。

【问题讨论】:

  • 你想达到什么目的?连接所有单元格的值?
  • 我正在尝试从 B 列的单元格中获取所有值,但 B1 除外。我上面的例子只是初步的,但这就是目的。

标签: c# excel iteration


【解决方案1】:

是的,有一种更有效的方法。

  1. 创建一个与您真正需要的单元格完全匹配的范围。

  2. 获取此范围的 Value2 属性。结果将是一个数组类型。

  3. 遍历数组

您的方法的问题是您的应用程序和 Excel 之间存在大量进程间请求。您的方法需要每个单元格两个或三个请求。建议的方法要快得多,因为它需要预先提出一些请求,但不需要每个单元格额外的请求。

请注意,这最多适用于大约 4000 个单元格。如果您需要处理更多单元格,则需要将其拆分为多个范围,每个范围包含少于 4000 个单元格。

更新

假设 Excel 已经在运行,它看起来像这样(B 列中的正确行数会自动选择):

var excelApp =  (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet;
var range = (Excel.Range)workSheet.Range[workSheet.Range["B2"],
        workSheet.Range["B2"].End[Excel.XlDirection.xlDown]];
var cellData = (Object[,])range.Value2;

string result = "";
foreach (var cell in cellData) {
    result += cell.ToString();
}

【讨论】:

  • 为什么是 4000 个单元格?
  • 只有微软知道。这不是硬性限制。有时它可以达到 16,000。 4000 个细胞始终有效。
  • 你是什么意思作品?你是说,我不能用 100000 个项目迭代数组吗?
  • 谢谢。会试试的。
  • @JohnyL:如果您为超过 4000 个单元格的范围调用 Value2 属性,则会收到错误消息。对于较大的范围,您需要将其拆分为较小的范围并为每个子范围调用 Value2 属性。然后你有一个嵌套循环:在外部循环中,你执行进程间请求并一次检索 4000 个单元格,在内部循环中,你检索单元格数据(没有进程间通信)。
【解决方案2】:

基本骨架如下:

var xlApp = new Excel.Application { Visible = true };
var xlBook = xlApp.Workbooks.Open(@"C:\Temp\Results.xlsx");
var xlSheet = xlBook.Sheets[1] as Excel.Worksheet;
var arr = (object[,])xlSheet.Range["B2:B100000"].Value;
var sb = new StringBuilder();
for (int x = 1; x <= arr.GetUpperBound(0); ++x)
{
    sb.Append(arr[x, 1]);
}
var final_string = sb.ToString();

// Close workbook, close Excel...

【讨论】:

  • 这应该也可以,但我认为它不太优雅。不过还是谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 2022-10-19
  • 1970-01-01
相关资源
最近更新 更多