全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:5076
推到 Plurk!
推到 Facebook!

BCB上開啟已儲存的EXCEL檔案?

答題得分者是:timhuang
jimmy_lou45
一般會員


發表:10
回覆:18
積分:5
註冊:2003-07-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-21 16:31:19 IP:140.134.xxx.xxx 未訂閱
我用OpenDialog元件 可是好像不能使用.. 我的程式是用BCB寫的 大家討論的都是Delphi的語法 可是我不知道用bcb的語法 如何, "在BCB中按一個按鈕"->"跑出我已經有存檔的EXCEL檔案,且秀出EXCEL畫出的圖形ㄋ?" 我上面的步驟都做出來了 只是,好像是range設定有問題..所以 跑不出來我所要的圖形... 可否麻煩您看一下... void __fastcall TForm1::Button1Click(TObject *Sender) { if(OpenDialog1->Execute()) { excel=CreateOleObject("excel.Application"); excel.OlePropertySet("Visible",1); WORKbooks=excel.OlePropertyGet("Workbooks"); //產生Workbooks WORKbook=WORKbooks.OleFunction("Add"); WORKsheets=WORKbook.OlePropertyGet("Worksheets"); WORKsheet=WORKsheets.OlePropertyGet("Item",1);//設定頁次 Range = WORKsheet.OlePropertyGet("Range","D2:E629"); Range.OlePropertyGet("Select"); chart=WORKbook.OlePropertyGet("Charts"); chart.OleFunction("add"); ActiveChart=WORKbook.OlePropertyGet("ActiveChart"); ActiveChart.OlePropertySet("ChartType",0x00000039); ----------------------------- 我是參考您發表的文章,下面的"巨集"寫的 Range("D2:E629").Select Charts.Add ActiveChart.ChartType = xlBarClustered ActiveChart.SetSourceData Source:=Sheets("Sheet3").Range("D2:E629"), PlotBy _ :=xlColumns ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet3" With ActiveChart .HasTitle = True .ChartTitle.Characters.Text = "中心" .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "進給量" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "半徑" End With
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-21 20:23:15 IP:61.62.xxx.xxx 未訂閱
hi, 請問你是要問開啟一個excel檔案, 還是要在 excel 檔案中放一個圖檔(或是圖表)? 一種是讀檔, 一種是對檔案的操作, 可能的話, 可以描述的清楚一點嗎?
jimmy_lou45
一般會員


發表:10
回覆:18
積分:5
註冊:2003-07-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-21 22:55:32 IP:140.134.xxx.xxx 未訂閱
您好: 我的問題是:1.在bcb裡開啟一個已經儲存在我硬碟中的excel檔案 (這一步我已經小小的試出來了,但是...不知道這樣寫對不對?執行的結果是可以跑出我已經儲存在硬碟裡excel的檔案)(就是程式裡面只有key第一行的時候,我已經有編號了,請參照下面我的程式)    2.我指定欄位(指定兩行)是為了畫出那兩"行"數值所代表的圖形         (就是,excel中不是有畫圖的功能嗎?先圈選一個欄位的範圍,再按一下那個圖示,圖形就會跑出來的那個操作方法!)    3 如果我指定欄位的話,(程式再加上2~8行) 發生我 "附加檔案的錯誤圖示") 還是我所寫的有錯? 第2~8行是否為我所想像的"圈選excel欄位,然後畫出來"的意思??    若還有語意不清楚的地方,還麻煩告知... (很糟糕的是,我還不到24小時,人家就趕的要結果看了,還請多多幫忙~謝謝)    //---------------------------------------------------------------------------    #include  #pragma hdrstop #include #include #include #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; Variant excel,WORKbooks,WORKbook,WORKsheets,WORKsheet,CELL,chart,Range,ActiveChart; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { 1. ShellExecute(Handle,NULL,"2.xls", NULL, NULL, SW_SHOWNORMAL); 2. excel=CreateOleObject("excel.Application"); 3. Range = WORKsheet.OlePropertyGet("Range","D2:E629"); 4. Range.OlePropertyGet("Select"); 5. chart=WORKbook.OlePropertyGet("Charts"); 6. chart.OleFunction("add"); 7. ActiveChart=WORKbook.OlePropertyGet("ActiveChart"); 8. ActiveChart.OlePropertySet("ChartType",0x00000039); } //---------------------------------------------------------------------------
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-22 23:21:30 IP:61.62.xxx.xxx 未訂閱
hi, 若是使用 Delphi 的話, 可以這樣寫:
procedure TForm1.Button1Click(Sender: TObject);
var
  ex, wb, ws, ch: Variant;
begin
  ex := CreateOleObject('Excel.Application');
  wb := ex.WorkBooks.Open('c:\1.xls');
  ws := wb.WorkSheets['Sheet1'];
  ex.Visible := true;
  ch := ex.Charts.Add;
  // xlColumnClustered = 51  長條圖
  ch.ChartType := 51;
  // xlColumns = 2
  ch.SetSourceData(Source:=ws.Range['A1:B7'], PlotBy:=2);
  // xlLocationAsObject = 2
  ch.Location(Where:=2, Name:='Sheet1');
end;
改為 bcb 的話, 如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Variant ex, wb, ws, ch;
  ex = CreateOleObject("Excel.Application");
  wb = ex.OlePropertyGet("WorkBooks").OleFunction("Open", "C:\\1.xls");
  ws = wb.OlePropertyGet("WorkSheets", "Sheet1");
  ex.OlePropertySet("Visible", true);
  ch = ex.OlePropertyGet("Charts").OleFunction("Add");
  ch.OlePropertySet("ChartType", 51);
  ch.OleFunction("SetSourceData", ws.OlePropertyGet("Range","A1:B7"), 2);
  ch.OleFunction("Location", 2, "Sheet1");
}
附上相關的資料與討論: http://www.progz.ru/viewtopic.php?t=1237 http://www.cbuilder.ru/WinLesson/bles1_2.htm 發表人 - timhuang 於 2003/07/22 23:30:13
jimmy_lou45
一般會員


