.NET FrameworkとExcel操作

Visual Studio .NET 2003でExcelを操作するプログラムを作った時に調べたこと気づいたことなどを,簡単にですが,まとめたものです.
System::Reflection::Missing::Value のことを知るまで苦労しました.


『メニュー「プロジェクト」→項目「参照の追加」→タブ「COM」→項目「Microsoft Excel 10.0 Object Library」』として参照を追加します.
ソリューションエクスプローラの参照設定の下に"Microsoft.Vbe.Interop","Office","Excel","stdole"の4つが加わります.
準備はこれだけです.後はExcelのアプリケーションをコントロールするコードを書くだけです.
なお,「参照の追加」を行うと,いくつかのDLLが作られます(作られる数は参照設定に追加される参照の数に等しいはずです).DLLはプロジェクト内に作られるフォルダー"temp"の中に保存されます.アプリケーション実行にはそれらDLLのいくつか,もしくは全てが必要です(アプリケーション中で利用していないDLLは当然不要です).必要なDLLは開発環境が選択して,作成された実行ファイルと同じフォルダーに入れてくれますから,特に迷うことは無いと思います.

//コード例.
using namespace Interop::Excel; //追加される名前空間.

//結果出力用ファイル.
System::IO::StreamWriter *sw = new System::IO::StreamWriter(S"test.txt", false, System::Text::Encoding::GetEncoding(S"Shift_JIS"));

//Excel文書を開き,一部を読んで,テキストファイルに書き出す.
String *filePath = S"D:\\Book1.xls"; 
Object *nulObj = System::Reflection::Missing::Value; //省略可能引数を省略する際に使う.
Interop::Excel::ApplicationClass *app = new Interop::Excel::ApplicationClass();
app->Visible = true; //アプリケーションを可視に.
Workbook *book = app->Workbooks->Open(filePath, nulObj, nulObj, nulObj, nulObj, nulObj, nulObj, nulObj, nulObj, nulObj, nulObj, nulObj, nulObj, nulObj, nulObj);
Worksheet *sheet = __try_cast(book->Sheets->Item[__box(1)]);

//3行5列の領域"A1:E3"を読み取って,テキストファイルに内容を書き出す.
Array *ary = __try_cast(sheet->get_Range(S"A1:E3", nulObj)->get_Value(nulObj));
//ary->Rank == 2
sw->WriteLine(S"(ROW, COL) = ({0}, {1})", __box(ary->GetLength(0)), __box(ary->GetLength(1)));
int maxRowNum = ary->GetLength(0);
int maxColNum = ary->GetLength(1);
for(int rowNum = 1; rowNum <= maxRowNum; rowNum++)
{
	for(int colNum = 1; colNum <= maxColNum; colNum++)
	{
		if(colNum > 1) sw->Write(S"\t");
		Object *cell = ary->GetValue(rowNum, colNum);
		if(cell != NULL) sw->Write(cell->ToString());
		else sw->Write(S"[空]");
	}
	sw->WriteLine(S"");
}
app->Quit(); //Excel終了.
sw->Close();

注意.
using namespace Interop::Excel;
を書いた場所によって,
Interop::Excel::Applicationと,System::Windows::Forms::Applicationとがぶつかります.その場合は,ApplicationはSystem::Windows::Forms::Applicationなどと完全な形で書きます.(書くまでもないことですが,念のため.)