Резюме
Я написал оболочку Excel в .NET, используя Visual Basic и Visual Studio 2008.
Этот вопрос является продолжением моего квеста! = P Пожалуйста, ознакомьтесь с этими вопросами, прежде чем читать дальше.
- Как реализовать самоназначение столбца из его индекса? ;
- Как ускорить инициализацию этой пользовательской таблицы? ;
- Какую архитектуру использовать для устранения этой исключительной ситуации 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
для одной или нескольких ячеек.
Эту мысль еще предстоит уточнить, и я все еще немного растерялся, объясняя ее. Если у вас есть какие-либо вопросы по этому поводу, пожалуйста, не стесняйтесь спрашивать, чтобы я сам мог все сделать тоньше и быстрее.
Вопросы
Каков наилучший способ оптимизировать эту архитектуру, сохраняя ее "чистой" в отношении ее объектно-ориентированного дизайна?
Существуют ли другие альтернативы, которые позволят мне сохранить доступность функции сотовой адресации при инвестировании в производительность?
Спасибо всем за вашу добрую и ценную помощь!