亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 辦公 > Excel > 正文

Excel輸出與性能

2024-08-23 19:47:59
字體:
來源:轉載
供稿:網友

最近的工作內容之一是對一個Windows Forms程序做性能調整,過程曲折有趣,記下來和大家分享一下。

這個程序的功能其實挺單純:先檢索Oracle,然后把結果輸出到一個Excel文件里;輸出時使用了Excel 2002/2003提供的Excel Object庫??蛻舴从痴f程序太慢,輸出5000條數據就得苦等一個上午。我們也覺得奇怪,就把代碼翻出來看。這份代碼大概十年前就有了,最初是VB5做的,后來經過一次升級,變成了現在的VB.NET版(基于.NET Framwork 1.1)??戳税胩齑a,我們好像找到問題所在了:在向Excel輸出的時候,代碼的做法比較笨——它針對每個單元格逐一賦值,而每次賦值都應該會導致一次磁盤寫入操作,程序很可能因此變慢。假定檢索結果包含5000條記錄,每一條記錄里有50個字段,這樣就需要生成一個5000行×50列的Excel文件。采用單元格逐一賦值的做法,就意味著要執行25萬次磁盤寫入操作。示例代碼如下:

'Reference for Microsoft Excel is required.
'Imports Microsoft.Office.Interop
Public Function WriteIntoExcelCellbycell(ByVal ExcelFile As String, ByVal ExcelRowCount As Integer, ByVal ExcelColumnCount As Integer) As TimeSpan

Dim dtStart As DateTime
dtStart = Now

Dim objExcelApp As Excel.application = Nothing
Dim objWorkBook As Excel.Workbook = Nothing
Dim objWorkSheet As Excel.Worksheet = Nothing
Try
objExcelApp = New Excel.Application
objExcelApp.Visible = False

objWorkBook = objExcelApp.Workbooks.Open(ExcelFile)
objWorkBook.Activate()

objWorkSheet = DirectCast(objWorkBook.Worksheets.Add(), Excel.Worksheet)
objWorkSheet.Activate()

For intRow As Integer = 1 To ExcelRowCount
For intColumn As Integer = 1 To ExcelColumnCount
objWorkSheet.Cells.Item(intRow, intColumn) = intRow & "-" & intColumn & "ABCDEFG"
Next
Next

objWorkBook.Save()

Return DateTime.Now.Subtract(dtStart)
Catch ex As Exception
Throw ex
Finally
If objWorkBook Is Nothing Then
Else
objWorkBook.Close()
End If
If objExcelApp Is Nothing Then
Else
objExcelApp.Workbooks.Close()
objExcelApp.Quit()
End If
End Try
End Function


于是,我們嘗試了另一種做法——先把所有檢索結果轉換成一個二維數組,然后一次性寫入Excel。 代碼示意如下:



'Reference for Microsoft Excel is required.
'Imports Microsoft.Office.Interop
Public Function WriteIntoExcelByRange(ByVal ExcelFile As String, ByVal ExcelRowCount As Integer, ByVal ExcelColumnCount As Integer) As TimeSpan

Dim dtStart As DateTime
dtStart = Now

Dim objExcelApp As Excel.Application = Nothing
Dim objWorkBook As Excel.Workbook = Nothing
Dim objWorkSheet As Excel.Worksheet = Nothing
Try
objExcelApp = New Excel.Application
objExcelApp.Visible = False

objWorkBook = objExcelApp.Workbooks.Open(ExcelFile)
objWorkBook.Activate()

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 ExcelRowCount
For intColumn As Integer = 0 To ExcelColumnCount
dataBuffer(intRow, intColumn) = intRow & "-" & intColumn & "ABCDEFG"
Next
Next

Dim objRange As Excel.Range
objRange = objWorkSheet.Range(objWorkSheet.Cells(1, 1), objWorkSheet.Cells(ExcelRowCount, ExcelColumnCount))
objRange.Value = dataBuffer

