注意:2007的office中,有的類名改為了後面加0,如CRange0 CDocument0, 一些函數名稱也改了,格式修改如getText改為了get_Text(),
讀取word 文檔:
記得修改CDocuments , CDocument0
等的標頭檔中的如下://另外記得加上#pragma once
#pragma
once
#import "K:\\Program Files XXX\\Microsoft Office\\Office XX\\MSWORD.OLB" no_namespace raw_interfaces_only \
rename("FindText","_FindText") \
rename("Rectangle","_Rectangle") \
rename("ExitWindows","_ExitWindows")
如上我說的,匯入typelib後,添加Application Document.. 等類。如下為一個snippet
#include "CApplication.h"
#include "CDocument0.h"
#include "CDocuments.h"
CApplication oWord;
CDocuments oDocs;
CDocument0 oDoc;
void CVCreadwriteRTFDlg::OnBnClickedButton1()
{
// 變數的聲明
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CApplication oWordApp ;
CSelection oSel ;
CDocuments oDocs ;
CDocument0 oDoc ;
CParagraphs paragraphs ;
CStringArray aryText;
long paCounst;
int lc ;
// 首先建立一個word執行個體對象
if (!oWordApp.CreateDispatch(TEXT("Word.Application")) ){
AfxMessageBox( TEXT( "CreateDispatch failed." ) , MB_OK ¦MB_SETFOREGROUND);
return; // 一定要返回,否則程式崩潰
}
// 顯示此對象檔案 ,您也可以不調用此句,不顯示對象檔案
oWordApp.Set_Visible(TRUE);
// 建立文檔
oDocs = oWordApp.get_Documents();
// 開啟一個新文檔,將e:\\BuildJobEdit.rtf檔案的內容添加到新文檔中
CComVariant tpl(_T("e:\\BuildJobEdit.rtf")), NewTemplate(false), DocType(0), Visble;
oDoc = oDocs.Add(&tpl,&NewTemplate,&DocType,&Visble);
// 選中文檔中的所有內容
oSel = oWordApp.get_Selection();
oSel.WholeStory();// 此句必須有,否則後續代碼無效。
// 得到所有段
paragraphs = oSel.get_Paragraphs();
paCounst = paragraphs.get_Count();
// 將所有段中的每一段都存在數組裡
for( lc = 1 ; lc < paCounst+1 ; lc++ ){
// 得到一段
CParagraph paragraph;
paragraph = paragraphs.Item( (long)lc );
// 得到一段的文本
CRange range = paragraph.get_Range();
CString strRangeText = range.get_Text();
CFont font = range.get_Font();
// 設定文本的字型大小與顏色
//font.put_Color( RGB(0,255,0) );
//font.put_Size( 12 );
// AfxMessageBox( strRangeText );
// 儲存到數組裡
aryText.Add( strRangeText );
//釋放對象
paragraph.ReleaseDispatch();
}
讀取excel的相關代碼:
1、 字串前加上L,如L"fox",這是unicode的原因。
2、 有些函數不一樣了,與第一個連結,比如GetValue,現在應該寫成get_value,這都是筆者一下下調對的,還有一些代碼有錯誤,不過至少下面的代碼運行無誤。
1. 建立MFC工程,MDI(基於對話方塊),其他預設即可。
2. 操作Excel檔案初始化:
a. project->add class->MFC class from typelib (項目->添加類->Typelib中的MFC類)匯入Excel.exe,一般都在C:/Program Files/Microsoft Office/Office12路徑下(即選擇你的office安裝路徑下的excel.exe加入)
b. 選中以下幾項_Application,_WorkSheet,_WorkBook,WorkSheets,WorkBooks,Range,然後匯入;
c. 匯入後自動在工程中添加CApplication,CWorkSheet,CWorkBook,CWorkSheets,CWorkBooks,CRange這些類;
然後需要把這些類的標頭檔中的第一句話 #import ".......EXCEL.EXE" nonamespace 刪除;
引入之後如果編譯遇到錯誤,Not enough actual parameters for macro 'DialogBoxW'. 讓人頭疼!
解決方案是在CRange類中,DialogBox()前面添加底線變成_DialogBox(),解決了!
VARIANT DialogBox()
{
VARIANT result;
InvokeHelper(0xf5, DISPATCH_METHOD, VT_VARIANT, (void*)&result, NULL);
return result;
}
void Cexcel開啟3Dlg::OnBnClickedOk()
{
// TODO: 在此添加控制項通知處理常式代碼
CApplication app;
CWorkbooks books;
CWorkbook book;
CWorksheets sheets;
CWorksheet sheet;
CRange range;
CRange iCell;
LPDISPATCH lpDisp;
COleVariant vResult;
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
if(!app.CreateDispatch(L"Excel.Application"))
{
AfxMessageBox(L"無法啟動Excel伺服器!");
return;
}
books.AttachDispatch(app.get_Workbooks());
lpDisp = books.Open(“d://test.xls”,covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional,covOptional);
//得到Workbook
book.AttachDispatch(lpDisp);
//得到Worksheets
sheets.AttachDispatch(book.get_Worksheets());
//得到當前活躍sheet
//如果有儲存格正處於編輯狀態中,此操作不能返回,會一直等待
lpDisp=book.get_ActiveSheet();
sheet.AttachDispatch(lpDisp);
//讀取第一個儲存格的值
range.AttachDispatch(sheet.get_Cells());
range.AttachDispatch(range.get_Item (COleVariant((long)2),COleVariant((long)1)).pdispVal );
/*COleVariant*/ vResult =range.get_Value2();
CString str;
if(vResult.vt == VT_BSTR) //字串
{
str=vResult.bstrVal;
}
else if (vResult.vt==VT_R8) //8位元組的數字
{
str.Format(L"%f",vResult.dblVal);
}
/*else if(vResult.vt==VT_DATE) //時間格式
{
SYSTEMTIME st;
VariantTimeToSystemTime(&vResult.date, &st);
}
else if(vResult.vt==VT_EMPTY) //儲存格空的
{
str="";
}*/
books.Close();
app.Quit(); // 退出
//釋放對象
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
app.ReleaseDispatch();
OnOK();
MessageBox(str);
}
另外,在這個檔案的前端記得加入:
#include "CApplication.h"
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"