Как быстро читать электронную таблицу 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