發表:10
回覆:18
積分:5
註冊:2003-07-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-28 10:51:33 IP:140.134.xxx.xxx 未訂閱
您好 我try了之後,有一步過不了,是否請您看一下這個錯誤! 謝謝!! [C Error] Unit1.cpp(22): E2268 Call to undefined function 'CreateOleObject'
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-28 12:51:59 IP:203.95.xxx.xxx 未訂閱
hi, 這是因為你要用 comobj 這個 include file!    
#include     
發表人 - timhuang 於 2003/07/28 12:53:05
jimmy_lou45
一般會員


發表:10
回覆:18
積分:5
註冊:2003-07-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-28 14:09:01 IP:140.134.xxx.xxx 未訂閱
您好 我已經將那個檔案 #include  #pragma hdrstop #include ~~~~~~~~~~~~~~~~~~~~~~ #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; 可使還是會出現以下的錯誤耶!! 謝謝!! Build [C Error] Unit1.cpp(5): E2209 Unable to open include file 'Comobj.h' [C Error] Unit1.cpp(21): E2268 Call to undefined function 'CreateOleObject'
jimmy_lou45
一般會員


發表:10
回覆:18
積分:5
註冊:2003-07-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-28 14:10:01 IP:140.134.xxx.xxx 未訂閱
您好 我已經將那個檔案 #include  #pragma hdrstop #include ~~~~~~~~~~~~~~~~~~~~~~ #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; 可使還是會出現以下的錯誤耶!! 謝謝!! Build [C Error] Unit1.cpp(5): E2209 Unable to open include file 'Comobj.h' [C Error] Unit1.cpp(21): E2268 Call to undefined function 'CreateOleObject'
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-28 15:57:26 IP:61.218.xxx.xxx 未訂閱
引言: 您好 我已經將那個檔案
#include 
#pragma hdrstop
#include 
~~~~~~~~~~~~~~~~~~~~~~
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
可使還是會出現以下的錯誤耶!! 謝謝!! Build [C Error] Unit1.cpp(5): E2209 Unable to open include file 'Comobj.h' [C Error] Unit1.cpp(21): E2268 Call to undefined function 'CreateOleObject'
我猜想你的C Builder應該是BCB5吧! 試試同時include
#include 
#include 
HAVE A NICE DAY FOR YOU
jimmy_lou45
一般會員


