Visual C++ 2008(Visual Studio)を使用しています。

エクセルファイルに記入してある設定値を読み出したいのですが、検索してもVC++2005やVC#は出てきますが
VC++2008が出てきません。
どなたかご教授お願いします。
また、参考になるURLなどありましたら、合わせてお願い致します。

回答の条件
  • 1人50回まで
  • 登録:2009/11/29 09:58:32
  • 終了:2009/12/04 13:07:13

ベストアンサー

id:cx20 No.3

cx20回答回数606ベストアンサー獲得回数1072009/12/04 03:37:01

ポイント200pt

ADO と ADO.NET による Excel ファイルを読み込むサンプルを用意してみました。

Excel ファイルは以下の形式を想定しています。

ブック名:[book1.xls] / シート名:[Sheet1]

A B
1 key value
2 項目1 値1
3 項目2 値2
4 項目3 値3

ADO も ADO.NET も「Jet OLE DB プロバイダ」と「データベースの種類」を接続文字列にて指定することで、Excel ファイルにアクセスすることが可能です。

<接続文字列の例>
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Book1.xls;Extended Properties="Excel 8.0;HDR=YES;" 
<ADO 概要>
[アプリケーション]
   |
  [ADO]         … ADODB.Connection
   |
  [OLE DB]
   |
[OLE DB Provider] … Microsoft.Jet.OLEDB.4.0
   |
 [ISAM ドライバ] … Extended Properties="Excel 8.0;HDR=YES;"
   |
 [Excel ファイル] … Data Source=C:\book1.xls
<ADO.NET 概要>
[.NET アプリケーション]
   |
  [ADO.NET]
   |
[.NET Framework Data Provider for OLE DB] … OleDbConnection
   |
  [OLE DB]
   |
[OLE DB Provider] … Provider=Microsoft.Jet.OLEDB.4.0
   |
 [ISAM ドライバ] … Extended Properties="Excel 8.0;HDR=YES;"
   |
 [Excel ファイル] … Data Source=C:\book1.xls
<データベースの種類>
Excel 5.0 … Excel 5.0 および 7.0 (95) 形式
Excel 8.0 … Excel 8.0 (97), 9.0(2000), 10.0(2002) 形式

まず、はじめは WSH(VBScript)+ ADO のサンプルです。

' File : AdoExcelTest.vbs
' Usage : CScript //Nologo AdoExcelTest.vbs [Enter]
Option Explicit

Call Main()

Sub Main()
    Dim cn
    Set cn = CreateObject("ADODB.Connection")

    Dim strFileName
    Dim strCon
    strFileName = "C:\home\edu\hatena\gontakun_55\1259456311\book1.xls"
    strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileName & ";Extended Properties=""Excel 8.0;HDR=YES"""
    cn.Open strCon

    Dim rs
    Set rs = cn.Execute("SELECT * FROM [Sheet1$]")

    While Not rs.BOF And Not rs.EOF
        WScript.Echo "key = [" & rs(0) & "], value = [" & rs(1) & "]"
        rs.MoveNext
    Wend

    rs.Close
    cn.Close
End Sub
<実行結果>
key = [項目1], value = [値1]
key = [項目2], value = [値2]
key = [項目3], value = [値3]

次に、VC++2008(C++) + ADO のサンプルです。

// File : AdoExcelTest.cpp
// Compile : cl AdoExcelTest.cpp [Enter]
// Usage : AdoExcelTest.exe [Enter]
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <comdef.h>

int main( int argc, char* argv[] )
{
    CoInitialize(NULL);

    _ConnectionPtr cn("ADODB.Connection");

    _bstr_t strFileName;
    _bstr_t strCon;
    strFileName = "C:\\home\\edu\\hatena\\gontakun_55\\1259456311\\book1.xls";
    strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFileName + ";Extended Properties=\"Excel 8.0;HDR=YES\"";
    
    cn->Open( strCon, "", "", adConnectUnspecified );

    _RecordsetPtr rs("ADODB.Recordset");
    rs = cn->Execute( "SELECT * FROM [Sheet1$]", NULL, 0 );
    
    while ( !rs->GetBOF() && !rs->GetEndOfFile() )
    {
        printf( "key = [%s], value = [%s]\n", 
            (LPCTSTR)(_bstr_t)rs->Fields->Item[0L]->Value,
            (LPCTSTR)(_bstr_t)rs->Fields->Item[1L]->Value );
        rs->MoveNext();
    }
    rs->Close();
    cn->Close();
    
    CoUninitialize();

    return 0;
}

