我有以下代码:
string result = "";
for(int i=2; i<=excelRange.Rows.Count; i++)
{
result += excelRange.Cells[i, 2].Value2;
}
对于具有数百个条目的excel文件,此过程需要5秒钟。是否有更有效的方法?我只想要B2到Bn的值。
答案 0 :(得分:4)
是的,有一种更有效的方法。
创建一个与您真正需要的单元格完全匹配的范围。
获取此范围的 Value2 属性。结果将是数组类型。
遍历数组
您的方法存在的问题是应用程序和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...