C#迭代Excel工作表的有效方法

时间:2018-12-02 19:36:01

标签: c# excel iteration

我有以下代码:

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

对于具有数百个条目的excel文件,此过程需要5秒钟。是否有更有效的方法?我只想要B2到Bn的值。

2 个答案:

答案 0 :(得分:4)

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

  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();
}

答案 1 :(得分:1)

基本骨架如下:

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...