仕事で開発を行っていると、他の人がエクセルファイルでデータ資料を作り、プログラマがその情報をアプリに組み込む、なんて事がよくあります。
一度CSVに書き出してからプログラムでそれを読み、使いやすいデータ(XMLやCのソース)にコンバートして利用するのが定石かと思いますが、エクセルファイルを直接読めればCSVに書き出す手間が多少軽減されます。
(そもそもVBAでコンバート処理書いちゃうという人は尊敬されれば良いと思います)
Visual C++6.0ではよくそういう事をやっていたのですが、Visual Studio 2008 + MFCだとどうやるんだろう?と思いましてちょっとやってみました。
メニューからクラスの追加を実行します。
「TypeLibからのMFCクラス」を選びます。
エクセルのタイプライブラリを選び、使うインターフェースを追加して(今回は面倒なので全部追加)完了ボタンを押します。
ちょっと生成に時間が掛かりますが、ヘッダーファイルが生成されます。
ただ、何故か#import文が入っていて、コンパイル時にエラー(名前の競合)が出てしまうので一括置換でコメントアウトします。
VC6ではできなかった芸当ですね(ソリューション内一括置換)
あとはごりごりコードを書けばエクセルの操作ができます。
既存のファイルを開いて、最初のシートのA1のテキストを取得するにはこんな感じになるかと思います。
(Excel 2007使用)
#include "CApplication.h"
#include "CWorkbooks.h"
#include "CWorksheets.h"
#include "CWorkbook.h"
#include "CWorksheet.h"
#include "CRange.h"
void CHogeHogeDlg::OnBnClickedButton1()
CApplication App;
if (!App.CreateDispatch(_T("Excel.Application"))) {
ASSERT(0);
return;
}
App.put_Visible(TRUE);
CWorkbooks Workbooks = App.get_Workbooks();
// 既存のエクセルファイルを開く
COleVariant varNull;
varNull.ChangeType(VT_NULL);
CWorkbook Workbook = Workbooks.Open(_T("c:\\hogehoge.xls"), varNull, varNull, varNull, varNull, varNull, varNull, varNull, varNull, varNull, varNull, varNull, varNull,varNull, varNull);
CWorksheets Worksheets = Workbook.get_Worksheets();
CWorksheet Worksheet = Worksheets.get_Item(COleVariant((long)1));
CRange Cells = Worksheet.get_Cells();
CRange Cell = Cells.get_Item(COleVariant((long)1), COleVariant((long)1)).pdispVal;
CString str = Cell.get_Text().bstrVal;
}
CRange::DialogBoxとかいう関数でコンパイルエラーが出ますが関数名変えるなどして回避します。
当然ながら実行する環境にエクセルがインストールされている必要があります。
また、使用したタイプライブラリと実行時のエクセルのバージョンが違うと、うまく動かない事があるかもしれません。うろ覚えですが。上位互換はあるかも?
もしいろんな操作をやりたい場合、エクセルのマクロのヘルプが参考になると思います。若干関数名は違いますが、構造などはほぼ同じです。