objWorkBook.Save()

Return DateTime.Now.Subtract(dtStart)
Catch ex As Exception
Throw ex
Finally
If objWorkBook Is Nothing Then
Else
objWorkBook.Close()
End If
If objExcelApp Is Nothing Then
Else
objExcelApp.Workbooks.Close()
objExcelApp.Quit()
End If
End Try

End Function


我們找了現場最老的一臺PC(CPU:Celeron 2GHZ,內存:512MB)做測試,發現使用新方法輸出16000條數據只需要不到5分鐘時間。我們都感到高興,以為這件事這樣就算搞定了。但是,當我們把檢索結果件數增加到65000條時(這是客戶要求的最大數據輸出量,但我們猜測他們自己或許從來不曾一次輸出過這么多數據),發現程序又變得像老牛一樣了——整整花費了8個小時才能完成輸出。



我們做了一下計算:



■檢索結果:65000條

■每條記錄平均長度:600字節


■一次性寫入Excel的數據量:約37MB



一次性向Excel文件寫入37MB數據,或許有些太為難Excel Object庫了。那么,應該如何改善呢?到目前為止我們還沒有找到解決方法,但已經有了一些初步的設想——



第一,可以考慮換一種思路??蛻舻哪康氖鞘褂肊xcel查看查詢結果,并能把結果另存為Excel文件?,F在性能卡在Excel文件輸出上,那么,我們能不能繞道而行,避開把數據直接輸出到Excel文件上的做法?譬如先把結果輸出到CSV文件上,然后再寫個Macro(宏)將數據從CSV里讀取出來放入Excel顯示。相對于Excel文件,CSV文件的寫操作速度應該快許多,而利用Macro從CSV文件提取數據應該也不會太慢。



第二,可以考慮放棄Excel Object庫,換一個性能好一點的Excel庫。有一個名為ExcelCreator.NET的庫可以用。據說這個庫效率高過Excel Object很多倍。下面的性能測試數據來自那個公司的網站:http://www.adv.co.jp/PRoducts/product_ExcelCreator5_feature2.htm



■測試用例1:256列×300行Excel輸出

ExcelObject:6′6″


ExcelCreator 5.0 for .NET:1.4″



■測試用例2:30列×2000行Excel輸出

ExcelObject:4′45″


