台灣最大程式設計社群網站
線上人數
1907
 
會員總數:246038
討論主題:189625
歡迎您免費加入會員
討論區列表 >> VB.NET >> 如何提升 EXCEL 資料放入 DataTable 的速度
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
如何提升 EXCEL 資料放入 DataTable 的速度
價值 : 50 QP  點閱數:416 回應數:15
樓主

Peter
門外漢
0 1
433 6
發送站內信

須將EXCEL某一行的資料放入DataTable
小弟目前寫法如下列:

Dim dt As New DataTable
Dim dataRow As DataRow

Dim xlsApp As Object = Nothing
Dim xlsBok As Object = Nothing
Dim xlsShp As Object = Nothing

xlsApp = CreateObject("Excel.Application")
xlsBok = xlsApp.Workbooks.Open(File_Path, ReadOnly:=True)
xlsShp = xlsBok.Worksheets(1)

dataRow = dt.NewRow
For i = 1 To 10
dataRow(i) = xlsShp.Cells(1, i).Value
Next
dt.Rows.Add(dataRow)

是否有其他的方式可將EXCEL 1到10位置的資料一次性填入dataRow ?

搜尋相關Tags的文章: [ EXCEL ] , [ DataTable ] ,
本篇文章發表於2019-11-01 11:18
1樓
回應

P陳
檢舉此回應
這樣不就放進去了嗎?
再加個存檔就可以了。
目前有問題嗎?
本篇文章回覆於2019-11-01 11:29
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

Peter
檢舉此回應
陳大您好

抱歉,可能我問題沒有描述清楚,

上述程式是可執行的,但資料量大的時候(可能幾萬筆),
使用
For i = 1 To 10
dataRow(i) = xlsShp.Cells(1, i).Value
Next
這樣執行就顯得有點久

小弟想詢問的是,是否有其他的方式可以取代,以提升速度。
好比可否將EXCEL A1~J1欄位的資料 直接就複製到 dataRow(1)~dataRow(10)
而不需要一筆一筆的做搬移的動作。

謝謝您
本篇文章回覆於2019-11-01 12:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

P陳
檢舉此回應
幾萬筆有幾個方向
A. 在填入時將 讓 xlsapp 不顯示
XlsApp = CreateObject("Excel.Application")
XlsApp.DisplayAlerts = False
XlsApp.Application.Visible = False

B.轉成 CSV 再到Excel中去開啟

C.開 NPOI 外掛 (上網查一下 這個很快)




本篇文章回覆於2019-11-01 15:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

P陳
檢舉此回應
參考這個
與您相同的問題
本篇文章回覆於2019-11-01 15:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

P陳
檢舉此回應
弄錯了,您是要匯入不是匯出的
匯入 不應該慢才對

請將您這個區段的程式全PO上來


本篇文章回覆於2019-11-01 15:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

Peter
檢舉此回應
您好,是的,您給的連結我之前有搜尋過,而我剛好相反,下面為這個區段的程式,謝謝您了



本篇文章回覆於2019-11-01 16:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

P陳
檢舉此回應
會造成這情況 您如果有下 datagridview1.autosizecolumnsmode=allcells 就會讓您等到地老天荒的
請先改成 datagridview1.autosizecolumnsmode= none <---速度就快起來了

DataGridView1.DataSource = dt <--- 問題在這句請將其移到 39 你就知道我在說什麼了

本篇文章回覆於2019-11-01 20:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

Peter
檢舉此回應
陳大您好

您說的第一項原先都沒有下,就僅上面那段程式碼放入BUTTON做測試,
但我有試過加入您說的那兩句做測試,
執行時間與原先無明顯差異,也將 DataGridView1.DataSource = dt <--- 移到39 還是看不出差異,
.autosizecolumnsmode= none + DataGridView1.DataSource移至39的時間 約 15215 毫秒
.autosizecolumnsmode=allcells + DataGridView1.DataSource移至39的時間 約 15422 毫秒

原想是否與EXCEL檔案內資料有關,測試了一個空白檔案,執行時間也是差不多,
使用的檔案格式原為xlsx,換成xls速度也是一樣,或是我有哪個部分沒有注意到?
本篇文章回覆於2019-11-02 08:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

P陳
檢舉此回應

None 與 Allcells llcells 差0.2秒

再來就可能是開啟Excel 的時間了 <-----

請顯示下列時間點
1.開 EXCEL 之前
2.開 Excel 之後
3.讀入資料到 DataTable 之後
4.放DT到 Datagridview 之後

先找到那個最秏時,再來處理那個
本篇文章回覆於2019-11-02 09:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

P陳
檢舉此回應
第27行 改成 for j=1 to 10 (不要用3000)看看

再來就是要用 NPIO了
本篇文章回覆於2019-11-02 09:05
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

Peter
檢舉此回應
for j=1 to 3000 -> 13271 毫秒
for j=1 to 300 -> 1291 毫秒
for j=1 to 30 -> 127 毫秒
這個部分,我之前有測過,因為我沒辦法減少外圈3000的量,
所以才想減少內圈
For i = 1 To 10
dataRow(i) = xlsShp.Cells(j, i).Value
Next
這個動作,如果For i = 1 To 10 這個可以一次做完,或許原本 13271 毫秒可以DOWN到3秒以下(僅推測)
本篇文章回覆於2019-11-02 10:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
最有價值解答

P陳
檢舉此回應
問題出在與 Excel 的溝通上 (Excel.application 效果不彰)
以下程式6萬筆 用4.2秒


本篇文章回覆於2019-11-03 08:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

HB
檢舉此回應
試試用OleDb方式讀取Excel檔案再放入DataTable看看是否可行?
參考看看?參考看看
本篇文章回覆於2019-11-03 10:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
不錯的參考

Ader Chen
檢舉此回應

另外也可參考看看:

本篇文章回覆於2019-11-03 21:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
作者回應

Peter
檢舉此回應
謝謝陳大、Ader Chen大,使用你們的方式,速度快好幾倍,問題解決了。
也謝謝HB大提供資訊給與參考。
最後採用陳大的方法。
Ader Chen大的方法也很好,此次真的受益匪淺,再次謝謝您們。

本篇文章回覆於2019-11-04 16:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.