Как оптимизировать производительность создания рабочей книги в отношении ячеек с помощью Excel Interop? - PullRequest
0 голосов
/ 04 марта 2011

Резюме

Я написал оболочку Excel в .NET, используя Visual Basic и Visual Studio 2008.

Этот вопрос является продолжением моего квеста! = P Пожалуйста, ознакомьтесь с этими вопросами, прежде чем читать дальше.

  1. Как реализовать самоназначение столбца из его индекса? ;
  2. Как ускорить инициализацию этой пользовательской таблицы? ;
  3. Какую архитектуру использовать для устранения этой исключительной ситуации SystemOutOfMemoryException, позволяя мне создавать экземпляры ячеек листа? .

Я также консультировался по другим связанным вопросам по теме и нашел их довольно интересными:

A. Excel Interop - эффективность и производительность ;
B. Самый быстрый способ записи ячеек в Excel с помощью Office Interop? .

Гипотеза

Теперь я знаю, что ради производительности я не смогу идти своим чередом, как я ожидал от первого черновика.

Теперь я написал эту гипотезу, чтобы помочь мне:

  • После создания логической рабочей книги, то есть рабочей книги, которая еще не сохранена на жестком диске, мне не нужно сразу инициализировать ячейки;

Поскольку мне не нужно инициализировать ячейки, я мог бы просто инициализировать свой ReadOnlyDictionary (Of String, ICell) с пустыми ячейками при построении имен столбцов и инициализировать их в словарь.

При первом доступе к ячейке я мог просто проверить, инициализирована ли она, и инициализировать ее, когда это не так.

  • Когда книга создается на диске, у меня не может быть ячеек для инициализации, то есть я создаю файл на диске и возвращаю экземпляр созданного экземпляра интерфейса IWorkbook.

На самом деле, эта книга только что была создана и в ней еще нет значений. Следовательно, частичная инициализация словаря ячеек может снова стать подходящим вариантом.

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

В обоих первых сценариях использование массива объектов вне словаря ISheet.Cells интересно рассмотреть с точки зрения производительности, но кажется странным, говоря об объектно-ориентированном программировании, когда мы знаем, что ячейка должна знать о своем собственном существовании. , Именно это я и собирался сделать, используя внедрение зависимостей между интерфейсом Range Interop и классом Cell.

При таком подходе, как получить нативные ячейки со значением ячейки?

  • Именно при открытии рабочей книги я должен инициализировать ячейки Sheet.Cells с диапазонами, которые имеют значения.
  • Используемая ячейка содержит ненулевое значение;
  • Использованные ячейки возвращаются двумя возможными способами:
    я. Экземпляр интерфейса взаимодействия Range; II. Значения используемого диапазона могут быть получены в массиве двумерных объектов.

Архитектура и поведение мысли

Я думал о том, чтобы написать себе CellCollection или подобное, чтобы он был инициализирован с помощью двумерного массива, полученного из (object[,])NativeSheet.UsedRange.get_Value(XlRangeValueDataType.xlRangeValueDefault), а затем имел свойство, где я мог бы сделать вызов ячейке с ее адресом («A1»), который затем получит соответствующее значение из object[,] и вернет его. Когда дело доходит до форматирования данных, я мог бы просто вызвать соответствующий Range для одной или нескольких ячеек.

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

Вопросы

  • Каков наилучший способ оптимизировать эту архитектуру, сохраняя ее "чистой" в отношении ее объектно-ориентированного дизайна?

  • Существуют ли другие альтернативы, которые позволят мне сохранить доступность функции сотовой адресации при инвестировании в производительность?

Спасибо всем за вашу добрую и ценную помощь!

1 Ответ

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