言語: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にも"##"や""という文字列が格納されてしまう)
これを解決するために、以下のように組みました。
【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 で発生しました。
追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。
どのようにしたら、小さなセルのデータを取得することが出来るでしょうか。