【发布时间】:2011-07-09 02:28:32
【问题描述】:
总结
我使用 Visual Basic 和 Visual Studio 2008 在 .NET 中编写了一个 Excel 包装器。
这个问题是我追求的延续! =P 在您进一步阅读之前,请注意这些问题。
- How to implement column self-naming from its index?;
- How to make this custom worksheet initialization faster?;
- What architecture to use to address this SystemOutOfMemoryException while allowing me to instantiate the cells of a sheet?。
我还咨询了有关该主题的其他相关问题,发现这些非常有趣:
A. Excel Interop - Efficiency and performance;
B.Fastest way to write cells to Excel with Office Interop?.
假设
我现在知道,出于性能考虑,我无法按照我在初稿中的预期行事。
现在,我写下这些假设来帮助我完成:
- 创建逻辑工作簿后,即尚未保存在硬盘上的工作簿,我不需要立即初始化单元格;
由于我不需要初始化单元格,我可以简单地使用空单元格初始化我的 ReadOnlyDictionary(Of String, ICell),同时构建列名并将它们初始化到字典中。
在第一次访问单元格时,我可以简单地检查它是否已初始化,并在未初始化时对其进行初始化。
- 在磁盘上创建工作簿时,我可以没有要初始化的单元格,即在磁盘上创建文件,并返回创建的 IWorkbook 接口实例的实例。
事实上,这个工作簿刚刚创建,还没有任何值。因此,单元格字典的部分初始化可能再次成为可行的方法。
另外,假设我必须为单元格设置值,我知道如果我简单地使用包含我必须将单元格设置为的值的二维数组,它会变得更快。
在第一种情况下,考虑使用 ISheet.Cells 字典之外的对象数组来提高性能是很有趣的,但在谈到面向对象编程时,当我们知道一个单元应该知道它自己的存在时,这似乎很奇怪.这就是我在 Range 互操作接口和 Cell 类之间使用依赖注入时打算做的事情。
在这种方法中,如何用一个单元格值来匹配原生单元格?
- 在打开工作簿时,我必须使用具有值的 Ranges 初始化 Sheet.Cells。
- 使用的单元格包含非空值;
- 使用的单元格以两种可能的方式返回:
一世。 Range 互操作接口的一个实例; ii.使用的 Range 的值可以在二维对象数组中获取。
架构和行为思想
我想给自己写一个 CellCollection 或类似的东西,用从(object[,])NativeSheet.UsedRange.get_Value(XlRangeValueDataType.xlRangeValueDefault) 获得的二维数组进行初始化,然后有一个属性,我可以用它的地址(“A1”)调用一个单元格,然后它将从object[,] 获取相应的值并返回它。当涉及到给定的格式时,我可以简单地调用适当的Range 给定一个或多个单元格。
这个想法还没有被精确化,我在解释它时仍然有点困惑。如果您对此有任何疑问,请随时提问,以便我自己可以让事情变得更精简和更快。
问题
在优化此架构的同时保持其面向对象设计的“干净”的最佳方式是什么?
是否有其他替代方案可以让我在投资性能的同时保持单元寻址功能可用?
感谢大家的友好和宝贵的帮助!
【问题讨论】:
标签: .net performance excel interop