繁体   English   中英

如何快速阅读c#中的Excel电子表格

[英]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 ...),如SpreadsheetGearAspose.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM