線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3282
推到 Plurk!
推到 Facebook!

提升Exel OLE存放資料速度

答題得分者是:aftcast
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-03 15:51:22 IP:211.20.xxx.xxx 訂閱
我有一個問題想請教各位,在使用OLE 存EXCEL檔案時,存取速度上可以改善嗎?
因為我需要將大量資料放入.csv的檔案中,但是存放速度實在太慢,希望各位前輩可以指導我一下,謝謝


[code cpp]
void __fastcall TForm1::BtnNewFileClick(TObject *Sender)
{
AnsiString filename=GetCurrentDir() \\Test.csv";

if (FileExists(filename)){
DeleteFile(filename);
}

// Create a Excel Object
Excel=CreateOleObject("Excel.Application");
Excel.OlePropertySet("Visible", false);

// Product workbooks and workbook Object
Workbooks=Excel.OlePropertyGet("Workbooks");
Workbook=Workbooks.OleFunction("Add");

// Product worksheets and worksheet Object
Worksheets=Workbook.OlePropertyGet("Worksheets");
Worksheet=Worksheets.OlePropertyGet("Item", 1);

for(int i=1;i<=100;i )
{
for(int j=1;j<=5160;j )
{
// 設定值
Range=Worksheet.OlePropertyGet("Cells",j,i);
Range.OlePropertySet("Value",j*i);
}
}

//Save Files
Workbook.OleProcedure("SaveAs",filename.c_str());

//Close Files
Workbook.OleProcedure("Close");
Excel.OleFunction("Quit");
// 解除分配
Workbook = Unassigned;
Excel = Unassigned;

ShowMessage("ok");
}
[/code]
------
lee
編輯記錄
small7011 重新編輯於 2008-11-03 15:53:26, 註解 無‧
small7011 重新編輯於 2008-11-03 15:55:44, 註解 無‧
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-03 17:03:43 IP:59.124.xxx.xxx 訂閱
既然是CSV為什麼要用OLE...
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-03 17:54:56 IP:211.20.xxx.xxx 訂閱
Coffee 版主,我會用OLE是因為這樣的,本來我是用一般方式儲存資料,但是因為小弟我遇到一個問題,

我程式需要存放資料動作為:
開檔存資料
第1步 A1~A5160
第2步 B1~B5160
第3步 C1~C5160

一直到

第100步 CV1~CV5160
結束關檔

由於我不知道該怎麼從A5160跳到B1,B5160跳到C1,以此類推存放資料,
所以才用OLE方式可以直接存放到每個CELL,
但是OLE存檔速度太慢不符合我的需求,所以希望有人可以幫我
或者有什麼更好的方式可以處理
------
lee
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-03 18:25:18 IP:59.124.xxx.xxx 訂閱
在Excel裡面填完存成csv之後打開來瞧瞧格式如何?
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2008-11-03 18:29:11, 註解 無‧
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-03 18:48:52 IP:211.20.xxx.xxx 訂閱
我開檔時就設定成.csv,所以資料存檔後也是.csv
------
lee
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-03 18:50:27 IP:59.124.xxx.xxx 訂閱
我的意思是,自己開個Excel填值,再觀察一下它的格式,應該就可以滿足你的需求。

===================引 用 small7011 文 章===================
我開檔時就設定成.csv,所以資料存檔後也是.csv
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-03 19:00:03 IP:211.20.xxx.xxx 訂閱
您所謂的格式是指什麼,excel會有提示交我如何更換欄位嗎?那位置是在哪邊

因為我每筆資料有5160列,一共100個欄位,資料存放方式是固定的.
因為我真的不是很懂版主您的意思,所以希望可以描述清楚一點,謝謝



===================引 用 Coffee 文 章===================
我的意思是,自己開個Excel填值,再觀察一下它的格式,應該就可以滿足你的需求。

===================引 用 small7011 文 章===================
我開檔時就設定成.csv,所以資料存檔後也是.csv
------
lee
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-11-03 19:36:53 IP:122.118.xxx.xxx 未訂閱
你直接輸出檔案成 csv 不就好了嗎?
為什麼要脫褲子放屁?叫起 excel 又利用它來存 .csv?

===================引 用 small7011 文 章===================
您所謂的格式是指什麼,excel會有提示交我如何更換欄位嗎?那位置是在哪邊

因為我每筆資料有5160列,一共100個欄位,資料存放方式是固定的.
因為我真的不是很懂版主您的意思,所以希望可以描述清楚一點,謝謝



===================引 用 Coffee 文 章===================
我的意思是,自己開個Excel填值,再觀察一下它的格式,應該就可以滿足你的需求。

===================引 用 small7011 文 章===================
我開檔時就設定成.csv,所以資料存檔後也是.csv
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-11-03 19:57:56 IP:211.20.xxx.xxx 訂閱
各位板主,真是不好意思,也許是小弟描述的不清楚
那現在回歸小弟的問題

一 使用OLE要如何提升存檔速度,改存成xls

二 我直接輸出成csv不是問題,但是我需要按照特定規則存檔,
A1~A5160 ,然後跳到B1存檔到B5160,然後跳到C1存檔到C5160
問題在於我不會換欄位,希望版主們懂我的意思


------
lee
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-11-04 02:45:01 IP:122.120.xxx.xxx 訂閱
看一下你的程式碼,覺得以下的完整程式就是你要的吧? 非常快!

PS。只是幫版主們實踐所講述的意思,這樣你會較容易了解他們說的意思


[code cpp]

#include


FILE *fp;
if (NULL==(fp = fopen("d:\\test.csv","w")))
ShowMessage("Can't create file");
for (int i=1; i<= 5160; i )
{
fprintf(fp,"%d",i); //放外面為了加速不用if
for (int j=2;j<=100 ;j )
{
fprintf(fp,",%d",i*j);
}
fputs("\n",fp); //不用fprintf是為了加速

}
if (-1==fclose(fp))
ShowMessage("Can't Close file");
ShowMessage("File Done!");
[/code]
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2008-11-04 02:46:50, 註解 無‧
aftcast 重新編輯於 2008-11-04 02:55:13, 註解 無‧
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-11-04 09:39:19 IP:211.20.xxx.xxx 訂閱
aftcase 很感謝你的答覆,但是您儲存的方式不是我要的,
您的方式
A1,B1,C1.........CV1 換行 A2,B2,C2......CV2 換行.......A5160,B5160,C5160...........CV5160 結束

我需要方式
A1....A5160 換欄位 B1......B5160換欄位....CV1.....CV5160 結束


不知道這樣能理解我的需求嗎?
------
lee
編輯記錄
small7011 重新編輯於 2008-11-04 09:40:47, 註解 無‧
junlin
初階會員


發表:66
回覆:94
積分:42
註冊:2002-03-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-11-07 16:42:50 IP:220.130.xxx.xxx 訂閱
大量資料???
資料來源是什麼?
若是Dataset, 可以試試 xlsheet.range("A1").CopyFromRecordset(adoquery1);
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-11-07 16:56:56 IP:211.20.xxx.xxx 訂閱
我的資料來源是從測試機台得到的,會放在一個是先宣告好的陣列空間,我需要取100次
但是我目前的用法非常慢,所以希望可以用更快方法.
[code cpp]
void __fastcall TForm1::BtnNewFileClick(TObject *Sender)
{
AnsiString filename=GetCurrentDir() "\\a.csv";

if (FileExists(filename)){
DeleteFile(filename);
}

// Create a Excel Object
Excel=CreateOleObject("Excel.Application");
Excel.OlePropertySet("Visible", false);

// Product workbooks and workbook Object
Workbooks=Excel.OlePropertyGet("Workbooks");
Workbook=Workbooks.OleFunction("Add");

// Product worksheets and worksheet Object
Worksheets=Workbook.OlePropertyGet("Worksheets");
//Worksheet=Worksheets.OlePropertyGet("Item", 1);


for(int i=1;i<=100;i )
{
GetValue(); //從這行會的到一個一維陣列的數值,範圍是f[1]~f[5160]

for(int j=1;j<=5160;j )
{
// 設定值
Range=Worksheet.OlePropertyGet("Cells",j,i); //("Cells",列,欄位)
Range.OlePropertySet("Value",f[j]);
}
}

//保存文件
Workbook.OleProcedure("SaveAs",filename.c_str());
//end
Workbook.OleProcedure("Close");
Excel.OleFunction("Quit");
//解除分配
Workbook = Unassigned;
Excel = Unassigned;

ShowMessage("ok");
}
//---------------------------------------------------------------------------

[/code]
------
lee
編輯記錄
small7011 重新編輯於 2008-11-07 16:59:17, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-11-07 19:05:55 IP:60.248.xxx.xxx 訂閱
不久前你又問了一個同樣的csv的換位問題。其實是同一個問題(對你而言)…集中回應一個好嗎?
我不久前才剛回你下面這個問題,請去看一下!
http://delphi.ktop.com.tw/board.php?cid=168&fid=1499&tid=95883

此外,從你這裡的回答,我才發現你的來源是一個一維的陣列,那就宣告1個
指標陣列配合memcpy就非常的快速。還是請你回到上面的那個地方看答案吧!

可以告訴你,想使用ole加快速度是幾乎不可能的事。一定要用低階基本的處理方式才會快!
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#15 引用回覆 回覆 發表時間:2008-11-07 19:13:42 IP:59.124.xxx.xxx 訂閱
我還以為已經知道才結案,沒想到是這樣..
如果不想被念可以不要來問..
CSV格式本來就是個純文字的格式,要你打開來觀察應該沒有很難吧?
搜尋一下就是一堆csv的討論,你有認真看過嗎?

===================引 用 aftcast 文 章===================
不久前你又問了一個同樣的csv的換位問題。其實是同一個問題(對你而言)…集中回應一個好嗎?
我不久前才剛回你下面這個問題,請去看一下!
http://delphi.ktop.com.tw/board.php?cid=168&fid=1499&tid=95883

此外,從你這裡的回答,我才發現你的來源是一個一維的陣列,那就宣告1個
指標陣列配合memcpy就非常的快速。還是請你回到上面的那個地方看答案吧!

可以告訴你,想使用ole加快速度是幾乎不可能的事。一定要用低階基本的處理方式才會快!
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#16 引用回覆 回覆 發表時間:2008-11-10 09:46:06 IP:211.20.xxx.xxx 訂閱
很抱歉~~我不擔心被各位唸,畢竟我是來這邊受教的,因為之前那個我不小心結案了,我怕結案的東西沒有人會回答
所以才另外開了一個,謝謝個位批評指教,我會重新整理各位給我的資料,謝謝
------
lee
系統時間:2017-10-24 13:39:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!