출처 : http://q.hatena.ne.jp/1259456311

 

 

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 をリモート操作する方法)を使用する必要があります。

Add Star
id:gontakun_55

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

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

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

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

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

 

+ Recent posts