欢迎来到天天文库
浏览记录
ID:20443815
大小:27.00 KB
页数:6页
时间:2018-10-12
《excel输出和性能》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Excel输出及性能Excel输出及性能Excel输出及性能!最近的工作内容之一是对一个WindowsForms程序做性能调整,过程曲折有趣,记下来和大家分享一下。这个程序的功能其实挺单纯:先检索Oracle,然后把结果输出到一个Excel文件里;输出时使用了Excel2002/2003提供的ExcelObject库。客户反映说程序太慢,输出5000条数据就得苦等一个上午。我们也觉得奇怪,就把代码翻出来看。这份代码大概十年前就有了,最初是VB5做的,后来经过一次升级,变成了现在的VB.NET版(基于.NETFr
2、amwork1.1)。看了半天代码,我们好像找到问题所在了:在向Excel输出的时候,代码的做法比较笨——它针对每个单元格逐一赋值,而每次赋值都应该会导致一次磁盘写入操作,程序很可能因此变慢。假定检索结果包含5000条记录,每一条记录里有50个字段,这样就需要生成一个5000行×50列的Excel文件。采用单元格逐一赋值的做法,就意味着要执行25万次磁盘写入操作。示例代码如下:'ReferenceforMicrosoftExcelisrequired.'ImportsMicrosoft.Office.Inter
3、opPublicFunctionWriteIntoExcelCellbycell(ByValExcelFileAsString,ByValExcelRowCountAsInteger,ByValExcelColumnCountAsInteger)AsTimeSpanDimdtStartAsDateTimedtStart=NowDimobjExcelAppAsExcel.Application=NothingDimobjWorkBookAsExcel.Workbook=NothingDimobjWorkSheet
4、AsExcel.Worksheet=NothingTryobjExcelApp=NewExcel.ApplicationobjExcelApp.Visible=FalseobjWorkBook=objExcelApp.Workbooks.Open(ExcelFile)objWorkBook.Activate()objWorkSheet=DirectCast(objWorkBook.Worksheets.Add(),Excel.Worksheet)objWorkSheet.Activate()ForintRowA
5、sInteger=1ToExcelRowCountForintColumnAsInteger=1ToExcelColumnCountobjWorkSheet.Cells.Item(intRow,intColumn)=intRow&"-"&intColumn&"ABCDEFG"NextNextobjWorkBook.Save()ReturnDateTime.Now.Subtract(dtStart)CatchexAsExceptionThrowexFinallyIfobjWorkBookIsNothingThen
6、ElseobjWorkBook.Close()EndIfIfobjExcelAppIsNothingThenElseobjExcelApp.Workbooks.Close()objExcelApp.Quit()EndIfEndTryEndFunction于是,我们尝试了另一种做法——先把所有检索结果转换成一个二维数组,然后一次性写入Excel。代码示意如下:'ReferenceforMicrosoftExcelisrequired.'ImportsMicrosoft.Office.InteropPublicFu
7、nctionWriteIntoExcelByRange(ByValExcelFileAsString,ByValExcelRowCountAsInteger,ByValExcelColumnCountAsInteger)AsTimeSpanDimdtStartAsDateTimedtStart=NowDimobjExcelAppAsExcel.Application=NothingDimobjWorkBookAsExcel.Workbook=NothingDimobjWorkSheetAsExcel.Works
8、heet=NothingTryobjExcelApp=NewExcel.ApplicationobjExcelApp.Visible=FalseobjWorkBook=objExcelApp.Workbooks.Open(ExcelFile)objWorkBook.Activate()objWorkSheet=DirectCast(objWorkBook.Worksheets.Add(
此文档下载收益归作者所有