Фильтр нескольких столбцов Excel в взаимодействии С#

У меня есть два листа Excel в одном файле, каждый из которых содержит 5 столбцов. Данные в моем первом листе Excel уникальны. При этом второй лист может содержать дубликаты. Я фильтрую и сравниваю каждую запись на первом листе со всеми записями на втором листе. Данные на первом листе занимают несколько сотен записей, но данные на втором листе довольно велики, скажем, 200-300 тыс. Ручное сравнение путем фильтрации данных отнимает много времени.

Проблема: я пытаюсь автоматизировать эти multiple column filter критерии Excel в c# WinForms.

Что я пробовал: я думал, что Jagged Arrays справится с задачей, поэтому создал два файла Jagged Arrays. Каждый зубчатый массив заполняется динамически данными 1 листа. Таким образом, JaggedAry1 будет содержать данные из Sheet1 и JaggedAry2 из Sheet2. Если я не ошибаюсь, вероятно, зубчатые массивы будут выглядеть примерно так:

ДжаггедАри1:

Row 1           Name   Jim   Bob   Joe    
Row 2           Age    25    30    35
Row 3           ID     1AB   2C    2BE
Row 4           Addr   Ad1   Ad2   Ad3
Row 5           DOB    D1    D2    D3

ДжаггедАри2:

Row 1           Name   Jim   Bob   Joe    Jim   Bob   Jim    Joe   Bob   Sam    
Row 2           Age    25    30    35     25    32    35     25    30    35
Row 3           ID     1AB   2C    2BE    1AB   2C    2D     AB    2W    2E
Row 4           Addr   Ad1   Ad2   Ad3    Ad1   Ad2   Ad4    Ad5   Ad6   Ad7
Row 5           DOB    D1    D2    D3     D1    D2    D3     D3    D4    D5

Пример результата: если у меня есть данные двух организаций, Джим может быть именем нескольких человек и может иметь одинаковые идентификаторы. Если в sheet1 у меня есть имя сотрудника Джим, чей DOB датируется 25 января 1988 г. и с идентификатором = 2, то в sheet2 я хочу перечислить всех Джимов, чей DOB будет 25 января 1988 г. или позже, с одинаковыми идентификаторами, т.е. ID=2. Адрес может быть одинаковым или другим.

Я знаю, что могу сделать это с помощью foreach циклов, но я думаю, что для множественных сравнений потребуется много временных переменных. Вот я и подумал, может есть более простой способ?

Примечание. Я также попытался напрямую применить фильтр ко второму листу, используя Range Filter InteropExcel. Но это работает быстро только для небольших объемов данных. Файлы Excel с большими объемами данных отнимают много времени.

Было бы очень здорово, если бы кто-то мог указать мне в правильном направлении. Заранее спасибо.


person Raj    schedule 31.05.2020    source источник
comment
в любом случае с 200k-300k строк у нас будет много времени на чтение....   -  person Frenchy    schedule 09.06.2020


Ответы (1)


поэтому у Excel есть свои ограничения, с 300 тыс. строк, возможно, будет интересно перейти на базу данных sql.

Но если вы не планируете это решение и сохраните Excel, я предлагаю вам использовать ExcelDataReader для чтения ваших больших файлов Excel. файл и работать с Linq/LinqToSql для фильтрации ваших данных. ExcelDataReader отлично подходит для быстрого чтения больших файлов.

Во втором подходе либо у вас есть память для загрузки всех данных, вы можете работать с ней после загрузки. Если нет, нет другого решения для проверки каждого элемента перед загрузкой того, что вы хотите сохранить

person Frenchy    schedule 09.06.2020