提升Exel OLE存放資料速度 |
答題得分者是:aftcast
|
small7011
一般會員 發表:19 回覆:34 積分:10 註冊:2007-07-24 發送簡訊給我 |
我有一個問題想請教各位,在使用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 |
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
|
small7011
一般會員 發表:19 回覆:34 積分:10 註冊:2007-07-24 發送簡訊給我 |
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 發送簡訊給我 |
|
small7011
一般會員 發表:19 回覆:34 積分:10 註冊:2007-07-24 發送簡訊給我 |
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
|
small7011
一般會員 發表:19 回覆:34 積分:10 註冊:2007-07-24 發送簡訊給我 |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
你直接輸出檔案成 csv 不就好了嗎?
為什麼要脫褲子放屁?叫起 excel 又利用它來存 .csv? ===================引 用 small7011 文 章=================== 您所謂的格式是指什麼,excel會有提示交我如何更換欄位嗎?那位置是在哪邊 因為我每筆資料有5160列,一共100個欄位,資料存放方式是固定的. 因為我真的不是很懂版主您的意思,所以希望可以描述清楚一點,謝謝 ===================引 用 Coffee 文 章=================== 我的意思是,自己開個Excel填值,再觀察一下它的格式,應該就可以滿足你的需求。 ===================引 用 small7011 文 章=================== 我開檔時就設定成.csv,所以資料存檔後也是.csv |
small7011
一般會員 發表:19 回覆:34 積分:10 註冊:2007-07-24 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
看一下你的程式碼,覺得以下的完整程式就是你要的吧? 非常快!
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 |
small7011
一般會員 發表:19 回覆:34 積分:10 註冊:2007-07-24 發送簡訊給我 |
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 發送簡訊給我 |
|
small7011
一般會員 發表:19 回覆:34 積分:10 註冊:2007-07-24 發送簡訊給我 |
我的資料來源是從測試機台得到的,會放在一個是先宣告好的陣列空間,我需要取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 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
不久前你又問了一個同樣的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 發送簡訊給我 |
我還以為已經知道才結案,沒想到是這樣..
如果不想被念可以不要來問.. 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |