如何使这个自定义工作表初始化更快?

2024-04-24

Summary

这个问题在某种程度上是这个问题的后续:
如何从索引实现列自命名? https://stackoverflow.com/questions/5160001/how-to-implement-column-self-naming-from-its-index

测试了上述链接问题的答案中提供的代码后,我终于遇到了严重的性能问题。

性能问题

性能问题发生在工作表初始化时,即当我初始化工作表的单元格时。

    ''' <summary>
    ''' Initialize an instance of the Company.Project.Sheet class.
    ''' </summary>
    ''' <param name="nativeSheet">The native worksheet from which to initialize.</param>
    Friend Sub New(ByVal nativeSheet As Microsoft.Office.Interop.Excel.Worksheet)
        _nativeSheet = nativeSheet
        Dim cells As IDictionary(Of String, ICell) = New Dictionary(Of String, ICell)()

        'These iterations hurt the performance of the API...'
        For rowIndex As Integer = 1 To _nativeSheet.Rows.Count Step 1
            For colIndex As Integer = 1 To _nativeSheet.Columns.Count Step 1
                Dim c As ICell = New Cell(_nativeSheet.Cells(rowIndex, colIndex))
                cellules.Add(c.Name, c)
            Next
        Next

        _cellules = New ReadOnlyDictionary(Of String, ICell)(cells)
    End Sub
  • ReadOnlyDictionary(TKey、TValue) :
    A custom read-only dictionary that simply wraps a IDictionary(Of TKey, TValue) to prevent modifications.

讨论

我之所以这样工作,是因为底层电子表格工作表中的每个单元格都是从工作表初始化到结束(即工作表被处置或最终确定)进行初始化的。因此,我希望以同样的方式初始化工作表的单元格,但我也希望保持使用索引单元格相对于命名(“A1”)单元格的性能提升,同时保持 API 用户的易用性用其名称引用单元格,这就是我打算使用字典的方式,这样当我引用单元格“A1”时,我会将此键访问到我的字典中并相应地寻址单元格 (1, 1)。

  • 除此之外,我知道使用 Worksheet.UsedRange 属性从工作表中读取数据的更快方法,该属性将所有使用的单元格返回到二维矩阵中。

    如果无论如何,对于我可以用来初始化 Cell 类的多个实例的单元格集合来说,存在相同或大致相同的单元格,那就太好了,并且性能良好!

  • 我还考虑过在内存中只初始化一个 100 x 100 矩阵单元,同时用我的字典映射它们,因为人们很少会使用整个工作表的单元。因此,我仍在考虑一种必须访问尚未初始化的单元格的方法,例如 Cells(120, 120)。理想情况下,我认为程序必须初始化最大初始初始化 Cell(100, 100) 到 Cell (120, 120) 之间的所有单元格。我在这里说得够清楚了吗?请随时要求澄清! =)

  • 另一种选择可能是我只将单元格的名称初始化到字典中并将行和列索引保留在内存中,而不是使用其 nativeCell 初始化 Cell 实例,例如 Range。这是我的 Cell 类的代码来说明我的意思。

    ''' ''' 代表工作表中的一个单元格。 ''' ''' 朋友级细胞 实现 ICell

    Private _nativeCell As Microsoft.Office.Interop.Excel.Range
    Private _name As String
    
    ''' <summary>
    ''' Initializes a new instance of the Company.Project.Cell class.
    ''' </summary>
    ''' <param name="nativeCell">The Microsoft.Office.Interop.Excel.Range to wrap.</param>
    Friend Sub New(ByVal nativeCell As Microsoft.Office.Interop.Excel.Range)
        _nativeCell = nativeCell
    End Sub
    
    Public ReadOnly Property NativeCell() As Microsoft.Office.Interop.Excel.Range Implements ICellule.NativeCell
        Get
            Return _nativeCell 
        End Get
    End Property
    
    Public ReadOnly Property Column() As Integer Implements ICell.Column
        Get
            Return _nativeCell.Column
        End Get
    End Property
    
    Public ReadOnly Property Row() As Integer Implements ICell.Row
        Get
            Return _nativeCell.Row
        End Get
    End Property
    
    Public ReadOnly Property Name() As String Implements ICellule.Name
        Get
            If (String.IsNullOrEmpty(_name) OrElse _name.Trim().Length = 0) Then _
                _name = GetColumnName()
    
            Return _nom
        End Get
    End Property
    
    Public Property Value() As Object Implements ICellule.Value
        Get
            Return _nativeCell.Value2
        End Get
        Set(ByVal value As Object)
            _nativeCell.Value2 = value
        End Set
    End Property
    
    Public ReadOnly Property FormattedValue() As String Implements ICellule.FormattedValue
        Get
            Return _nativeCell.Text
        End Get
    End Property
    
    Public ReadOnly Property NumericValue() As Double? Implements ICellule.NumericValue
        Get
            Return Value
        End Get
    End Property
    