發表:10
回覆:18
積分:5
註冊:2003-07-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-07-28 17:43:43 IP:140.134.xxx.xxx 未訂閱
我剛剛已經試成功了耶!(我用的是bcb6) 真的很謝謝您.. 但是,再請問一下 ch.OleFunction("SetSourceData", ws.OlePropertyGet("Range","A1:B7"), 2); //這一行程式應該是設定"range"的吧?那請問一下,"2"是代表什麼意思ㄋ? ch.OleFunction("Location", 2, "Sheet1"); //相同的,這行程式,"Location", 2, "Sheet1"....這3個東西,各是代表什麼ㄋ? 還有,請問一下,執行完此程式後,我把bcb6關掉,要直接開啟excel檔案,就開不起來了,我之前有看過相關文章,好像是要釋放excel? 不知道,該如何撰寫?? 謝謝您....
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-07-28 19:04:20 IP:203.95.xxx.xxx 未訂閱
在上面的 delphi 版的那篇內有常數說明,  ch.OleFunction("SetSourceData", ws.OlePropertyGet("Range","A1:B7"), 2); //這一行程式應該是設定"range"的吧?那請問一下,"2"是代表什麼意思ㄋ? 是 PlotBy = xlColumn 的意思, 就是資料是直的或是橫的, (以column為資料或是以row為資料的一個參數) ch.OleFunction("Location", 2, "Sheet1"); //相同的,這行程式,"Location", 2, "Sheet1"....這3個東西,各是代表什麼ㄋ? 這裡的 Location 就是 ole 的 function name, 也是一樣, 參數 delphi 版的你會比較容易看懂: ch.Location(Where:=2, Name:='Sheet1'); 意思是將這個圖的貼上 sheet1 as a object, 將圖貼入 sheet1 工作表如同一個物件一樣, 其中的 2 代表著 xlLocationAsObject 之所以會將 delphi 版的作法貼出來就是給你參考, 比較容易看得懂.
jimmy_lou45
一般會員


發表:10
回覆:18
積分:5
註冊:2003-07-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-07-29 14:23:11 IP:140.134.xxx.xxx 未訂閱
謝謝您的回答 不過,excel 的釋放 在 bcb 中不知該如何賺寫? 謝謝您~
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-07-29 16:10:37 IP:203.95.xxx.xxx 未訂閱
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Variant ex, wb, ws, ch;
  ex = CreateOleObject("Excel.Application");
  wb = ex.OlePropertyGet("WorkBooks").OleFunction("Open", "C:\\1.xls");
  ws = wb.OlePropertyGet("WorkSheets", "Sheet1");
  ex.OlePropertySet("Visible", true);
  ch = ex.OlePropertyGet("Charts").OleFunction("Add");
  ch.OlePropertySet("ChartType", 51);
  ch.OleFunction("SetSourceData", ws.OlePropertyGet("Range","A1:B7"), 2);
  ch.OleFunction("Location", 2, "Sheet1");
//以下為釋放:
  ex.OleFunction("Quit");
  ex = Unassigned;
}
jimmy_lou45
一般會員


發表:10
回覆:18
積分:5
註冊:2003-07-13

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-07-29 18:16:13 IP:140.134.xxx.xxx 未訂閱
請問一下 我將 //以下為釋放:   ex.OleFunction("Quit");   ex = Unassigned; 引用至botton2中,想說您的用意可能是要按下另一個"botton"來釋放excel? (還是您的意思,是跟放在之前的程式下面,直接接下去這樣?) 可是我照這樣做了後 出現了"附加檔案"的情形 還麻煩您看一下..
jimmy_lou45
一般會員


發表:10
回覆:18
積分:5
註冊:2003-07-13

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-07-29 18:21:47 IP:140.134.xxx.xxx 未訂閱
抱歉 可是我如果將Variant ex, wb, ws, ch; 宣告成"全域變數"的話.. 檔案就可以 run 了.. 可否解答一下? ---------------------------------------- 因為第一次我在try時 我在botton2裡也是"照本宣科"的宣告Variant ex, wb, ws, ch;(宣告成區域變數) 而botton1裡也有宣告"相同的區域變數" 不知是否是這個原因,才導致我這樣不能run?
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-07-29 23:23:26 IP:61.62.xxx.xxx 未訂閱
ok, 那是因為你將離開的程式碼寫在另一個 button2 的 onclick event 中了, 這樣在 button1 中的 Variant ex 的 scope 是無法在 button2 中使用的, 所以你將 ex 放在外面的話, 就可以讓該 ex 變數讓兩個 button 的 onclick event 都讀得到沒錯. 其他的 wb, ws, ch 則只有在 button1 中使用的話, 就可以不用提出來放了.  這個問題是一個變數視界(variable scope)的問題哦!
jimmy_lou45
一般會員


發表:10
回覆:18
積分:5
註冊:2003-07-13

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-07-30 22:03:10 IP:140.134.xxx.xxx 未訂閱
抱歉 我的觀念陳述給您聽一次,若有錯誤,還請您糾正 ex 因為在botton1和botton2中都有用到 所以要放在"全域變數"來宣告 如果各在botton1和botton2中宣告成"區域變數" 則程式會出現??的問題?? 謝謝!!
系統時間:2024-11-21 22:21:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!