Как быстро читать электронную таблицу 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# ли сделать это быстрее?
Луна
Ответ #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++; }
- @ 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 и т. д.
- @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 именно строкой?
- @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); }
-
33
-
8
-
4
-
2
-
4
-
3
-
6
-
3
-
5
-
6
-
2
-
2
-
4
-
3
-
3
-
10
-
7
-
2
-
11
-
5
-
3
-
1
-
2
-
2
-
5
-
2
-
2
-
4
-
3
-
10
-
5
-
2
-
2
-
3
-
6
-
1
-
2
-
2
-
5
-
2
-
8
-
3
-
8
-
3
-
4
-
2
-
6
-
3
-
1
-
2