问题

  1. 我还有哪些其他选择?

  2. 还有其他方法可以穿越吗?

  3. 对于性能问题,有没有一种方法可以使实际方法可行?

供您参考,此问题在测试中超时,因此测试从未在可接受的时间范围内结束,而这实际上需要几个世纪的时间......

欢迎任何想法!我对其他解决方案或方法持开放态度,这些解决方案或方法将帮助我在解决此性能问题的同时实现此目标。

谢谢大家! =)

EDIT #1

谢谢马克西姆·格万多夫 https://stackoverflow.com/users/574995/maxim-gueivandov,他的解决方案解决了我在这个问题中提到的问题。

除此之外,这个解决方案还带来了另一个问题:SystemOutOfMemoryException,这将在另一个问题中解决。

我最诚挚地感谢马克西姆·格万多夫。


您可以尝试一跳获取已使用范围内的所有单元格,从而避免调用Cells(rowIndex, colIndex)在迭代的每次迭代中(我猜Cells隐藏互操作调用,这可能会影响性能)。

Dim usedRange As Range = nativeSheet.UsedRange
Dim cells(,) As Object = DirectCast(usedRange.get_Value( _
    XlRangeValueDataType.xlRangeValueDefault), Object(,))
[... do your row/col iterations ...]

您将在下面的文章中找到一些我基于这些假设的性能技巧:C# Excel 互操作使用 http://www.dotnetperls.com/excel。最值得注意的是,检查基准部分:

=== C# 中的 Excel 互操作基准 ===

单元格[]:30.0 秒

get_Range(),单元格[]:15.0 秒

