多年来 COM 对象一直是 Windows 编程的基础,然而随着技术的进步和发展,微软推出了更佳出色的.NET。.NET Framework 提供了一个称为公共语言运行库的运行时环境(CLR),它的托管执行过程,自动的内存管理,以及在版本的控制上都较COM技术有很大的提高。可以预见的是,.NET 平台应用程序将最终取代那些用 COM 开发的应用程序。但不可避免的是,在向.NET过渡时,我们还是需要继续使用现有的COM对象的。CLR不管所用的编程语言是什么,所有.NET 应用程序都共享一组公共类型,这些公共类型允许对象互操作。COM 对象的参数和返回值使用的数据类型有时会与托管代码中的有所不同。“互操作性封送处理”是一个打包过程,在将参数和返回值移动到 COM 对象或从 COM 对象移出时,此过程将这些参数和返回值打包为等价的数据类型。
公共语言运行库通过名为运行库可调用包装 (Runtime Callable Wrapper,RCW) 的代理来公开 COM 对象,如图所示。虽然 RCW 在 .NET 客户端看来是普通的对象,但它的主要功能是封送在 .NET 客户端和 COM 对象之间传递的调用。同时.NET提供Interop 程序集,它用作托管和非托管代码之间的桥梁,将 COM 对象成员映射为等价的 .NET 托管成员。
Public Overridable ReadOnly Property Offset(Optional ByVal RowOffset As Object = Nothing, Optional ByVal ColumnOffset As Object = Nothing) As Excel.Range
利用这一属性,我们就可以在已知开始单元格的基础上进行偏移并赋值,而不用同时定位行和列的绝对位置:
Private Sub SetValueToExcelCellByCell(ByVal xlWorksheet As Worksheet, ByVal strBeginCell As String, ByVal objDataTable As System.Data.DataTable)
' Output the title
For i As Integer = 0 To objDataTable.Columns.Count - 1
此方法相当于遍历了所有要赋值的单元格,一一进行赋值操作。也就是说当数据量为m*n的情况下,xlWorksheet.Range (strBeginCell).Offset(1 + i, j).Value被执行了m*n次,跨越托管堆到非托管堆的数据转移发生了m*n次。同时考虑到RCW将COM对象中方法的参数都包装成Object,因此这里还要发生大量的装箱操作,所以当数据量非常大的时候,该方法的速度是比较慢的。
End Sub
这里的主要操作主要是在组装StringBuilder上,而系统剪切板利用DDE(Dynamic Data Exchange)的方式转移数据,速度还是很快的。但是,因为系统剪切板是系统共享资源,所以在多线程的应用程序里需要考虑对该共享资源的同步问题。另外,在Web应用中,因为用户是ASPNET而不是Administrator所以对Clipboard的访问是没有权限的。因此该方法也是受限的。