Как быстро читать электронную таблицу Excel на c #

Я использую Microsoft.Office.Interop.Excel 9X_excel для чтения электронной таблицы, открытой 9X_workbook в памяти.

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 строк, и это очень 9X_c#.net медленно. Я не уверен, что «Конвертировать» работает. Можно 9X_c# ли сделать это быстрее?

Луна

10
0
4
Общее количество ответов: 4

Ответ #1

Ответ на вопрос: Как быстро читать электронную таблицу Excel на c #

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

Лучше 9X_excel читать все данные за один раз, используя 9X_csharp get_range. Это загружает данные в память, и 9X_excel я могу перебирать их, как обычный массив.

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++;
}

29
1

  • @ user728630 Другой метод получения диапазона данных: `Excel.Excel.Range DataRan ...

Ответ #2

Ответ на вопрос: Как быстро читать электронную таблицу Excel на c #

Есть несколько вариантов - все требуют дополнительной 9X_.cs-file библиотеки:

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

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

4
2

  • @ManInMoon - тогда вам придется согласиться с тем, что чтение файла, ...

Ответ #3

Ответ на вопрос: Как быстро читать электронную таблицу Excel на c #

Я не уверен, что "Преобразование" работает 9X_c-sharp эффективно. В любом случае я мог бы сделать это 9X_c# быстрее?

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

Вы можете разделить 9X_.cs-file работу на части, так как знаете, сколько 9X_.cs-file рядов предстоит выполнить.

Почему вы закрываете 9X_ms-excel Value2 именно строкой?

1
1

  • @ManInMoon - Объясните, что вы имеете в виду под этим утверждением. Вы ведь понимаете, что ваш String [] ...

Ответ #4

Ответ на вопрос: Как быстро читать электронную таблицу Excel на c #

Я нашел действительно быстрый способ читать 9X_.cs-file в Excel по-своему. Мне нужно получить его 9X_ms-excel как двумерный массив строк. По-старому, с 9X_.cs-file действительно большим excel на это уходило 9X_c#-language около часа. Таким образом, я получаю свои 9X_c#.net значения за 20 секунд.

Я использую этот самородок: https://reposhub.com/dotnet/office/ExcelDataReader-ExcelDataReader.html

А 9X_c-sharp вот мой код:

DataSet result = null;
//https://reposhub.com/dotnet/office/ExcelDataReader-ExcelDataReader.html
using (var stream = File.Open(path, FileMode.Open, FileAccess.Read))
{
    // Auto-detect format, supports:
    //  - Binary Excel files (2.0-2003 format; *.xls)
    //  - OpenXml Excel files (2007 format; *.xlsx)
    using (var reader = ExcelReaderFactory.CreateReader(stream))
    {
        result = reader.AsDataSet();
    }
}

foreach (DataTable table in result.Tables)
{
    if (//my conditions)
    {
        continue;
    }

    var rows = table.AsEnumerable().ToArray();

    var dataTable = new string[table.Rows.Count][];//[table.Rows[0].ItemArray.Length];
    Parallel.For(0, rows.Length, new ParallelOptions { MaxDegreeOfParallelism = 8 },
        i =>
        {
            var row = rows[i];
            dataTable[i] = row.ItemArray.Select(x => x.ToString()).ToArray();                                    
        });

    importedList.Add(dataTable);
}

1
0