Как быстро читать электронную таблицу Excel в C # - PullRequest
6 голосов
/ 30 сентября 2011

Я использую 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 строк, и это оказывается очень медленным.Я не уверен, что «Преобразование» эффективно.Есть ли в любом случае, я мог бы сделать это быстрее?

Луна

Ответы [ 5 ]

22 голосов
/ 01 октября 2011

Привет, я нашел очень быстрый способ.

Лучше прочитать все данные за один раз, используя 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++;
}
3 голосов
/ 30 сентября 2011

Есть несколько опций - все задействуют дополнительную библиотеку:

  • OpenXML 2.0 (бесплатная библиотека от MS) может использоваться для чтения / изменения содержимого .xlsx, чтобы вы могли делать с ним все, что хотите

  • некоторые (коммерческие) сторонние библиотеки поставляются с элементами управления сеткой, что позволяет вам делать гораздо больше с файлами Excel в вашем приложении (будь то Winforms / WPF / ASP.NET ...), например SpreadsheetGear , Aspose.Cells и т. Д.

1 голос
/ 30 сентября 2011

Я не уверен, что «Преобразование» эффективно.Могу ли я в любом случае сделать это быстрее?

Что заставляет вас в это верить?Я обещаю вам, что Convert.ToString () - самый эффективный метод в коде, который вы разместили.Ваша проблема в том, что вы перебираете 180 000 записей в документе Excel ...

Вы можете разделить работу, так как знаете номер строки, которую нужно выполнить тривиально.

Почему выточно покрывает Value2 в строку?

0 голосов
/ 14 июня 2019

Используйте метод 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);
         }
    }
}
0 голосов
/ 30 сентября 2011

Полагаю, это не преобразование источника "замедления" ...

На самом деле получение значений в ячейке происходит очень медленно.

Я думаю, что это преобразование не является необходимым:

(Microsoft.Office.Interop.Excel.Range)gXlWs

Это должно работать без этого.

И вы можете прямо спросить:

gXlWs.Cells[NumRow, 1].Value != null

Попробуйте переместить весь диапазон или, по крайней мере, всю строку в матрицу объектов и работать с ней вместо самого диапазона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...