実行結果は1番目と同じです。


そして、最後に、VC++2008(C++/CLI) + ADO.NET のサンプルです。

// File : AdoExcelDotNet.cpp
// Compile : cl AdoExcelDotNet.cpp /clr [Enter]
// Usage : AdoExcelDotNet.exe [Enter]

#using <mscorlib.dll>
#using <System.dll>
#using <System.Data.dll>

using namespace System;
using namespace System::Data;
using namespace System::Data::OleDb;

int main( array<System::String ^> ^args )
{
    OleDbConnection^ con = gcnew OleDbConnection();

    String^ strFileName = gcnew String("C:\\home\\edu\\hatena\\gontakun_55\\1259456311\\book1.xls");
    String^ strCon = gcnew String("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFileName + ";Extended Properties=\"Excel 8.0;HDR=YES;\"");
    con->ConnectionString = strCon;
    con->Open();

    OleDbCommand^ cmd = gcnew OleDbCommand("SELECT * FROM [Sheet1$]", con );
    OleDbDataReader^ reader = cmd->ExecuteReader();

    while ( reader->Read() )
    {
        Console::WriteLine("key = [{0}], value = [{1}]", reader["key"], reader["value"] );
    }

    reader->Close();
    con->Close();

    return 0;
}

これも実行結果は1番目と同じです。


なお、サンプルコードを簡略化する為にエラー処理(try ~ catch 等)は、省略してあります。

実際にコーディングする場合は、必要に応じてエラー処理を追加してください。


また、今回の ADO / ADO.NET での使用例は、Excel のデータが「表形式」(テーブル形式)であることが前提です。

データが非定型の場合は、Excel オートメーション(Excel.exe をリモート操作する方法)を使用する必要があります。

id:gontakun_55

詳しい説明付きで大変参考になりました。

動作出来るようになり、大変感謝致します。

また、複数のサンプルまでご用意頂き、大変ありがとうございます。

今後の参考にさせて頂きます。

ありがとうございました。

2009/12/04 13:05:38

その他の回答(2件)

id:chyopper No.1

chyopper回答回数416ベストアンサー獲得回数692009/11/29 13:23:56

ポイント10pt

Visual Studio 2008 + MFCでExcelを操作するには

http://takabosoft.com/20091030101433.html

id:gontakun_55

ありがとうございます。

見てみましたが、私にはさっぱりでした。

下の質問でも書いていますが、本業以外で必要にせまられている状況ですので、基本的な所は

そのまま使えるものが無いかと探しています。

そんな都合の良いものはないと言われるのは判っていますが、宜しくお願い致します。

2009/11/29 17:02:58
id:azuco1975 No.2

azuco1975回答回数613ベストアンサー獲得回数162009/11/29 17:54:03

id:gontakun_55

ありがとうございます。

サンプルがあると思われるURL先が無いみたいです。

メインページから辿ってみましたが、見つけられませんでした。

2009/11/29 18:48:45
id:cx20 No.3

cx20回答回数606ベストアンサー獲得回数1072009/12/04 03:37:01ここでベストアンサー

ポイント200pt

ADO と ADO.NET による Excel ファイルを読み込むサンプルを用意してみました。

Excel ファイルは以下の形式を想定しています。

ブック名:[book1.xls] / シート名:[Sheet1]

A B
1 key value
2 項目1 値1
3 項目2 値2
4 項目3 値3

ADO も ADO.NET も「Jet OLE DB プロバイダ」と「データベースの種類」を接続文字列にて指定することで、Excel ファイルにアクセスすることが可能です。

