С# и Excel - Копирование диапазона ячеек в массив

263
04 апреля 2018, 08:04

Есть xls файл с большим количеством строк. Использую C#, библиотеку interop. Чтение происходит в виде создания списка объектов (один объект представляет одну строку) со свойствами a1, a2...a8, которые содержат значения столбцов данной строки. Затем следующая строка и т.д. циклом for, пока не встречу пустую строку. Затем с помощью этих объектов провожу анализ. Проблема в очень маленькой скорости считывания. В интернете советуют использовать EPPlus. Но, он работает с xlsx, у меня же xls. Руками, через ctrl+a, ctrl+v копирование большого количества ячеек на другой лист занимает всего пару сек. По аналогии, можно ли как-то выделить, скопировать весь диапазон заполненных ячеек в, допустим, двумерный массив и далее с ним уже работать? По идее, скорость на порядок увеличиться? Если да, как это сделать? Количество строк в разных файлах различно. Спасибо.

Мой фрагмент кода

//считываем ячейки, пока не встретим пустаю

   while (true)
        {
            excelcells = excelworksheet.get_Range("A" + row.ToString(), Type.Missing);
            if (excelcells.Value2 == null)
            {
                break;
            }
            excelcells = excelworksheet.get_Range("C" + row.ToString(), Type.Missing);
            int AA = Int32.Parse(excelcells.Value2.ToString());
            excelcells = excelworksheet.get_Range("H" + row.ToString(), Type.Missing);
            double BB = (double)excelcells.Value2;
            excelcells = excelworksheet.get_Range("I" + row.ToString(), Type.Missing);
            double CC = (double)excelcells.Value2;
            new ClassRs(AA, BB, CC);
            row++;
        }
Answer 1
  1. Открываете Excel через Interop, далее пересохраняете(конвертируете) в *.xlsx в какую-нибудь временную директорию. Пересохранение происходит почти моментально.

  2. Далее открываете новый файл черезEpPlus и со скоростью света читаете ячейки.

Проблема решена.

Единственный минус в том, что для первого шага понадобится interop.

Еще есть вариант с выделением Range на странице и вызовом метода Copy у Application. Тогда все это будет скопировано в буфер-обмена. Я посмотрел буфер через Free Clipboard Viewer и там есть html-представление=> парсить его можете, но лучше все таки первый мой вариант.

READ ALSO
C# Ошибка во время инициализации элементов объекта

C# Ошибка во время инициализации элементов объекта

ЗдравствуйтеВ программе я создаю несколько классов с наследованием

348
CSS Grid в 2018?

CSS Grid в 2018?

Недавно разобрался в CSS Grid, и понял что это лучшее для меня решение в плане позиционирования элементов

247
Как сделать такой эффект как на скриншоте с эффектом смещения?

Как сделать такой эффект как на скриншоте с эффектом смещения?

Хотелось бы реализовать такой эффект как на скрине :

317
Как разместить блок под блоком с абсолютным позиционированием

Как разместить блок под блоком с абсолютным позиционированием

Есть блок c position:absolute, нужно под ним разместить блок так, чтобы он не наплывал на предыдущий (не всхлопывался)При этом он должен быть в рамках...

301