Как эффективно извлечь все строки из больших документов excel
Электронная таблица Excel должна быть прочитана с помощью файла .NET. Очень эффективно считывать все значения из активного диапазона с помощью этого свойства
Value
При этом все значения передаются в двумерный массив одним вызовом в Excel.Однако чтение строк невозможно для диапазона, содержащего более одной ячейки. Для этого мы должны перебрать все ячейки и использовать
Text
собственность. Это показывает очень плохую производительность для более крупного документа.Причина использования строк, а не значений, заключается в том, чтобы получить правильный формат (например, для дат или количества цифр).
Вот пример кода, написанного на C#, чтобы продемонстрировать этот подход.
static void Main(string[] args) { Excel.Application xlApp = (Excel.Application)System.Runtime.InteropServices.Marshal. GetActiveObject("Excel.Application"); var worksheet = xlApp.ActiveSheet; var cells = worksheet.UsedRange(); // read all values in array -> fast object[,] arrayValues = cells.Value; // create array for text of the same extension object[,] arrayText = (object[,])Array.CreateInstance(typeof(object), new int[] { arrayValues.GetUpperBound(0), arrayValues.GetUpperBound(1) }, new int[] { arrayValues.GetLowerBound(0), arrayValues.GetLowerBound(1) }); // read text for each cell -> slow for (int row = arrayValues.GetUpperBound(0); row <= arrayValues.GetUpperBound(0); ++row) { for (int col = arrayValues.GetUpperBound(0); col <= arrayValues.GetUpperBound(1); ++col) { object obj = cells[row, col].Text; arrayText[row, col] = obj; } } }
Вопрос в том, существует ли более эффективный способ считывания полного содержимого строки из документа Excel.
Что я уже пробовал:
Одна идея состояла в том, чтобы использовать
cells.Copy
чтобы скопировать содержимое в буфер обмена, чтобы получить его оттуда. Однако это имеет некоторые ограничения и, конечно, может помешать пользователям, которые одновременно работают с буфером обмена.
EricERankin
Excel Interop не известен своей эффективностью, это оболочка для графического интерфейса приложения, поэтому производительность иногда может быть сомнительной, особенно в случае больших файлов.
Если вы можете изменить свой подход, то вот альтернатива, которая использует GemBox.Spreadsheet для быстрого извлечения всех отформатированных значений ячеек:
----
var workbook = ExcelFile.Нагрузка("input.xlsx");
ВАР лист = книга.Рабочий лист.ActiveWorksheet;
интервал количество строк = таблица.Строк.Рассчитывать;
int columnCount = рабочий лист.CalculateMaxUsedColumns();
строка[,] значения = новая строка[количество строк столбца количество];
for (int r = 0; r < rowCount; r++)
for (int j = 0; j < columnCount; j++)
значения[r, j] = рабочий лист.Ячейки[r, j].GetFormattedValue();
----
Кроме того, вот еще один пример для чтение файлов Excel с языка C# в чистый и эффективный путь.