achimschoen Ответов: 1

Как эффективно извлечь все строки из больших документов 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# в чистый и эффективный путь.

1 Ответов

Рейтинг:
12

RickZeeland

Может быть, вы можете использовать get_Range(), видеть: Как быстро прочитать электронную таблицу Excel на c# - переполнение стека[^]

Я использую диапазон по следующей строке: var cells = worksheet.UsedRange();

Пример при переполнении стека использует .Value как я сделал в своем примере, чтобы показать, что это работает быстро. После этого is преобразует объект в строку. Это, конечно, не включает форматы в Excel, поэтому он не соответствует требованиям.