Skip to content

Instantly share code, notes, and snippets.

@bg1bgst333
Created September 24, 2024 21:39
Show Gist options
  • Save bg1bgst333/8058b5a2e1ab49c2d1813520222f294d to your computer and use it in GitHub Desktop.
Save bg1bgst333/8058b5a2e1ab49c2d1813520222f294d to your computer and use it in GitHub Desktop.
Workbooks.Open
// ヘッダのインクルード
// 既定のヘッダ
#include <windows.h> // 標準WindowsAPI
#include <tchar.h> // TCHAR対応
// 独自のヘッダ
#include "Workbooks.h" // Word::CWorkbooks
// コンストラクタCWorkbooks
Excel::CWorkbooks::CWorkbooks() {
}
// 引数付きコンストラクタ.(IDispatchポインタpDispatchを受け取る.)
Excel::CWorkbooks::CWorkbooks(IDispatch *pDispatch) {
// m_pDispatchにセット.
m_pDispatch = pDispatch;
}
// デストラクタ~CWorkbooks
Excel::CWorkbooks::~CWorkbooks() {
// m_pDispatchの解放.
if (m_pDispatch != NULL) { // m_pDispatchがNULLでなければ.
m_pDispatch->Release(); // IDispatch::Releaseで解放.
m_pDispatch = NULL; // NULLをセット.
}
}
// Workbookの追加.
Excel::CWorkbook * Excel::CWorkbooks::Add() {
// メソッドやプロパティのDISPIDの取得.
LPOLESTR lpwszName = L"Add"; // lpwszNameを"Add"で初期化.
DISPID dispid; // DISPID型dispid.
HRESULT hr = m_pDispatch->GetIDsOfNames(IID_NULL, &lpwszName, 1, LOCALE_USER_DEFAULT, &dispid); // IDispatch::GetIDsOfNamesでdispid取得.
if (FAILED(hr)) { // 失敗.
return NULL;
}
// メソッドやプロパティにアクセス.
VARIANT var; // VARIANT構造体var.
DISPPARAMS dispparams; // DISPPARAMS構造体dispparams.
DISPID dispidname = DISPID_PROPERTYPUT; // dispidnameをDISPID_PROPERTYPUTに初期化.
VariantInit(&var); // varをVariantInitで初期化.
dispparams.cArgs = 0; // 引数の数は0.
dispparams.rgvarg = NULL; // NULLを指定.
dispparams.rgdispidNamedArgs = NULL; // NULLを指定.
dispparams.cNamedArgs = 0; // cNamedArgsも0.
hr = m_pDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispparams, &var, NULL, NULL); // IDispatch::Invokeでアクセス.
if (FAILED(hr)) { // 失敗.
return NULL;
}
// 成功.
CWorkbook *pWorkbook = new CWorkbook(var.pdispVal); // CWorkbookのコンストラクタにvar.pdispValをセット.
return pWorkbook;
}
// 指定のWorkbookを開く.
Excel::CWorkbook * Excel::CWorkbooks::Open(LPCTSTR lpctszFileName) {
// メソッドやプロパティのDISPIDの取得.
LPOLESTR lpwszName = L"Open"; // lpwszNameを"Open"で初期化.
DISPID dispid; // DISPID型dispid.
HRESULT hr = m_pDispatch->GetIDsOfNames(IID_NULL, &lpwszName, 1, LOCALE_USER_DEFAULT, &dispid); // IDispatch::GetIDsOfNamesでdispid取得.
if (FAILED(hr)) { // 失敗.
return NULL;
}
// メソッドやプロパティにアクセス.
VARIANT var; // VARIANT構造体var.
VARIANT varResult; // 結果を格納するVARIANT構造体varResult.
DISPPARAMS dispparams; // DISPPARAMS構造体dispparams.
DISPID dispidname = DISPID_PROPERTYPUT; // dispidnameをDISPID_PROPERTYPUTに初期化.
var.vt = VT_BSTR; // 文字列
var.bstrVal = SysAllocString(lpctszFileName); // SysAllocStringでlpctszFileNameのBSTR生成.
VariantInit(&varResult); // VariantInitでvarResult初期化.
dispparams.cArgs = 1; // 引数の数は1.
dispparams.rgvarg = &var; // &varを指定.
dispparams.rgdispidNamedArgs = NULL; // NULLを指定.
dispparams.cNamedArgs = 0; // cNamedArgsも0.
hr = m_pDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispparams, &varResult, NULL, NULL); // IDispatch::Invokeでアクセス.
SysFreeString(var.bstrVal); // SysFreeStringでvar.bstrValを破棄.
if (FAILED(hr)) { // 失敗.
return NULL;
}
// 成功.
CWorkbook *pWorkbook = new CWorkbook(varResult.pdispVal); // CWorkbookのコンストラクタにvarResult.pdispValをセット.
return pWorkbook;
}
// 二重インクルード防止
#ifndef __EXCEL__WORKBOOKS_H__
#define __EXCEL__WORKBOOKS_H__
// ヘッダのインクルード
// 独自のヘッダ
#include "Workbook.h" // Excel::CWorkbook
// 名前空間Excelの定義
namespace Excel {
// ワークブックスクラスCWorkbooksの定義
class CWorkbooks {
// privateメンバ
private:
// privateメンバ変数
IDispatch *m_pDispatch; // IDispatchポインタm_pDispatch.
// privateメンバ関数
// コンストラクタ
CWorkbooks(); // コンストラクタCWorkbooks(newで生成不可.)
// publicメンバ
public:
// publicメンバ関数
// コンストラクタ
CWorkbooks(IDispatch *pDispatch); // 引数付きコンストラクタ.(IDispatchポインタpDispatchを受け取る.)
// デストラクタ
virtual ~CWorkbooks(); // デストラクタ~CWorkbooks
CWorkbook * Add(); // Workbookの追加.
CWorkbook * Open(LPCTSTR lpctszFileName); // 指定のWorkbookを開く.
};
}
#endif
// ヘッダファイルのインクルード
// 既定のヘッダ
#include <windows.h> // 標準WindowsAPI
#include <tchar.h> // TCHAR対応
// 独自のヘッダ
#include "Excel/Application.h" // Excel::CApplication
// _tmain関数の定義
int _tmain(int argc, TCHAR *argv[]) { // main関数のTCHAR版.
// COMの初期化.
CoInitialize(NULL); // CoInitializeでCOMを初期化.
// Excel::CApplicationの生成
Excel::CApplication *pApplication = Excel::CApplication::CreateInstance(); // Excel::CApplication::CreateInstanceで作成.
// 取得したpApplicationを出力.
_tprintf(_T("pApplication = 0x%08x\n"), (unsigned long)pApplication); // pApplicationを出力.
// アプリケーションの表示.
pApplication->put_Visible(TRUE); // Excel::CApplication::put_VisibleにTRUE渡して表示.
// Workbooksの取得.
Excel::CWorkbooks * pWorkbooks = NULL; // CWorkbooksポインタpWorkbooksをNULLで初期化.
pWorkbooks = pApplication->get_Workbooks(); // Excel::CApplication::get_WorkbooksでpWorkbooksを取得.
// 取得したpWorkbooksを出力.
_tprintf(_T("CWorkbooks * pWorkbooks = 0x%08x\n"), (unsigned long)pWorkbooks); // pWorkbooksを出力.
// xlsxファイルのパス生成.
TCHAR tszCurrentPath[MAX_PATH] = { 0 }; // このプロセスの現在のディレクトリパスを指すTCHAR配列tszCurrentPath(長さMAX_PATH)を{0}で初期化.
GetCurrentDirectory(MAX_PATH, tszCurrentPath); // GetCurrentDirectoryでtszCurrentPathを取得.
_tcscat(tszCurrentPath, _T("\\")); // "\"を連結.
_tcscat(tszCurrentPath, _T("test.xlsx")); // "test.xlsx"を連結.
// Workbookを開く.
Excel::CWorkbook * pWorkbook = NULL; // CWorkbookポインタpWorkbookをNULLで初期化.
pWorkbook = pWorkbooks->Open(tszCurrentPath); // Excel::CWorkbooks::OpenでtszCurrentPathを開き, それを取得.
// 追加したpWorkbookを出力.
_tprintf(_T("CWorkbook * pWorkbook = 0x%08x\n"), (unsigned long)pWorkbook); // pWorkbookを出力.
// pWorkbookの破棄.
if (pWorkbook != NULL) {
delete pWorkbook;
}
// pWorkbooksの破棄.
if (pWorkbooks != NULL) {
delete pWorkbooks;
}
// pApplicationの破棄.
if (pApplication != NULL) {
delete pApplication;
}
// COMの終了処理.
CoUninitialize(); // CoUninitializeで終了処理.
// プログラムの終了.
return 0; // 0を返して終了.
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment