7

In Memory OleDbConnection to Excel File にも同様の質問がありますが、この質問は別の方法で完全に回避することで回答されました。

OleDbConnectionを使用してディスクから Excel ファイルにアクセスするコードの例を次に示します。

static void Main(string[] args)
{
    String filePathToExcelFile = "c:\\excelfile.xls";
    Boolean hasHeaders = true;

    String connectionString = String.Format(
        "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};" +
        "Extended Properties=\"Excel 12.0;HDR={1};IMEX=2\"",
        filePathToExcelFile, hasHeaders ? "Yes" : "No");

    using(OleDbConnection conn = new OleDbConnection(connectionString))
    using (OleDbCommand command = new OleDbCommand("SELECT * FROM [Sheet1$]", 
        conn))
    {
        conn.Open();
        OleDbDataReader datareader = command.ExecuteReader();

        while(datareader.Read())
        {
            Object[] values = new object[datareader.FieldCount];
            datareader.GetValues(values);

            Console.WriteLine(String.Join(",", values));
        }
    }
}

System.IO.Streamディスク上の永続ファイルではなく、 NON-SEEKABLE からExcelファイルを取得したいと思います。

質問は 2 つの部分に分けられます。a) OleDbConnection を System.IO.Stream に「ポイント」できますか? b) もしそうなら、シーク可能なストリームではなく、転送のみのストリームにすることができますか?

参考: このコード スニペットを実行する場合は、 Microsoft Access データベース エンジン 2010 再頒布可能パッケージをインストールする必要があります。また、64 ビット版をインストールする場合は、プロジェクトのターゲットを x64 にする必要があり、その逆も同様です。

4

1 に答える 1