VC++(MFC)でExcelを操作する方法.doc
文本预览下载声明
VC++(MFC)でExcelを操作する方法(1)
Posted 1月 12th, 2007 by hippos
in
EXCEL
MFC
VC++
仕事で、久しぶりVC++をやることに。どうしても出力はExcelにして欲しいという要望があってかつての記憶を手繰りながら忘れないうちにメモ。長くなりそうなので、分割してアップします。
クラスの追加で「タイプライブラリからMFCクラスを作成」ExcelObjectライブラリを選択し、次のインタフェースをからクラスを生成します。(注意:Rangeクラスを生成しコンパイルするとVARIANT DialogBox()の箇所でエラーとなります。この部分はVARIANT CDialogBox()として対処しています。)
_Application
_Workbook
_Worksheet
Range
Workbooks
Worksheet
それぞれのクラスは名前のままエクセルのWorkbook(s)/Worksheet(s)/Rangeのラッパクラスとなります。また、各種関数を呼び出す際に使用するオプションパラメタは下記のように定義しています。
COleVariant covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
まず、最初にアプリケーション(エクセル)にアタッチします。
CApplication excel;
bool bCreate;
if (CLSIDFromProgID(OLESTR(Excel.Application), clsid) != NOERROR){
AfxMessageBox(Excel not installed or version not compatible);
return ;
}
LPUNKNOWN lpUnk;
LPDISPATCH lpDispatch;
if (GetActiveObject(clsid, NULL, lpUnk) == NOERROR){
HRESULT hr = lpUnk-QueryInterface(IID_IDispatch,(LPVOID*)lpDispatch);
lpUnk-Release();
if (hr == NOERROR){
//すでにExcelが起動されている状態であればAttachDispatch
excel.AttachDispatch(lpDispatch, TRUE);
bCreate = false;
}
}
//Excelが起動されていなければCreateDispatch()
if (excel.m_lpDispatch == NULL){
if (!excel.CreateDispatch(clsid, e)){
AfxMessageBox(cant AttachDispatch Excel Application!!);
return 0;
}
bCreate = false;
}
エクセルがもともと起動しているか否かでAttachDispatch/CreateDispatchかの処理に分かれます。後はそれぞれWorkbooks/Workbook/Worksheets/Worksheetオブジェクトにアタッチして作業をおこないます。
CWorkbooks wbooks;
CWorkbook wbook;
CWorksheets wsheets;
CWorksheet wsheet;
//ユーザ操作禁止
excel.put_UserControl(FALSE);
//workbooksオブジェクトにアタッチ
wbooks.AttachDispatch(excel.get_Workbooks());
//workbooksに新規Workbookを作成しwookbookオブジェクトにアタッチ
wbook.AttachDispatch(wbooks.Add(covOptional));
//作成したworkbookのworksheetsオブジェクトにアタッチ
wsheets.AttachDispatch(wbook.get_Worksheets());
実際の作業はworksheetオブジェクトに対しておこなうので最後はworksheetオブジェクトを生成します。下の例では、get_Count()メソッドでWorksheetsオブジェクトの現在のシート数を求め、最後のシートにアタッチしそのシートの後ろに新規シートを追加します。
VARIANT va
显示全部