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 にする必要があり、その逆も同様です。