C++/CLIでExcelを操作してみる。

オワコンのC++/CLIで、Excelを動かすコンソールアプリの雛形っぽいものを作った。

CppCliExcel.cpp
WordPressで壊されるので半角の<>は全角の<>に置換している。

#using <System.dll>
using namespace System;

// Excel関連
#using <System.Runtime.InteropServices.dll>
#using <C:/Program Files (x86)/Microsoft Visual Studio/Shared/Visual Studio Tools for Office/PIA/Office15/Microsoft.Office.Interop.Excel.dll>
namespace Excel = Microsoft::Office::Interop::Excel;


int ExcelWork(void) {
    int Ret = 0;    // 途中でエラーが発生したら!0。
    
    Excel::Application^ oApp = nullptr; // Excelアプリケーション
    Excel::Workbook^ oWBook = nullptr;  // ワークブック
    
    try {
        // Excel開始
        oApp = gcnew Excel::Application();
        oApp->Visible = true;
        
        // ワークブックを新規追加、操作対象のワークシートを選択
        oWBook = oApp->Workbooks->Add(Type::Missing);
        Excel::Worksheet^ oWSheet = static_cast<Excel::Worksheet^>(oWBook->Worksheets[1]); 
        oWSheet->Name = "CppCliExcel";  // シート名を変更
        
        // セルに書き込み
        oWSheet->Cells[1,1] = L"C++/CLI Excel"; // Cellで
        oWSheet->Range["A2:B3", Type::Missing]->Value2 = 1234;  // Rangeで

        // セルから読み出し
        String^ strval = static_cast<Excel::Range^>(oWSheet->Cells[1,1])->Text->ToString(); // Rangeを経由して値を取得
        long lngval = Convert::ToInt32(static_cast<Excel::Range^>(oWSheet->Cells[2,1])->Text);  //Convert::ToInt32で数値に変換
        Console::WriteLine("A1={0},B1={1}", strval, lngval);    // コンソールに表示

        // 別名保存
        oApp->DisplayAlerts = 0;
        oWBook->SaveAs(L"CppCliExcel-Out.xlsx", Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Excel::XlSaveAsAccessMode::xlNoChange, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing);
    }
    catch(Exception^ e) {
        Console::WriteLine("Exception:\n" + e);
        Ret += 10;
    }
    finally {
        // ワークブックを閉じる
        if(oWBook != nullptr) {
            oWBook->Close(false, Type::Missing, Type::Missing);
            oWBook = nullptr;
        }
        
        // Excel終了
        if(oApp != nullptr) {
            oApp->DisplayAlerts = false;    // 警告表示オフ
            oApp->Quit();   // Excel終了
            Runtime::InteropServices::Marshal::ReleaseComObject(oApp);
            oApp = nullptr;
        }
    }
    
    // ガベコレ
    GC::Collect();
    GC::WaitForPendingFinalizers();
    GC::Collect();

    return Ret;
}

int main(array<String^>^ args) 
{
    ExcelWork();
    return 0;
}

ビルドと実行は次の通り。Microsoft.Office.Interop.Excel.dllのパスは変えないといけないかも。

cl /clr CppCliExcel.cpp && CppCliExcel

内容としてはC#でできることをC++/CLIに置き換えただけ。ここでは使っていないがCライブラリやSTLと直接連携できるからそれらの資産がある場合は役に立つかもしれない。開発系の職場でもなければ VBAくらいは使っても C++/CLIまで知ってる人はあまりいないから相手を煙に巻くくらいには使えると思う。(何の仮想敵と戦っているのかは不明。)

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中