2016-12-26 4 views
2

Я использую C# VSTO и Interop lib для разработки надстройки excel. для проверки значения каждой ячейки, прежде чем вставлять эти значения в другую книгу с форматированием. Мой фактический запрос состоит в том, чтобы обрабатывать (как можно быстрее) ячейки с некоторыми критериями.Обработка больших файлов Excel с использованием нескольких потоков

Я использовал WorkSheet.Cells.SpecialCells() для получения Excel.Range объектов моего интереса и использования потоков для обработки Excel.Range (который возвращается SpecialCells()) одновременно. После являются некоторые из замечаний/вопросов:

  1. кажется Excel.Range не может быть разделена на основе смещения и длины (т.е. я не могу получить новый объект Range из существующего диапазона на основе некоторых смещения и количество)
  2. Если мы разделили объект диапазона в потоках и попытались обработать ячейки в разных партиях, мы получим следующее исключение: «Фильтр сообщений показал, что приложение занято. (Исключение из HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER))« Это также оставляет эту партию клеток необработанной.

Любые вводы или указатели для решения вышеупомянутых проблем были бы полезными. Также любые предложения по обработке больших файлов excel быстро, скажем, в секундах (сейчас это самая большая бутылочная горловина)

+1

Я ожидаю, что содержимое COM, которое происходит в этих вызовах объектов Range, не похоже на несколько потоков. Если требуется только чтение и запись на новый рабочий лист, возможно, посмотрите на [OpenXML SDK] (https://msdn.microsoft.com/en-us/library/office/bb448854.aspx) или полностью управляемый C# Библиотека Excel, такая как [EPPLUS] (http://epplus.codeplex.com/) – rene

+0

Спасибо за информацию. , .. Я рассмотрю оба варианта: –

ответ

2

Excel - по существу однопоточное приложение (технически COM-объекты живут в однопоточной квартире). Это означает, что любой COM-доступ автоматически сортируется по основному потоку, поэтому нет никакой пользы в использовании дополнительного потока для выполнения COM-вызовов.

Для вашего случая использования имеет смысл получить весь массив данных в одном вызове до Range.Value, а затем обработать этот массив без дополнительных вызовов COM.

Вы можете также взглянуть на this question на идеи о том, как быстро считывать и записывать данные диапазона, в том числе пример использования API Excel C.

Другой подход - прочитать файл данных Excel напрямую, не взаимодействуя с приложением Excel. Для этого вы можете использовать обложку высокого уровня по файлу формата xml, например ClosedXML.

+0

Спасибо за указатели и информацию COM. Я буду обновлять обработку соответственно. Поскольку предложенный массив будет работать в моем случае. –

 Смежные вопросы

  • Нет связанных вопросов^_^