掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ExcelからC++に表示するには? (ID:54971)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
1年ぶりのアクセスです。 csv に変換しなければならないのが、(私は)イヤですね。(失礼!) ## でも csv 方が処理は早いです。 Win2k/xp なら、以下の方法も比較的容易かつ、汎用的なのでは。 (win98/MEではやってませんが) もしかしたら、MSDE も必要かもしれませんが。(^^;; 当然、Office も入れています。 --------------------------- .xls ファイル自体を解析するのは無意味です。 # というか違法? なので、Excel ファイルをデータベースとして扱う、 "Microsoft OLE DB Provider for Microsoft Jet" を使用するとよいでしょう。 ->http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpado260/htm/mdrefadoprovinfo.asp MFCアプリで恐縮ですが、以下のようにしています。 まずは、_Recordset を使用可能にするために、 stdafx.h で #pragma warning( disable : 4146 ) #import "D:\Program Files\Common Files\System\ado\msado15.dll" \ no_namespace rename("EOF","EndOfFile") #pragma warning( default : 4146 ) #include <comdef.h> #include <atlbase.h> を追加。 ------------------------------- CString csSheet = "Sheet1"; // シートを指定 CString csExp = "Excel 8.0"; // Excel を指定 CString csDS = "C:\\someone.xls"; // DataSource(ファイルパス) CString csCmd; CString csConn; // SQL を用いる csCmd.Format("SELECT `%s$`.* FROM FROM `%s$`", csSheet ); //接続文字列で JET を指定 csCnn.Format( "Provider=Microsoft.Jet.OLEDB.4.0;" "Data Source=%s;" "Extended Properties=%s;",csDS,csExp ); _bstr_t bsConn = csConn; _bstr_t bsCmd = csCmd; _RecordsetPtr & spRs = NULL; spRs->CreateInstance( "ADODB.Recordset" ); spRs->Open(bsCmd,bsConn,adOpenDynamic,adLockPessimistic,adCmdText); // 処理をあとで追加 spRs->Close(); ------------------------------- もちろん HRESULT hr でリザルトコードのチェックをしてください。 長くなるので省略しました。 さらに1文ごとに try{ fuctions(); } catch( _com_error e ) { TRACE("%08x: %s\n", e.Error(); e.Description()); } を行なうとデバッグが非常に楽です。 ------------------------------- 以上で開いて閉じるだけのプログラムが動いたら、 実際にレコードのアクセス処理を追加します。 while(1) { enum PositionEnum pos; spRs->get_AbsolutePosition( &pos ); if( pos == adPosEof ) break; // 行の処理 spRs->MoveNext(); } ---------------------------------------- 最後にカラムの取り出しを行ないます。 Excel の1行目はフィールド名が入っているものとし、 同じ名前が const char * szFileds[] に入っているものとします。 _variant_t va; FieldsPtr spFld; // 行(ロウ)全体を保持 FieldPtr spField; // 各カラムを保持 spFld = spRs->GetFields(); for( nCnt = 0; nCnt < nMaxCnt; nCnt ++ ) { spField = spFlds->GetItem( szField[nCnt] ); va = spField->GetValue(); spField->Release(); } spFld->Release(); -------------------------------------------- _variant_t に値が入っていますが、 CString cs = (char *)(_bstr_t)( va ); とすれば、コード変換等を含めていろいろやってくれます。 # つっこみ禁止ne。 --- おっと、 (( va.vt == VT_NULL ) || ( va.vt == VT_EMPTY )) のチェックを忘れずに。 --- あとは int data = atoi( cs ); 位ですか。 ちなみに、結構遅いです。 以上を、階層クラスとして 汎用 CRecSet JET用 CJetRecSet EXCEL用 CJetExcelRecSet 特定の xls ファイル用 CXXXJetExcelRecSet などと実装しています。 以上、実際に動いているプログラムから抜粋して書いたものです。 参考まで。 ## いやみなくらいに CString を使っていますが。(^^;; 追伸。 Excel から VCのエディタに「こぴぺ」すると タブセパレートベクタ(TSV?)になるから、 Find/Replace で タブを (",") に、 (^",) を (\t{ )に、 ("$) を (}) に 変換すれば、 const char * data_mtx[][32] = { { "","","","",.... }, ..... } が簡単に作れるので、これを data.c などに保存し、コンパイル/リンクする のが最も早いかも。やっつけ作業なら、よくやる手です。 読み込まなくてもいいのが便利。ファイル指定ができないのが欠点。 # 他人に見せるプログラムではやらないようにね。(^^;; ...にしてもタイトルの、「C++に表示」は意味不明だne。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.