ページ 11

C++/CLI エクセル操作 セルのデータ取得

Posted: 2013年11月12日(火) 15:22
by プログラマ
環境:Visual Studio C++2008
言語:C++/CLI

エクセルのセルからデータを取得する方法について、困っています。
【1】初めはこの方法で取得していました(重要部分だけ記載)。

コード:

#include <msclr/marshal.h>
using namespace msclr::interop;
using namespace Microsoft::Office::Interop;
using namespace Microsoft::Office::Interop::Excel;

// エクセルファイル操作
Excel::Application^ xlApp = gcnew Excel::ApplicationClass();
Workbooks^ xlWbs = xlApp->Workbooks;

Sheets^ xlShs = xlApp->Sheets;
// 読み込みデータを格納する
Range^ xlRange = static_cast<Range^>(xlWsh->Cells[sRow, sCol]);

sTmp = xlRange->Text->ToString();
if(sTmp == ""){
	Marshal::FinalReleaseComObject(xlRange);
	continue;
}
pcTmp = (char *)Marshal::StringToHGlobalAnsi(sTmp).ToPointer();
sTmpはSystem::String型です。
手法としては、セルに表示される文字列そのものを取得しています。
ですので、セルのサイズをものすごく小さくした時にデータが取れなくなります。
(セルが小さいと表示文字列が##になったり表示されなくなったりする
 ⇒sTmpにも"##"や""という文字列が格納されてしまう)

これを解決するために、以下のように組みました。
【2】

コード:

sTmp = xlRange->Text->ToString();
if(sTmp == ""){
	Marshal::FinalReleaseComObject(xlRange);
	continue;
}
sTmp = xlRange->Value[System::Type::Missing]->ToString();
pcTmp = (char *)Marshal::StringToHGlobalAnsi(sTmp).ToPointer();
こうやると、セルの表示内容が「#」になった場合は防ぐことが出来ます。
ですが、表示すらされなくなった場合は取得することが出来ません。

ちなみに
>sTmp = xlRange->Value[System::Type::Missing]->ToString();
をif文より前に持たすと、下記エラーメッセージで落ちます。
'System.NullReferenceException' のハンドルされていない例外が OFFLINE.exe で発生しました。
追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。


どのようにしたら、小さなセルのデータを取得することが出来るでしょうか。

Re: C++/CLI エクセル操作 セルのデータ取得

Posted: 2013年11月12日(火) 17:05
by Blue

コード:

if (xlRange->Value == nullptr) {
    continue;
}
ってできないですかね?

Re: C++/CLI エクセル操作 セルのデータ取得

Posted: 2013年11月21日(木) 09:04
by プログラマ
はい、そのような感じにちょっと手を加えればいけました。
ありがとうございました。