我正在尝试从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();
}
Run Code Online (Sandbox Code Playgroud)
@TimWilliams的评论是正确的答案.读取单个单元格只需读取任何大小的范围即可.这是与COM层交谈的开销,而且你会招致数千次.您应该将范围写入a 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());
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,与普通的C#数组一样,该数组将基于一个而不是基于零.数据将从1到rowCount,从1到colCount,但Rows和Columns属性将返回rowCount和colCount,而不是1 + rowCount和1 + colCount.如果你想要回写数据,你可以使用正确大小的从零开始的数组(实际上你必须使用AFAIK,因为你不能创建一个基于单一的数组)并且它可以正常工作.
由于您是从Open XML(* .xlsx)文件格式加载数据,因此建议您使用Open XML SDK。它不会在后台启动Excel总是一件好事,特别是如果您需要非交互地运行代码时。
我还写了一篇关于在Excel中访问数据的不同方法的博客文章,您可能会觉得有用。
| 归档时间: |
|
| 查看次数: |
6215 次 |
| 最近记录: |