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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
プログラマ

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

#1

投稿記事 by プログラマ » 12年前

環境: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 で発生しました。
追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。


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

Blue

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

#2

投稿記事 by Blue » 12年前

コード:

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

プログラマ

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

#3

投稿記事 by プログラマ » 12年前

はい、そのような感じにちょっと手を加えればいけました。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る