<接続文字列の例>
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Book1.xls;Extended Properties="Excel 8.0;HDR=YES;" 
<ADO 概要>
[アプリケーション]
   |
  [ADO]         … ADODB.Connection
   |
  [OLE DB]
   |
[OLE DB Provider] … Microsoft.Jet.OLEDB.4.0
   |
 [ISAM ドライバ] … Extended Properties="Excel 8.0;HDR=YES;"
   |
 [Excel ファイル] … Data Source=C:\book1.xls
<ADO.NET 概要>
[.NET アプリケーション]
   |
  [ADO.NET]
   |
[.NET Framework Data Provider for OLE DB] … OleDbConnection
   |
  [OLE DB]
   |
[OLE DB Provider] … Provider=Microsoft.Jet.OLEDB.4.0
   |
 [ISAM ドライバ] … Extended Properties="Excel 8.0;HDR=YES;"
   |
 [Excel ファイル] … Data Source=C:\book1.xls
<データベースの種類>
Excel 5.0 … Excel 5.0 および 7.0 (95) 形式
Excel 8.0 … Excel 8.0 (97), 9.0(2000), 10.0(2002) 形式

まず、はじめは WSH(VBScript)+ ADO のサンプルです。

' File : AdoExcelTest.vbs
' Usage : CScript //Nologo AdoExcelTest.vbs [Enter]
Option Explicit

Call Main()

Sub Main()
    Dim cn
    Set cn = CreateObject("ADODB.Connection")

    Dim strFileName
    Dim strCon
    strFileName = "C:\home\edu\hatena\gontakun_55\1259456311\book1.xls"
    strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileName & ";Extended Properties=""Excel 8.0;HDR=YES"""
    cn.Open strCon

    Dim rs
    Set rs = cn.Execute("SELECT * FROM [Sheet1$]")

    While Not rs.BOF And Not rs.EOF
        WScript.Echo "key = [" & rs(0) & "], value = [" & rs(1) & "]"
        rs.MoveNext
    Wend

    rs.Close
    cn.Close
End Sub
<実行結果>
key = [項目1], value = [値1]
key = [項目2], value = [値2]
key = [項目3], value = [値3]

次に、VC++2008(C++) + ADO のサンプルです。

// File : AdoExcelTest.cpp
// Compile : cl AdoExcelTest.cpp [Enter]
// Usage : AdoExcelTest.exe [Enter]
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <comdef.h>

int main( int argc, char* argv[] )
{
    CoInitialize(NULL);

    _ConnectionPtr cn("ADODB.Connection");

    _bstr_t strFileName;
    _bstr_t strCon;
    strFileName = "C:\\home\\edu\\hatena\\gontakun_55\\1259456311\\book1.xls";
    strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFileName + ";Extended Properties=\"Excel 8.0;HDR=YES\"";
    
    cn->Open( strCon, "", "", adConnectUnspecified );

    _RecordsetPtr rs("ADODB.Recordset");
    rs = cn->Execute( "SELECT * FROM [Sheet1$]", NULL, 0 );
    
    while ( !rs->GetBOF() && !rs->GetEndOfFile() )
    {
        printf( "key = [%s], value = [%s]\n", 
            (LPCTSTR)(_bstr_t)rs->Fields->Item[0L]->Value,
            (LPCTSTR)(_bstr_t)rs->Fields->Item[1L]->Value );
        rs->MoveNext();
    }
    rs->Close();
    cn->Close();
    
    CoUninitialize();

    return 0;
}

実行結果は1番目と同じです。


そして、最後に、VC++2008(C++/CLI) + ADO.NET のサンプルです。

// File : AdoExcelDotNet.cpp
// Compile : cl AdoExcelDotNet.cpp /clr [Enter]
// Usage : AdoExcelDotNet.exe [Enter]

#using <mscorlib.dll>
#using <System.dll>
#using <System.Data.dll>

using namespace System;
using namespace System::Data;
using namespace System::Data::OleDb;

