Самый быстрый способ получить доступ к данным / свойствам Excel из другого процесса с помощью .NET - PullRequest
1 голос
/ 11 января 2012

Самый быстрый способ взаимодействия между текущими (несохраненными) данными Excel и объектами C # предлагает очень глубокое обсуждение эффективного доступа к данным Excel.Согласно ответам, две рекомендации - использовать Excel-Dna или Add-in Express.

Я считаю, что Excel-Dna и Add-in Express обе должны работать как надстройка Excel.В моем случае бизнес-логика запускается в другом процессе и создает экземпляр Excel (New Excel.Application()).При изменениях в Excel необходимо обновить внутренние объекты.

Эффективно получить значения ячеек из Excel можно с помощью DirectCast(Range.Value, Object(,)).К сожалению, это невозможно для других свойств, таких как Range.Text или Range.NumberFormat.Как и ожидалось, итерация сквозных ячеек очень медленная.

Какой, по вашему мнению, самый эффективный способ доступа к данным Excel из основного процесса?Одна идея, которую я предложил, - добавить в Excel надстройку (используя, скажем, Excel-Dna), которая объединяет данные и затем отправляет их в основное приложение.Поскольку у меня нет большого опыта в распределении доменов между доменами, я был бы признателен за оценку, если это жизнеспособный подход или предпочтительнее другого.

Ответы [ 2 ]

0 голосов
/ 11 января 2012

Может быть, вы можете прочитать файл с помощью одного из прямых программ чтения файлов, вместо того, чтобы идти через Excel.(При необходимости вы можете автоматизировать Excel, чтобы сохранить файл или копию части файла.)

Для начала я предлагаю вам взглянуть на ClosedXML , но есть много похожихпроекты.ClosedXML выглядит как активный проект и пытается отразить интерфейс COM.[У меня нет никакого опыта с этим непосредственно.]

0 голосов
/ 11 января 2012

Получение числового формата из ряда ячеек по одной будет медленным с любой технологией (и медленнее с Interop), и я не знаю способа получить соответствующий массив различных числовых форматов свызов одной объектной модели.
Если ваши данные Excel представлены в кластерах форматов, вы можете использовать тот факт, что Range("C1:C4").Numberformat получит формат единого числа, если все ячейки в диапазоне имеют одинаковый числовой формат, но еслилюбой из числовых форматов в диапазоне отличается, вы получите Null

...