UsedRange、get_Value():1.5 秒 [最快的]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使这个自定义工作表初始化更快? 的相关文章

  • Winforms 风格/UI 外观和感觉提示

    从多年的 asp net 开发回到 winforms 应用程序 寻找有关如何 设计 winforms 的建议和技巧 类似于我在 asp net 中使用 CSS 母版页的方式 我对如何在一处更新某些类型的控件的字体 颜色感兴趣 如何保持布局的
  • Range.End() 困惑

    我有一个关于 VBA 中 Range End 属性的一般性问题 我已经阅读了有关该房产的信息here http msdn microsoft com en us library bb221181 aspx 但我还是很困惑 例子 With w
  • 使用 Cucumber Scenario Outline 处理 Excel 电子表格

    如果可能的话 我试图找到一种更优雅的方法来处理从与 Excel 电子表格行 第 n 个 相关的 Cucumber Scenario Outline 中调用第 n 个数字 目前 我正在使用迭代编号来定义要从中提取数据的 Excel 电子表格的
  • win32 API 和 .NET 框架之间的选择

    我必须开发一个适用于 Windows 的应用程序 该应用程序将能够通过网络摄像头识别手势来控制鼠标 我将使用 vc 2008 进行开发 但我很困惑是使用 NET 框架还是核心 win32 API 性能对于我的应用程序非常重要 根据 Ivor
  • 将小数格式化为两位或整数

    对于 10 我想要 10 而不是 10 00 对于 10 11 我想要 10 11 没有代码可以实现吗 即通过指定格式字符串类似于 0 N2 decimal num 10 11M Console WriteLine num ToString
  • .NET IExtenderProvider (C#)

    我正在尝试延长TextBox ComboBox and Panel控制使用IExtenderProvider但我无法让它正常工作 我开始相信我还没有完全理解这个概念 有人知道网络上有什么好的资源 带有示例 吗 IExtenderProvid
  • SSIS使用列位置而不是名称导入Excel文档

    我想知道是否可以通过按位置引用列来使用 SSIS 导入 Excel 文档 例如 导入列 A D M AA 等 我问这个问题是因为我需要从第三方加载多个 Excel 文档 每个文档在相应的列中包含相同的数据类型 但每个文档的列名称不同 Tha
  • 是否存在比 SVN 更快的集中版本控制?

    我已经使用 SVN 很长时间了 现在我们正在尝试使用 Git 我在这里谈论的不是中心化 去中心化的争论 我唯一关心的是速度 后一个工具要快得多 但有时 我需要使用一种集中式方法 这种方法比分散式方法更简单 更简单 学习曲线非常快 这节省了大
  • 将所有工作簿工作表复制到新工作簿 VBA

    我正在使用此代码将工作簿中的每张工作表复制到新工作簿中 它工作正常 但它颠倒了工作表的顺序 是否有办法阻止它这样做 Sub copy copies all the sheets of the open workbook to a new o
  • 如何为 CUDA 内核选择网格和块尺寸?

    这是一个关于如何确定CUDA网格 块和线程大小的问题 这是对已发布问题的附加问题here https stackoverflow com a 5643838 1292251 通过此链接 talonmies 的答案包含一个代码片段 见下文 我
  • 为什么 RestSharp 反序列化两个日期的方式不同?

    我有一个返回此值的休息调用 使用 Chrome 中的 Advance Rest Client 进行测试 MyObject 22 0 ID 123456 UTC1 2013 04 19T03 12 32Z UTC2 2013 04 19T03
  • asp.net net.mail - 在调试模式下将所有电子邮件路由到不同的电子邮件地址

    无论如何 有没有办法让所有电子邮件发送到不同的地址System Web HttpContext Current IsDebuggingEnabled是真的 或者我是否需要一个新的类来用于到处发送电子邮件 我会设置一个 SMTP 服务器 并让
  • 多个 Visual Studio 项目抱怨临时文件丢失,因此无法打开。错误代码 &H80070003

    我在终端服务器上运行 Visual Studio 2010 并且已经运行了一段时间 问题相对较少 今天早上 我启动了我的电脑 在英国的长周末期间 似乎出现了以下问题 我有很多项目 但不是我的所有项目 也不是给定解决方案中的所有项目 抱怨无法
  • C# 模拟接口与模拟类

    我是 net 中的最小起订量框架的新手 根据我的在线研究 似乎有两种方法可以使用这个框架 要么模拟接口 要么模拟具体类 似乎在嘲笑具体类时 只有virtual方法可以被嘲笑 就我而言 我只想模拟实现接口的类的几个方法 例如 如果我们有以下内
  • 修饰符 async 对此项目无效

    这似乎并不是数百个具有相同错误的其他问题的重复 我把它们都看过了 发现它们是无关的 我正在制作一个小笔记应用程序 并尝试从目录中读取文件 按照 MSDN 示例 我有以下代码 但它给了我一个错误 错误 1 修饰符 async 对此无效 项目
  • java charAt() 和startsWith() 哪个更快? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的问题是 如果我想检查特定索引中字符串的一个字符 仅检查一个字符 哪种方法非常有效charAt or startsWith 我的意思是 据我所
  • Parallel.For 和 Break() 误解?

    我正在研究 For 循环中的并行性中断 看完之后this http tipsandtricks runicsoft com CSharp ParallelClass html and this http reedcopsey com 201
  • 无论表单上的焦点控件如何,如何捕获 Keys.F1?

    我使用了 KeyDown 事件和一些简单的代码 例如if e KeyCode Keys F1 捕获在表单上按下 F1 但如果表单上有一些文本框 或者表单上有一些带有 Dock Fill 的电子表格 则上面的代码将毫无用处并且不执行任何操作
  • 中继命令和无参数执行方法

    我目前正在学习 WPF 和 MVVM 我想我已经了解了大部分内容及其工作原理 但我在使用 RelayCommand 或 DelegateCommand 时遇到了一些我不明白的问题 我认为这与代表的工作方式有关 请注意 下面的代码目前仅处于测
  • 使用 wmi 获取活动会话(Win32_LogonSession 还返回非活动/旧会话)

    有没有办法只显示 wmi 的活动会话 问题是 Win32 LogonSession 还显示不活动 断开连接的会话 ManagementScope scope new ManagementScope ManagementPath Defaul

随机推荐

  • 具有持久性的网页导航 - ASP.NET C#

    我有一个已经用 ASP NET 完成的网站 我需要在底部添加一个部分来保存实时流视频聊天 Flash 对象 并且我需要它在不同的页面访问中持续存在 例如我有可能被访问的 profile aspx 和 local aspx 并且我需要底部的小
  • li 元素内的作用域函数未被调用

    我使用 ng repeat 生成 li 在 LI 内部我有输入类型控件 它有一个范围函数 fn btnClose 当我单击按钮时 按钮的单击事件没有被调用 而是 li 的单击事件被触发 我在 js fiddle 中做同样的事情 它在那里工作
  • JSP 包含参数用法

    我应该如何访问param1来自包含的 jsp 的值 navMenu jsp
  • GPars:返回eachParallel{}

    我想对每个示例字符串做很多事情 并在此处返回一些其他类型的对象 整数 然后返回一些更大的类对象 在这个例子中 我正在尝试一些简单的事情 但我得到了完全错误的结果 至少对于我希望得到的东西 xD 我希望得到 6 5 6 5 但我得到的是 bu
  • iPhone/iPad 的核心文本示例

    我正在寻找 iphone ipad 的核心文本示例 但运气不佳 任何线索将不胜感激 我在 Github 上编写了一个小项目 为 Core Text 提供了 Objective C 包装器 https github com akosma Co
  • 如何使用 WHERE 条件中的关联值从 ABAP SQL 消费 CDS?

    我有一个通知标头的 CDS 视图及其状态关联 define view ZNOTIF as select from qmel as notif association 0 to ZNOTIF STATUS as status on statu
  • jquery如何选择所有以“text-”开头的类元素?

    我有一些课程 text 1 text 2 text 3 我想全部选择 该怎么做 谢谢您的帮助 尝试这个 欲了解更多详情 请参阅jquery selectors http api jquery com attribute starts wit
  • 如何在反向代理后面正确设置 JSESSIONID cookie 路径

    我的网络应用程序正在 Tomcat 中运行http localhost 8080 example com 但它是从 Apache 提供的反向代理http example com 在端口 80 上 我的网络应用程序查看request getH
  • RGB 缓冲区到 JPEG 缓冲区,这里出了什么问题?

    我需要一种简单的方法将包含 RGB 数据的缓冲区转换为 jpeg 我已经尝试过使用 libjpeg 但我根本无法让它正常工作 例如 将缓冲区保存为位图时会产生以下结果 使用 libjpeg 在内存中对同一图像进行编码会产生以下结果 将图像直
  • Linux 消息队列 - 多个接收者

    我最近一直在研究和研究 Linux 消息队列 并遇到了一些我不太明白为什么会发生的事情 如果我们运行两个程序 它们都在无限 for 循环中使用 msgrcv 来检查消息 然后发送两条消息 那么第一个运行的程序将收到第一条消息 第二个程序将收
  • Javascript画布不重画?

    我正在开发一个游戏 基于画布 并且遇到了问题 显然 当我按下一个键时 画布并没有更新对象的 x 和 y 它什么也没做 变量本身正在更新 但屏幕上的对象没有更新 这是代码 var canvas document createElement c
  • fiddler2无法生成证书

    我正在使用 Fiddler2 或尝试 捕获访问 https Web 服务的 Windows 桌面小工具的 SSL 流量 它曾经可以工作 然后几天前就停止了 总是出现以下错误 Unable to Generate Certificate Cr
  • 从目录节点 Js 检索文件

    我正在使用 readDirSync 从目录中获取文件 请查找代码和错误如下 var fs require fs var files fs readdirSync application models for var i in files v
  • 将多页 PDF 转换为单个图像

    我必须将多页 PDF 文档转换为 png 图像 我尝试使用 ImageMagick 但无法获得最终结果 convert document pdf document png or convert adjoin document pdf doc
  • 将带有子存储库的 Mercurial 存储库迁移到 git 并保留历史记录的最佳方法?

    我正在尝试将 Mercurial 存储库迁移到 git 但问题是 Mercurial 存储库有子存储库 有些带有分支 以及大量合并和分支本身 我希望最终的 git 存储库能够保留所有这些历史记录 并且在检查存储库或其他分支的早期部分时保持正
  • Leaflet.label 未显示在标记上

    我有一组 geoJSON 点 它们附加了相应的标签 var points L geoJson null onEachFeature function feature layer layer options riseOnHover true
  • Windows 7 在“程序文件”中创建文件夹在 C# 代码中失败,即使我有管理员权限!

    我无法使用 VS 2008 WPF C 代码在 Windows 7 64 位计算机上的 程序文件 文件夹下创建文件 我在以下代码中遇到的错误 myFile File Create logFile 如下 这是innerException堆栈跟
  • 如何记录 IDE 的魔术(_call 和 _callStatic)方法

    在使用 notepad 和 sublime 编码多年之后 有人建议我尝试一下 PHP IDE 我正在尝试 phpStorm 它看起来不错 代码完成和文档是一个很棒的功能 但在使用魔术方法时对我来说不起作用 有没有办法让 phpStorm 了
  • JavaScript 中的空方括号?

    我在中遇到了这段代码https upmostly com tutorials setinterval in react components using hooks https upmostly com tutorials setinter
  • 如何使这个自定义工作表初始化更快?

    Summary 这个问题在某种程度上是这个问题的后续 如何从索引实现列自命名 https stackoverflow com questions 5160001 how to implement column self naming fro