|
|
2007/5/16 上午 11:09:55
各位先進大家好:
以_Application為例
在VC60載入Excel.exe會產生excel9.cpp和excel9.h檔, 然後#include "excel9.h" 和宣告_Application exlapp後,執行是OK的
在VS80載入Excel.exe會產生CApplication.h檔, 然後在***Dlg.cpp #include "CApplication.h", 執行後,就出現一連串以下錯誤訊息
error C2371: 'FontPtr' : 重複定義; 基本型別不相同 error C2786: 'BOOL (__stdcall *)(HDC,int,int,int,int)' : __uuidof 的運算元無效 error C2923: '_com_IIID' : 對參數 'Rectangle' 而言,'<未知>' 不是有效的 <未知> 型別引數 error C3203: '_com_IIID' : 非特製化類別 樣板 不可做為 樣板 引數 (對 樣板 參數 '_IIID' 而言),它必須是實際型別 error C2786: 'BOOL (__stdcall *)(HDC,int,int,int,int,int,int,int,int)' : __uuidof 的運算元無效 error C2923: '_com_IIID' : 對參數 'Arc' 而言,'<未知>' 不是有效的 <未知> 型別引數 error C3203: '_com_IIID' : 非特製化類別 樣板 不可做為 樣板 引數 (對 樣板 參數 '_IIID' 而言),它必須是實際型別 error C2371: 'PicturePtr' : 重複定義; 基本型別不相同 . . . 等等,共超過100個錯誤訊息
小弟遇到這問題已想好多天了,無法解決,請各位先進幫幫小弟,感激不盡,謝謝
|
|
|
|
2007/5/16 下午 10:35:22
>各位先進大家好: > >以_Application為例 > > 在VC60載入Excel.exe會產生excel9.cpp和excel9.h檔, >然後#include 'excel9.h' >和宣告_Application exlapp後,執行是OK的 > > 在VS80載入Excel.exe會產生CApplication.h檔, >然後在***Dlg.cpp #include 'CApplication.h', >執行後,就出現一連串以下錯誤訊息 > >error C2371: ''FontPtr'' : 重複定義; 基本型別不相同 > error C2786: ''BOOL (__stdcall *)(HDC,int,int,int,int)'' : __uuidof 的運算元無效 >error C2923: ''_com_IIID'' : 對參數 ''Rectangle'' 而言,''<未知>'' 不是有效的 <未知> 型別引數 >error C3203: ''_com_IIID'' : 非特製化類別 樣板 不可做為 樣板 引數 (對 樣板 參數 ''_IIID'' 而言),它必須是實際型別 >error C2786: ''BOOL (__stdcall *)(HDC,int,int,int,int,int,int,int,int)'' : __uuidof 的運算元無效 >error C2923: ''_com_IIID'' : 對參數 ''Arc'' 而言,''<未知>'' 不是有效的 <未知> 型別引數 >error C3203: ''_com_IIID'' : 非特製化類別 樣板 不可做為 樣板 引數 (對 樣板 參數 ''_IIID'' 而言),它必須是實際型別 >error C2371: ''PicturePtr'' : 重複定義; 基本型別不相同 >. >. >. >等等,共超過100個錯誤訊息 > >小弟遇到這問題已想好多天了,無法解決,請各位先進幫幫小弟,感激不盡,謝謝 >
這段要註解掉.VS 2005 技術對我而言太新了,所以 I don't Know 原因,但確定 Excel 可以用.後遺症自行承擔.
// CApplication.h #import "C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" no_namespace
其他部分就注意字串型態的轉換.
ps: 用 VC 寫 Excel VBA 其函數因無使用說明文件,要不斷的 try, 我預料你可能會想放棄.希望你能多試幾個月,寫出使用教學文 件造福大眾.
|
|
|
|
2007/5/17 下午 08:08:52
>這段要註解掉.VS 2005 技術對我而言太新了,所以 I don''t Know >原因,但確定 Excel 可以用.後遺症自行承擔. > >// CApplication.h >#import 'C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE' no_namespace > >其他部分就注意字串型態的轉換. >
後來又試一下,果然有後遺症,因為網路上用此方法的人極少, 資料難找,也意謂著不只一種方法,我知道的有3種方式,包括 你這種,這是最少人用的,原因可能跟沒說明文件有關.
所以用 VS 2005 方式產生的 CApplication 物件,我必須 聲明目前試不出來,但是有種方式可以彌補,就是把 VC 6.0 產生的 excel.cpp 及 excel.h 供 VS 2005 使用,不要用 VS 2005 產生的 CApplication.h,經測試結果一切正常, 記得轉換字串型態.
|
|
|
|
2007/5/17 下午 09:39:45
我在VC8裡存取excel資料, 也是直接用VC6產生出來的excel9.cpp與excel9.h, 主要是原程式碼在VC6已寫好, porting到VC8時便懶得再改, 而且用起來也沒什麼問題. 如果VC8一直試不出來的話, 何妨直接使用VC6的程式碼.
|
|
|
|
2007/5/17 下午 10:31:32
我用的是 Office11, VC++8 #import 產生的是 *.tlh 及 *.tli.
用以下的 #import:
#import "/Program Files/Common Files/Microsoft Shared/OFFICE11/MSO.DLL" \ rename("RGB", "XL_RGB") \ rename("DocumentProperties", "XL_DocumentProperties") \ rename("SearchPath", "XL_SearchPath")
#import "/Program Files/Common Files/Microsoft Shared/VBA/VBA6/VBE6EXT.OLB"
#import "/Program Files/Microsoft Office/OFFICE11/Excel.exe" \ no_auto_exclude \ rename("RGB", "XL_RGB") \ rename("DialogBox", "XL_DialogBox") \ rename("CopyFile", "XL_CopyFile") \ rename("ReplaceText", "XL_ReplaceText")
給你做參考, 看有沒有用.
|
|
|
|
2007/5/18 下午 12:01:06
感謝各位大大幫忙
問題提出好多天,原本以為沒有人會幫我,所以我只好一直try和找資料,最後只好拿VC60建立好的execl.cpp和excel.h檔,放到VC++ 8裡試試看,果然可以,再加上一些找來的資料,現在已可以RUN了,也可以順利的寫到Excel裡並存檔,我將我的CODE POST上,希望需要的人,不必再像我一樣,周旋那麼久才完成
BOOL CVc80Excel2003App::InitInstance() { //=====自行加入===== if(!AfxOleInit()) // Your addition starts here. { AfxMessageBox(_T("Cannot initialize COM dll") ,16); return false; // End of your addition. } //=====自行加入=====
AfxEnableControlContainer(); return false;
}
在Button程序上加入 if(!exlapp.CreateDispatch(_T("Excel.Application"))) { AfxMessageBox(_T("無法啟動Excel服務器!"), 16); return; }
COleVariant avar((long)DISP_E_PARAMNOTFOUND, VT_ERROR); exlapp.SetVisible(false);//使Excel不可見 exlapp.SetUserControl(true);//允許其它用戶控制Excel,否則Excel將一閃即逝.
//Open an excel file Tchar path[MAX_PATH]; GetCurrentDirectory(MAX_PATH,path); CString strPath = path; strPath += "\\GLASS PRINTING_CpCpk format sheet_Apple";
wbks.AttachDispatch(exlapp.GetWorkbooks());
lpDisp=wbks.Open(strPath, avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar);
wbk.AttachDispatch(lpDisp); whts.AttachDispatch(wbk.GetWorksheets()); lpDisp=wbk.GetActiveSheet(); wht.AttachDispatch(lpDisp);
usedRange.AttachDispatch(wht.GetUsedRange()); range.AttachDispatch(usedRange.GetRows()); long iRowNum=range.GetCount();//已經使用的行數 range.AttachDispatch(wht.GetCells());
range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(1)),COleVariant(_T("1")));
range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(2)),COleVariant(_T("2")));
range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(3)),COleVariant(_T("3")));
wbk.Save(); wbks.Close(); exlapp.Quit();
wbks.ReleaseDispatch(); //釋放發送 exlapp.ReleaseDispatch();
另請教各位大大
1.要增加工作表,程式須加上什麼程序
2.如果要指定工作表讀寫 ,程式上須要怎麼修改
3.在程式結束時,才去執行以下程序,但發覺,需要等一段時間才會順利結束程式,請問這是為什麼,還是我放錯地方 wbks.Close(); exlapp.Quit(); wbks.ReleaseDispatch(); //釋放發送 exlapp.ReleaseDispatch();
4.以下的類別各代表什麼意思,找了一堆資料,只知道程式是這麼寫,但不知其意思。 _Application exlapp; _Workbook wbk; Workbooks wbks; _Worksheet wht; Worksheets whts; LPDISPATCH lpDisp; Range range; Range usedRange;
|
|
|
|
2007/5/18 下午 03:57:21
>4.以下的類別各代表什麼意思,找了一堆資料,只知道程式是這麼寫,但不知其意思。
以下是我的理解, 謹供參考:
1._Application是指excel應用程式, 以下列方式啟動:
_Application excel_ap.CreateDispatch("Excel.Application");
2.Workbooks是excel目前開啟的所有檔案, 由下列方式取得:
Workbooks workbooks = excel_ap.GetWorkbooks();
3._Workbook是指向現在要處理的檔案, 可由下列方式開啟:
_Workbook workbook = workbooks.Open(filename,....);
4.Worksheets表示目前檔案裡的所有sheet, 可由下列方式取得:
Worksheets sheets = workbook.GetWorksheets();
5._Worksheet指向目前要處理的sheet, 可由下列方式取得:
_Worksheet worksheet = sheets.GetItem(COleVariant(i));
i表示第幾個sheet, 由1開始.
6.Range是指向sheet裡的某個範圍, 就像在excel中mark一個範圍相同, 可經由此進行資料的存取
7.LPDISPATCH是指向IDispatch, 前述的物件都是透過IDispatch這個Interface與excel做溝通的.
|
|
|
|
2007/5/18 下午 08:00:47
>感謝各位大大幫忙 > >問題提出好多天,原本以為沒有人會幫我,所以我只好一直try和找資料,最後只好拿VC60建立好的execl.cpp和excel.h檔,放到VC++ 8裡試試看,果然可以,再加上一些找來的資料,現在已可以RUN了,也可以順利的寫到Excel裡並存檔,我將我的CODE POST上,希望需要的人,不必再像我一樣,周旋那麼久才完成 >
post 到 VC.NET 沒人回很正常,MFC 問題以後到這裡問,Windows Form 到 VC.NET.
>另請教各位大大 > >1.要增加工作表,程式須加上什麼程序 >
whts.Add(avar,avar,avar,avar);
>2.如果要指定工作表讀寫 ,程式上須要怎麼修改 >
看不懂意思,舉個實例詳細說明.
>3.在程式結束時,才去執行以下程序,但發覺,需要等一段時間才會順利結束程式,請問這是為什麼,還是我放錯地方 >wbks.Close(); >exlapp.Quit(); >wbks.ReleaseDispatch(); //釋放發送 >exlapp.ReleaseDispatch(); >
ReleaseDispatch() 不用加,只要離開 scope range, book, chart, chartobjects, sheet, and app 會自 動釋放.
速度慢是因為你電腦慢和程式無關.
|
|
|
|
2007/5/18 下午 11:18:18
各位大大你們好: 首先感謝各位大大的不吝指教
>Worksheets表示目前檔案裡的所有sheet, 可由下列方式取得: >Worksheets sheets = workbook.GetWorksheets(); 請問取得後,要怎麼才能知道目前所指定要處理的檔案,共有幾個sheets? 經查看後,所傳回值是LPDISPATCH型態,無法看出有幾個sheets
>post 到 VC.NET 沒人回很正常,MFC 問題以後到這裡問,Windows >Form 到 VC.NET.
請問Windows Form 到 VC.NET.討論區是在那裡,有網址嗎?
>2.如果要指定工作表讀寫 ,程式上須要怎麼修改
>看不懂意思,舉個實例詳細說明.
比如說有A, B, C三個工作表,現在資料要讀出B工作表,或寫入B工作表,程式上須加那些程序?
1.新增工作表,要如何指定工作表名稱,指定新增在第幾個sheet
2.如要將COleVariant avar((long)DISP_E_PARAMNOTFOUND, VT_ERROR);分解成 COleVariant avar; avar. 請問後面要怎麼接?
3.請問以下Code 為什麼用avar就可以了?經上一題程序後,avar會是什麼樣的東西? lpDisp=wbks.Open(strPath, avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar);
whts.Add(avar,avar,avar,avar);
4.經測試後發覺,在VC上 _T("123")的文字,到了Excel就成數字, 請問在VC是文字的型態,寫入Excel後也同樣是文字,要加那些程序
|
|
|
|
2007/5/19 下午 03:16:51
>各位大大你們好: >首先感謝各位大大的不吝指教 > >>Worksheets表示目前檔案裡的所有sheet, 可由下列方式取得: >>Worksheets sheets = workbook.GetWorksheets(); >請問取得後,要怎麼才能知道目前所指定要處理的檔案,共有幾個sheets? >經查看後,所傳回值是LPDISPATCH型態,無法看出有幾個sheets > > >>post 到 VC.NET 沒人回很正常,MFC 問題以後到這裡問,Windows >>Form 到 VC.NET. > >請問Windows Form 到 VC.NET.討論區是在那裡,有網址嗎? > >
我是指 Visual C++ .NET 討論區,Windows Form 的人大部份 用C#,微軟也是建議用C#,沒人氣.
因為我 VS 2005 Help 沒辦法用要重灌作業系統,所以最晚明天 或後天回你其他問題,Excel 的說明檔有 Excel VBA 文件,你先看 ,其實這也不是很難,只是要用較聰明的方式 try 才能成功,基本上 VBA是給 VB 用的,用 VC 開發會比較累,市面上也沒書,不過你不 用擔心,VBA 是我以前的工作項目,應該可以幫你解決所有問題.
|
|
|
|
2007/5/19 下午 10:53:10
> >比如說有A, B, C三個工作表,現在資料要讀出B工作表,或寫入B工作表,程式上須加那些程序? > >
是怎麼讀取,一個個步驟寫清楚,這樣才能回答你想要的.
> >1.新增工作表,要如何指定工作表名稱,指定新增在第幾個sheet > >
a.指定工作表名稱用 Worksheet 的 SetName function. b.指定新增在第幾個sheet用 Worksheet 的 Move function.
>2.如要將COleVariant avar((long)DISP_E_PARAMNOTFOUND, VT_ERROR);分解成 > COleVariant avar; > avar. 請問後面要怎麼接? >
COleVariant avar; avar.vt = VT_ERROR; V_ERROR(&avar) = DISP_E_PARAMNOTFOUND;
>3.請問以下Code 為什麼用avar就可以了?經上一題程序後,avar會是什麼樣的東西? > lpDisp=wbks.Open(strPath, > avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar); > > whts.Add(avar,avar,avar,avar); > >
因為open 參數是 VARIANT 型態, MSDN 有詳細說明.
>4.經測試後發覺,在VC上 _T('123')的文字,到了Excel就成數字, > 請問在VC是文字的型態,寫入Excel後也同樣是文字,要加那些程序 >
NumberFormatLocal
ps: 你可以買本 VBA 的書,雖然是用 VB 語法寫但是很有參考價值,不 過使用VC 時,要懂 COM 元件的基本觀念,不然你會寫得很辛苦.畢 竟用法有差異.try 程式還是要有基本功.
你這是公司的專案嗎? 如果是有問題就趕快問,如果不是就多想幾 小時,這樣對 coding 有助益.
|
|
|
|
2007/5/23 下午 03:53:22
各位大大你們好: 不好意思,因臨時出差,今天才回來,請見諒
>我是指 Visual C++ .NET 討論區,Windows Form 的人大部份 >用C#,微軟也是建議用C#,沒人氣. 同樣的問題,我也在Visual C++ .NET 討論區POST過,但是都沒人可以幫我
>NumberFormatLocal 請問NumberFormatLocal是什麼function,在 exlapp; wbk; wbks; wht; whts; range; 裡都找不到NumberFormatLocal function
>比如說有A, B, C三個工作表,現在資料要讀出B工作表,或寫入B工作表,程式 >上須加那些程序? > >是怎麼讀取,一個個步驟寫清楚,這樣才能回答你想要的.
1.比如說要從B工作表的B6儲存格,讀取資料,要加什麼程序?要用什麼資料型態來接? 2.比如說要將資料寫到B工作表的C9,可以這樣寫 range.SetItem(COleVariant(9), COleVariant(3), COleVariant(_T("123")); 現在問題來了, 1.要怎麼指定B工作表 2.寫入的_T("123"),在Excel裡會將123當成數字,但要如入何設定儲存格格式,比如說在Excel裡可以顯示123.00或 $123.00? 除了事先在Excel裡設定儲存格格式外,還有沒有其他方法?
>b.指定新增在第幾個sheet用 Worksheet 的 Move function. Move function,小弟試了很多次,試不出來 VARIANT 是什麼型態呢? 比如說要在第五個sheet新增一"MFC"工作表,要加入什麼程序
A.在A工作表寫入資料完成後,下一筆資料要寫到B工作表的C8儲存格 請問要怎麼切換A工作表和B工作表
B.執行 wbk.Save(); 指令後,會顯示"檔案已被修改,您是否要儲存檔案", 當按下確定鈕時,會出現"另存新檔"視窗,請問在程序上,要如何修改
|
|
|
|
2007/5/23 下午 07:29:45
>各位大大你們好: >不好意思,因臨時出差,今天才回來,請見諒 > >>我是指 Visual C++ .NET 討論區,Windows Form 的人大部份 >>用C#,微軟也是建議用C#,沒人氣. >同樣的問題,我也在Visual C++ .NET 討論區POST過,但是都沒人可以幫我 >
他們沒時間幫你 try,大家工作都忙.
> >>NumberFormatLocal >請問NumberFormatLocal是什麼function,在 >exlapp; >wbk; >wbks; >wht; >whts; >range; > >裡都找不到NumberFormatLocal function > > >
range.SetNumberFormat(COleVariant(_T("@")));
|
|
|
|
2007/5/23 下午 07:42:28
>>b.指定新增在第幾個sheet用 Worksheet 的 Move function. >Move function,小弟試了很多次,試不出來 > VARIANT 是什麼型態呢? >比如說要在第五個sheet新增一'MFC'工作表,要加入什麼程序 >
post 你的 sample.其實這個要試出來不容易,花了我幾個小時, 這個問題值 10000 元,但說穿了一文不值.
> >A.在A工作表寫入資料完成後,下一筆資料要寫到B工作表的C8儲存格 >請問要怎麼切換A工作表和B工作表 > >
sheet = sheets.GetItem(COleVariant((short)3)); sheet.Activate();
>B.執行 wbk.Save(); 指令後,會顯示'檔案已被修改,您是否要儲存檔案', >當按下確定鈕時,會出現'另存新檔'視窗,請問在程序上,要如何修改 > >
你是想改成怎樣,詳列步驟.
|
|
|
|
2007/5/23 下午 09:22:58
>比如說有A, B, C三個工作表,現在資料要讀出B工作表, >或寫入B工作表,程式 >上須加那些程序? > >是怎麼讀取,一個個步驟寫清楚,這樣才能回答你想要的.
1.比如說要從B工作表的B6儲存格,讀取資料,要加什麼程 序?要用什麼資料型態來接? 看什麼型態,自己轉換. Range range; range = sheet.GetRange(COleVariant(_T("c1")), COleVariant(_T("c1"))); COleVariant cov1; cov1 = range.GetValue2(); CString str= (LPCWSTR) cov1.bstrVal; 2.比如說要將資料寫到B工作表的C9,可以這樣寫 range.SetItem(COleVariant(9), COleVariant(3), COleVariant(_T("123")); 現在問題來了, 1.要怎麼指定B工作表 2.寫入的_T("123"),在Excel裡會將123當成數字,但 要如入何設定儲存格格式,比如說在Excel裡可以顯示 123.00或 $123.00? 除了事先在Excel裡設定儲存格格式外,還有沒有其他 方法?
sheet = sheets.GetItem(COleVariant((short)3)); // 指定x工作表 range = sheet.GetRange(COleVariant(_T("a1")), COleVariant(_T("d40"))); range.SetItem(COleVariant((short)9), COleVariant((short)3), COleVariant(_T("123"))); range.SetNumberFormat(COleVariant(_T("@")));
|
|
|
|
2007/5/23 下午 09:37:18
如果不想開啟或存檔時跳出詢問視窗, 可以用下列函數做一些設定. 意義的話, 看函數名稱應該會有所了解.
_Application excel_app;
excel_app.SetAlertBeforeOverwriting(false); excel_app.SetDisplayAlerts(false); excel_app.SetEnableEvents(false); excel_app.SetAskToUpdateLinks(false); excel_app.SetEnableAnimations(false);
|
|
|
|
2007/6/10 下午 09:53:07
最近看到了這個討論串,也使用Excel9.h & Excel9.cpp在VS8試做了一下,可以成功讀取與寫入Excel文件,但是將執行檔拿到別的電腦時卻無法執行,不知道原因為何,是否要載入些什麼元件?
|
|
|
|
2007/6/23 下午 11:19:03
我在六月初也剛用VC6搞定Excel與PowerPoint....如果早點看到這篇....我就不會那麼累了...
|
|
|
|
|
|
|
|
| Visual C++ |
 |
|
| |
專家等級 |
評價 |
|
| |
一代宗師 |
10000 |
|
| |
曠世奇才 |
5000 |
|
| |
頂尖高手 |
3000 |
|
| |
卓越專家 |
1500 |
|
| |
優秀好手 |
750 |
|
|
|
|
|
|
|
|
|
|
|
|
Microsoft Internet Explorer
6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2012 程式設計俱樂部 http://www.programmer-club.com.tw/ |
|
|