ImageVerifierCode 换一换
格式:DOC , 页数:6 ,大小:27KB ,
资源ID:8728592      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-8728592.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Excel输出及性能.doc)为本站会员(11xg27ws)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

Excel输出及性能.doc

1、Excel输出及性能Excel输出及性能 Excel 输出及性能!最近的工作内容之一是对一个Windows Forms程序做性能调整,过程曲折有趣,记下来和大家分享一下。 这个程序的功能其实挺单纯:先检索 Oracle,然后把结果输出到一个 Excel文件里;输出时使用了 Excel 2002/2003提供的 Excel Object库。客户反映说程序太慢,输出 5000条数据就得苦等一个上午。我们也觉得奇怪,就把代码翻出来看。这份代码大概十年前就有了,最初是 VB5做的,后来经过一次升级,变成了现在的 VB.NET版(基于.NET Framwork 1.1) 。看了半天代码,我们好像找到问题

2、所在了:在向 Excel输出的时候,代码的做法比较笨它针对每个单元格逐一赋值,而每次赋值都应该会导致一次磁盘写入操作,程序很可能因此变慢。假定检索结果包含 5000条记录,每一条记录里有 50个字段,这样就需要生成一个 5000行50 列的Excel文件。采用单元格逐一赋值的做法,就意味着要执行 25万次磁盘写入操作。示例代码如下:Reference for Microsoft Excel is required.Imports Microsoft.Office.InteropPublic Function WriteIntoExcelCellbycell(ByVal ExcelFile As

3、 String, ByVal ExcelRowCount As Integer, ByVal ExcelColumnCount As Integer) As TimeSpanDim dtStart As DateTimedtStart = NowDim objExcelApp As Excel.Application = NothingDim objWorkBook As Excel.Workbook = NothingDim objWorkSheet As Excel.Worksheet = NothingTryobjExcelApp = New Excel.ApplicationobjEx

4、celApp.Visible = FalseobjWorkBook = objExcelApp.Workbooks.Open(ExcelFile)objWorkBook.Activate()objWorkSheet = DirectCast(objWorkBook.Worksheets.Add(), Excel.Worksheet)objWorkSheet.Activate()For intRow As Integer = 1 To ExcelRowCountFor intColumn As Integer = 1 To ExcelColumnCountobjWorkSheet.Cells.I

5、tem(intRow, intColumn) = intRow & “-“ & intColumn & “ABCDEFG“NextNextobjWorkBook.Save()Return DateTime.Now.Subtract(dtStart)Catch ex As ExceptionThrow exFinallyIf objWorkBook Is Nothing ThenElseobjWorkBook.Close()End IfIf objExcelApp Is Nothing ThenElseobjExcelApp.Workbooks.Close()objExcelApp.Quit()

6、End IfEnd TryEnd Function于是,我们尝试了另一种做法先把所有检索结果转换成一个二维数组,然后一次性写入 Excel。 代码示意如下:Reference for Microsoft Excel is required.Imports Microsoft.Office.InteropPublic Function WriteIntoExcelByRange(ByVal ExcelFile As String, ByVal ExcelRowCount As Integer, ByVal ExcelColumnCount As Integer) As TimeSpanDim d

7、tStart As DateTimedtStart = NowDim objExcelApp As Excel.Application = NothingDim objWorkBook As Excel.Workbook = NothingDim objWorkSheet As Excel.Worksheet = NothingTryobjExcelApp = New Excel.ApplicationobjExcelApp.Visible = FalseobjWorkBook = objExcelApp.Workbooks.Open(ExcelFile)objWorkBook.Activat

8、e()objWorkSheet = DirectCast(objWorkBook.Worksheets.Add(), Excel.Worksheet)objWorkSheet.Activate()Dim dataBuffer As String(,)dataBuffer = Array.CreateInstance(Type.GetType(“System.String“), ExcelRowCount, ExcelColumnCount)For intRow As Integer = 0 To ExcelRowCountFor intColumn As Integer = 0 To Exce

9、lColumnCountdataBuffer(intRow, intColumn) = intRow & “-“ & intColumn & “ABCDEFG“NextNextDim objRange As Excel.RangeobjRange = objWorkSheet.Range(objWorkSheet.Cells(1, 1), objWorkSheet.Cells(ExcelRowCount, ExcelColumnCount)objRange.Value = dataBufferobjWorkBook.Save()Return DateTime.Now.Subtract(dtSt

10、art)Catch ex As ExceptionThrow exFinallyIf objWorkBook Is Nothing ThenElseobjWorkBook.Close()End IfIf objExcelApp Is Nothing ThenElseobjExcelApp.Workbooks.Close()objExcelApp.Quit()End IfEnd TryEnd Function我们找了现场最老的一台 PC(CPU:Celeron 2GHZ,内存:512MB)做测试,发现使用新方法输出 16000条数据只需要不到 5分钟时间。我们都感到高兴,以为这件事这样就算搞定了

11、。但是,当我们把检索结果件数增加到 65000条时(这是客户要求的最大数据输出量,但我们猜测他们自己或许从来不曾一次输出过这么多数据) ,发现程序又变得像老牛一样了整整花费了 8个小时才能完成输出。 我们做了一下计算: 检索结果:65000 条 每条记录平均长度:600 字节 一次性写入 Excel的数据量:约 37MB 一次性向 Excel文件写入37MB数据,或许有些太为难 Excel Object库了。那么,应该如何改善呢?到目前为止我们还没有找到解决方法,但已经有了一些初步的设想 第一,可以考虑换一种思路。客户的目的是使用Excel查看查询结果,并能把结果另存为 Excel文件。现在性

12、能卡在 Excel文件输出上,那么,我们能不能绕道而行,避开把数据直接输出到 Excel文件上的做法?譬如先把结果输出到 CSV文件上,然后再写个 Macro(宏)将数据从 CSV里读取出来放入 Excel显示。相对于 Excel文件,CSV 文件的写操作速度应该快许多,而利用Macro从 CSV文件提取数据应该也不会太慢。第二,可以考虑放弃Excel Object库,换一个性能好一点的 Excel库。有一个名为ExcelCreator.NET的库可以用。据说这个库效率高过 Excel Object很多倍。下面的性能测试数据来自那个电脑知识的网站:http:/测试用例 1:256 列300 行 Excel输出 ExcelObject:66 ExcelCreator 5.0 for .NET:1.4 测试用例 2:30 列2000行 Excel输出 ExcelObject:445 ExcelCreator 5.0 for .NET:1.2

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报