ExcelCreator 5.0 for .NET:1.2″


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色婷婷av一区二区三区在线观看| 日韩高清免费在线| 国产成人在线一区二区| 萌白酱国产一区二区| 成人综合网网址| 日韩av在线免费播放| 欧美另类69精品久久久久9999| 久久97精品久久久久久久不卡| 91久久精品美女高潮| 成人激情视频在线观看| 色婷婷综合成人av| 国产日韩欧美黄色| 日韩在线视频导航| 国产99久久久欧美黑人| 琪琪第一精品导航| 欧美成人一区二区三区电影| 国产精品久久久久久一区二区| 欧美精品激情blacked18| 色偷偷88888欧美精品久久久| 亚洲精品电影网| 91在线观看免费| 日韩激情视频在线播放| 青草青草久热精品视频在线网站| 国产精品成人aaaaa网站| 91精品国产777在线观看| 福利一区福利二区微拍刺激| 性欧美视频videos6一9| 国产精品视频26uuu| 国产精品三级久久久久久电影| 亚洲wwwav| 国产成人av网| 精品国产网站地址| 欧美日韩日本国产| www.99久久热国产日韩欧美.com| 日本人成精品视频在线| 久久久久久中文字幕| 欧美性猛交xxxx久久久| 久久久久久久久久久av| 粉嫩av一区二区三区免费野| 亚洲大尺度美女在线| 欧美激情视频一区| 国产精品成久久久久三级| 亚洲精品成人久久久| 欧美理论电影在线观看| 久久噜噜噜精品国产亚洲综合| 精品久久久视频| 日韩精品在线免费观看视频| 国产成+人+综合+亚洲欧洲| 日韩小视频在线| 国产亚洲免费的视频看| 国产91免费观看| 国产综合在线看| 欧美一级黑人aaaaaaa做受| 91在线观看欧美日韩| 欧美激情在线视频二区| 668精品在线视频| 亚洲精品v天堂中文字幕| 亚洲欧美自拍一区| 91色在线观看| 欧美理论电影在线播放| 欧美黑人巨大xxx极品| 国产精品色视频| 成人精品久久av网站| 久久免费视频这里只有精品| 日韩电影中文字幕| 欧美激情一区二区三区久久久| 午夜精品久久久久久久久久久久久| 久久成人综合视频| 裸体女人亚洲精品一区| 欧美孕妇性xx| 热久久免费视频精品| 夜夜嗨av一区二区三区免费区| 一区二区日韩精品| 久久久久久久久久久av| 96精品视频在线| 亚洲第一网中文字幕| 国产精品久久久久久久久影视| 日韩欧美a级成人黄色| 亚洲精品白浆高清久久久久久| 亚洲午夜小视频| 久久久久久久久久久免费精品| 欧美日韩在线观看视频| 亚洲美女视频网站| 日韩激情第一页| 98精品在线视频| 6080yy精品一区二区三区| 91精品国产自产在线观看永久| 久久天堂av综合合色| 亚洲人成在线观| 国产在线拍揄自揄视频不卡99| 91精品国产91久久久久久吃药| 国产精品高清在线观看| 亚洲欧美在线看| 国产精品美女在线观看| 亚洲第一视频网站| 一区二区三区无码高清视频| 中文字幕国内精品| 久久久久国产精品免费网站| 宅男66日本亚洲欧美视频| 亚洲女人被黑人巨大进入al| 日韩av一区二区在线观看| 在线色欧美三级视频| 成人网在线免费观看| 97久久久免费福利网址| 久久久久久国产三级电影| 国产精品久久久久久久av大片| 久久久久久18| 欧美老女人性视频| 亚洲国产天堂网精品网站| 亚洲国语精品自产拍在线观看| 国产精品久久久久久久久久三级| 91国语精品自产拍在线观看性色| 欧美成人午夜影院| 国外成人免费在线播放| 另类少妇人与禽zozz0性伦| 日韩免费观看网站| 欧美电影在线观看完整版| 日日摸夜夜添一区| 欧美极品在线播放| 亚洲午夜国产成人av电影男同| 亚洲欧美国内爽妇网| 久久国产精品久久久久久久久久| 欧美在线观看网站| 亚洲成年人在线播放| 国产欧美精品久久久| 久久久亚洲精品视频| 欧美黑人极品猛少妇色xxxxx| 少妇精69xxtheporn| 97热精品视频官网| 国产主播精品在线| 97视频在线观看网址| 欧美日韩国产成人在线观看| 亚洲香蕉av在线一区二区三区| 国产一区二区三区在线观看视频| 在线亚洲欧美视频| 91欧美精品成人综合在线观看| 久久久久久一区二区三区| 91深夜福利视频| 亚洲女人被黑人巨大进入al| 日韩最新免费不卡| 久久网福利资源网站| 精品久久久久久久久久国产| 欧美激情综合色| 国产经典一区二区| 中文日韩在线视频| 成人精品网站在线观看| 一区二区在线免费视频| 日韩av手机在线看| 日韩av不卡在线| 色爱精品视频一区| 亚洲三级黄色在线观看| 黑人狂躁日本妞一区二区三区| 最新国产精品亚洲| 欧洲成人在线观看| 97国产suv精品一区二区62| 亚洲精品久久视频| 中文字幕久久精品| 97在线视频观看| 精品成人在线视频| 国产91九色视频| 精品福利一区二区| 欧美日韩另类视频| 九九综合九九综合| 国产精品久久久久久久7电影|