int main( array<System::String ^> ^args )
{
    OleDbConnection^ con = gcnew OleDbConnection();

    String^ strFileName = gcnew String("C:\\home\\edu\\hatena\\gontakun_55\\1259456311\\book1.xls");
    String^ strCon = gcnew String("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFileName + ";Extended Properties=\"Excel 8.0;HDR=YES;\"");
    con->ConnectionString = strCon;
    con->Open();

    OleDbCommand^ cmd = gcnew OleDbCommand("SELECT * FROM [Sheet1$]", con );
    OleDbDataReader^ reader = cmd->ExecuteReader();

    while ( reader->Read() )
    {
        Console::WriteLine("key = [{0}], value = [{1}]", reader["key"], reader["value"] );
    }

    reader->Close();
    con->Close();

    return 0;
}

これも実行結果は1番目と同じです。


なお、サンプルコードを簡略化する為にエラー処理(try ~ catch 等)は、省略してあります。

実際にコーディングする場合は、必要に応じてエラー処理を追加してください。


また、今回の ADO / ADO.NET での使用例は、Excel のデータが「表形式」(テーブル形式)であることが前提です。

データが非定型の場合は、Excel オートメーション(Excel.exe をリモート操作する方法)を使用する必要があります。

id:gontakun_55

詳しい説明付きで大変参考になりました。

動作出来るようになり、大変感謝致します。

また、複数のサンプルまでご用意頂き、大変ありがとうございます。

今後の参考にさせて頂きます。

ありがとうございました。

