Как эффективно извлечь все строки из больших документов Excel - PullRequest
0 голосов
/ 30 октября 2019

Таблицу 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 для копирования содержимого в буфер обмена, чтобы получить его оттуда. Однако это имеет некоторые ограничения и может, конечно, мешать пользователям, которые одновременно работают с буфером обмена. Поэтому мне интересно, есть ли лучшие подходы для решения этой проблемы производительности.

1 Ответ

0 голосов
/ 30 октября 2019

Вы можете использовать код ниже:

using (MSExcel.Application app = MSExcel.Application.CreateApplication()) 
{
    MSExcel.Workbook book1 = app.Workbooks.Open( this.txtOpen_FilePath.Text);
    MSExcel.Worksheet sheet = (MSExcel.Worksheet)book1.Worksheets[1];
    MSExcel.Range range = sheet.GetRange("A1", "F13");

    object value = range.Value; //the value is boxed two-dimensional array
}

Код предоставлен с этого поста . Он должен быть намного более эффективным, чем ваш код, но, возможно, не лучшим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...