Excel工作簿-从c#中读取非常慢
本文关键字:读取 非常 工作簿 Excel | 更新日期: 2023-09-27 18:16:40
正在尝试从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();
}
@TimWilliams的评论是正确答案。读取单个单元格所花费的时间与读取任意大小的区域所花费的时间一样长。这是与COM层进行通信的开销,并且您会产生数千次这样的开销。您应该将范围写入object[,]
,然后逐个单元访问该数组。
int rowCount = range.Rows.Count;
int colCount = range.Columns.Count;
object[,] values= 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());
}
}
请注意,该数组将是基于1的,而不是像普通c#数组那样基于0的。数据将从1到rowCount和从1到colCount,但是Rows和Columns属性将返回rowCount和colCount,而不是1 + rowCount和1 + colCount。如果你想回写数据,你可以使用一个大小合适的从零开始的数组(事实上你必须这样做,因为你不能创建一个基于一的数组),它会工作得很好。
既然您是从Open XML (*.xlsx)文件格式加载数据,我建议您使用Open XML SDK。它不会在后台启动Excel,这总是一件好事,特别是如果你需要非交互式地运行你的代码。
我还写了一篇关于在Excel中访问数据的不同方法的博文,你可能会觉得有用。
一般来说,这应该是几秒钟的问题。
但是当你创建一个Excel本身的实例时,它可能需要很长时间来初始化实例中的所有内容。
对于你的目的,你可以使用任何公共领域的excel表格阅读库,不启动excel。