2009/12/04 13:05:38
  • id:Mook
    VC++2005 でのやり方が出ているのであれば、そのやり方でできないのですか?
  • id:cx20
    1点、確認ですが、作成されているアプリケーションのタイプは以下のうちどれでしょうか?
    ・MFC アプリケーション
    ・Win32 アプリケーション
    ・CLR アプリケーション(Windows フォーム アプリケーション)

    MFC、Win32 ベースのアプリケーションであれば ADO を使用するのが良いと思います。
    (CLR アプリケーションであれば、ADO.NET が推奨されます。)
    ADO は COM ベースのデータアクセス用のコンポーネントで、
    任意のデータプロバイダ(SQL Server, JET データベース、ODBC 等)を指定することで、それぞれのデータにアクセスできるようになります。

    <参考情報>
    ■ Visual C++ での ADO プログラミング
    http://msdn.microsoft.com/ja-jp/library/cc408141.aspx
    ■ ADO を使用して Excel ブックのデータの読み取りおよび書き込みを行う方法 (ExcelADO)
    http://support.microsoft.com/kb/278973/ja
  • id:gontakun_55
    >Mookさん
     すいません、Cは長いのですが、Visual系はVC++2008が初めてで、置き換えが出来ない状況(スキル不足?)です。

    >cx20さん
     使用しているのは、CLRアプリケーションになります。
     プログラムを書くのが本業ではなく、本業の為のツールを作っている最中で、しかもスキルは今回初めてVisual系を
     触りますので、(基本的な所は)なるべくそのまま使えるサンプルが無いかと思いまして、今回質問してみました。
     参考資料ありがとうございます。明日の作業時に参考にしてみます。

     
  • id:cx20
    > ・CLR アプリケーション(Windows フォーム アプリケーション)

    CLR アプリケーションは C++/CLI(C++ を .NET Framework 用に拡張した言語)を用いたアプリケーションになります。
    残念ながら、C++/CLI の情報は、VB.NET や VC# に比べて極端に少ないのが現状です。
    (MSDN の .NET Framework 用のサンプルは VB.NET や VC# が大半ですし・・・)

    C++/CLI に限らず、VB.NET や VC# といった、.NET ベースのアプリで
    データにアクセスするのであれば ADO.NET を用いるのが標準的なやり方かと
    思います。
    ただし、残念ながら、上記にあるように C++/CLI のサンプルコードは少ないので、
    VB.NET や VC# 用のサンプルコードを参考に移植することになるかと思います。
    以下は、VB.NET や VC# で ADO.NET を使用するサンプルです。

    ■ .NET アプリケーションから Microsoft Office データにアクセスする
    http://msdn.microsoft.com/ja-jp/library/ms971514.aspx
    ■ Visual Basic .NET と ADO.NET を使用して Excel ブックのレコードの取得と変更を行う方法
    http://support.microsoft.com/kb/316934/ja
  • id:cx20
    補足です。

    ADO / ADO.NET で任意の行のデータを取得する場合は、SQL 文で WHERE 句を指定します。

    "SELECT * FROM [Sheet1$]"
         ↓
    "SELECT * FROM [Sheet1$] WHERE key='項目1'"

    <実行例>
    key = [項目1], value = [値1]
  • id:cx20
    C# <--> C++/CLI の変換に役立ちそうなツールを見つけました。

    「.NET Reflector」という .NET 用の逆コンパイラを用いると、
    .NET アプリを解析し、次のような別の言語に変換してくれることができます。
    ・IL
    ・C#
    ・Visual Basic
    ・Delphi
    ・MC++
    ・Chrome
    しかも、追加で Add-Ins を導入することで C++/CLI にも対応できるようです。

    ■ .NET Reflector, class browser, analyzer and decompiler for .NET
    http://www.red-gate.com/products/reflector/
    → ダウンロードはフリーですがメールアドレスの登録が必要です。

    ■ C++/CLI ADD-IN FOR .NET Reflector
    http://www.sandpapersoftware.com/Main/Reflector.html

    ■ 変換結果の例(サンプルの3番目のモジュールの逆変換の結果です。)
    <Visual Basic>
    Friend Shared Function main(ByVal args As String()) As Integer
      Dim connection As OleDbConnection = Nothing
      Dim str2 As String = Nothing
      Dim str As String = Nothing
      Dim reader As OleDbDataReader = Nothing
      connection = New OleDbConnection
      str2 = "C:\home\edu\hatena\gontakun_55\1259456311\book1.xls"
      str = ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & str2 & ";Extended Properties=""Excel 8.0;HDR=YES;""")
      connection.ConnectionString = str
      connection.Open
      reader = New OleDbCommand("SELECT * FROM [Sheet1$]", connection).ExecuteReader
      Do While True
        If Not reader.Read Then
          Exit Do
        End If
        Console.WriteLine("key = [{0}], value = [{1}]", reader.Item("key"), reader.Item("value"))
      Loop
      reader.Close
      connection.Close
      Return 0
    End Function

    <C#>
    internal static int main(string[] args)
    {
      OleDbConnection connection = null;
      string str2 = null;
      string str = null;
      OleDbDataReader reader = null;
      connection = new OleDbConnection();
      str2 = @"C:\home\edu\hatena\gontakun_55\1259456311\book1.xls";
      str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + str2 + ";Extended Properties=\"Excel 8.0;HDR=YES;\"";
      connection.ConnectionString = str;
      connection.Open();
      reader = new OleDbCommand("SELECT * FROM [Sheet1$]", connection).ExecuteReader();
      while (true)
      {
        if (!reader.Read())
        {
          break;
        }
        Console.WriteLine("key = [{0}], value = [{1}]", reader["key"], reader["value"]);
      }
      reader.Close();
      connection.Close();
      return 0;
    }

    <C++/CLI>
    int main(array<String^>^ args)
    {
      OleDbConnection^ connection = nullptr;
      String^ str2 = nullptr;
      String^ str = nullptr;
      OleDbDataReader^ reader = nullptr;
      connection = gcnew OleDbConnection() ;
      str2 = "C:\home\edu\hatena\gontakun_55\1259456311\book1.xls";
      str = String::Concat("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=", str2, ";Extended Properties="Excel 8.0;HDR=YES;"");
      connection->ConnectionString = str;
      connection->Open();
      reader = gcnew OleDbCommand("SELECT * FROM [Sheet1$]", connection) ->ExecuteReader();
      while (true)
      {
        if (!reader->Read())
        {
          break;
        }
        Console::WriteLine("key = [{0}], value = [{1}]", reader->Item["key"], reader->Item["value"]);
      }
      reader->Close();
      connection->Close();
      return 0;
    }
  • id:cx20
    逆変換して気がつきましたが、String の場合は gcnew をしなくても、
    String^ strFileName = gcnew String("hoge");
                  ↓
    String^ strFileName = "hoge";
    で、よさそうですね。失礼しました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません