[英]How to read an Excel spreadsheet in c# quickly
我正在使用Microsoft.Office.Interop.Excel来读取内存中打开的电子表格。
gXlWs = (Microsoft.Office.Interop.Excel.Worksheet)gXlApp.ActiveWorkbook.ActiveSheet;
int NumCols = 7;
string[] Fields = new string[NumCols];
string input = null;
int NumRow = 2;
while (Convert.ToString(((Microsoft.Office.Interop.Excel.Range)gXlWs.Cells[NumRow, 1]).Value2) != null)
{
for (int c = 1; c <= NumCols; c++)
{
Fields[c-1] = Convert.ToString(((Microsoft.Office.Interop.Excel.Range)gXlWs.Cells[NumRow, c]).Value2);
}
NumRow++;
//Do my other processing
}
我有180,000行,结果非常慢。 我不确定“转换”是否有效。 反正我还能做得更快吗?
月亮
嗨,我找到了一个非常快的方法。
最好使用“get_range”一次读取整个数据。 这会将数据加载到内存中,我可以像普通数组一样遍历数据。
Microsoft.Office.Interop.Excel.Range range = gXlWs.get_Range("A1", "F188000");
object[,] values = (object[,])range.Value2;
int NumRow=1;
while (NumRow < values.GetLength(0))
{
for (int c = 1; c <= NumCols; c++)
{
Fields[c - 1] = Convert.ToString(values[NumRow, c]);
}
NumRow++;
}
有几个选项 - 都涉及一些额外的库:
OpenXML 2.0 (来自MS的免费库)可用于读取/修改.xlsx的内容,因此您可以根据需要使用它
一些(商业)第三方库带有网格控件,允许您在应用程序中使用excel文件(如Winforms / WPF / ASP.NET ...),如SpreadsheetGear , Aspose.Cells等。
我不确定“转换”是否有效。 反正我还能做得更快吗?
是什么让你相信这个? 我保证Convert.ToString()是您发布的代码中最有效的方法。 您的问题是您在Excel文档中循环180,000条记录...
您可以拆分工作,因为您知道要执行的行数。
为什么要将Value2完全转换为字符串?
使用OleDB
方法。 这是最快的如下;
string con =
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\temp\test.xls;" +
@"Extended Properties='Excel 8.0;HDR=Yes;'";
using(OleDbConnection connection = new OleDbConnection(con))
{
connection.Open();
OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", connection);
using(OleDbDataReader dr = command.ExecuteReader())
{
while(dr.Read())
{
var row1Col0 = dr[0];
Console.WriteLine(row1Col0);
}
}
}
我想这不是转换“减速”的来源......
实际上,检索单元格值非常慢。
我认为这种转换不是必要的:
(Microsoft.Office.Interop.Excel.Range)gXlWs
它应该没有它。
你可以直接问:
gXlWs.Cells[NumRow, 1].Value != null
尝试将整个范围或至少整行移动到对象Matrix并使用它而不是范围本身。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.