Excel工作簿 – 从C#读取大幅度缓慢?

正在尝试从Excel工作簿中读取,发现需要很长时间阅读3560行和7列约1分17秒的表。 我所做的只是遍历整个表格,并将这些值存储在一个列表中。

这是正常的,还是我做错了什么?

static void Main(string[] args) { List<string> testList = new List<string>(); Excel.Application excelApp = new Excel.Application(); Excel.Workbook workbook = excelApp.Workbooks.Open(@"C:\Users\rnewell\Desktop\FxData.xlsx"); Excel.Worksheet worksheet = workbook.Sheets[1]; Excel.Range range = worksheet.UsedRange; int rowCount = range.Rows.Count; int colCount = range.Columns.Count; int rowCounter = 1; int colCounter = 1; while (rowCounter < rowCount) { colCounter = 1; while (colCounter <= colCount) { //Console.Write(range.Cells[rowCounter, colCounter].Value2.ToString() + " "); testList.Add(range.Cells[rowCounter, colCounter].Value2.ToString()); colCounter++; } Console.WriteLine(); rowCounter++; } Console.ReadKey(); excelApp.Workbooks.Close(); } 

由于您正在从Open XML(* .xlsx)文件格式加载数据,因此我build议您使用Open XML SDK 。 它不会在后台启动Excel,这总是一件好事,特别是如果您需要非交互式地运行代码。

我还写了一篇关于访问Excel数据的不同方法的博客文章 ,您可能会发现它们很有用。

@TimWilliams的评论是正确的答案。 读取单个单元格需要读取任意大小的范围。 这是与COM层交谈的开销,并且您正在招数千次。 您应该将范围写入object[,] ,然后逐个访问该数组。

  int rowCount = range.Rows.Count; int colCount = range.Columns.Count; object[,] = range.Value2; int rowCounter = 1; int colCounter = 1; while (rowCounter < rowCount) { colCounter = 1; while (colCounter <= colCount) { // check for null? testList.Add(values[rowCounter, colCounter].ToString()); } } 

请注意,该数组将是基于一,而不是像普通的C#数组的零基础。 数据将从1到rowCount,从1到colCount,但行和列属性将返回rowCount和colCount,而不是1 + rowCount和1 + colCount。 如果你想写回数据,你可以使用一个从零开始的正确大小的数组(实际上你必须AFAIK,因为你不能创build一个基于数组),它会正常工作。

一般来说,这应该是几秒钟的事情。

但是,当您创build一个Excel本身的实例(包括其插件)时,可能需要很长时间才能初始化实例中的所有内容。

为了您的目的,您可以使用任何公共领域的Excel表单阅读库,不会启动Excel。