ExcelからC++に表示するには?

解決


けい  2004-11-02 19:42:36  No: 54967

C++初心者なのですが
CSVやテキストファイルを丸々コンソールに表示するには
    char c;
    char file_name[32];

    cout << "ファイル名==>";
    cin >> file_name;
    ifstream MyFile(file_name);
    while(MyFile.get(c))
        cout << c;
これで解決できたのですが、
テキストファイルの何行目や
Excelの行や列だけを指定しコンソールに表示させることは出来るのでしょうか?
配列を使い数値を個々にしまう方法があれば
そちらも教えていただきたいです。
わかりにくい説明ですみませんがよろしくお願いします


tetrapod  2004-11-02 21:36:06  No: 54968

なにがしたいのか良くわかりませんが、例えば1行単位で読み込むのなら std::getline

void testfunc(std::istream& is) {
    std::string s;
    while (std::getline(is, s)) {
        std::cout << s << std::endl;
    }
}
これで1行単位で読み込み、表示を行ってくれます。
n行目を表示したい、のであればそうすればいい。

各行の内容を配列に格納するのであれば
std::string s;
std::vector<std::string> v;
while (std::getline(is, s)) v.push_back(s);
とか。

Excel の xls ファイルはテキストではないので分析・表示は難しいです。
CSV ファイルならできるでしょうが、まじめに分析するとかなり面倒です。


KING・王  2004-11-02 21:42:45  No: 54969

> テキストファイルの何行目や
> Excelの行や列だけを指定しコンソールに表示させることは出来るのでしょうか?
できます。

Excelの方は詳しく知りませんので、他の識者の方にお任せするとして、
テキストファイル(CSVを含む)に関してなら、
単純に、ファイルから順番にデータを読み込んで、
希望のデータのみコンソールに出力すればOKです。

> これで解決できたのですが、

とありますが、これが何をやっているのか、なぜこれで表示できるのか、
理解されているでしょうか?

> 配列を使い数値を個々にしまう方法があれば
> そちらも教えていただきたいです。

これも、読み込んだデータを、適当に配列に代入していけばOKなはずです。
例えばCSVなら、1行分データを読み込んで、そのデータの中の先頭から、
順番にデータを区切る','が見つかれ間でのデータを1つ目の配列に代入し、
その次のデータを区切る','までを2つ目の配列に代入し・・・
と、続けていけばよいのでは?

文字列を数値型に変換する方法なら、過去ログなどを調べれば、いくらでも出てきそうですが、
strtol()等が使用できるでしょう。


けい  2004-11-04 18:35:36  No: 54970

返事が遅くなってしまいましてすみませんでした。
おかげさまで解決する事が出来ました。
ありがとうございます


なーめ  2004-12-03 20:43:13  No: 54971

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。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加