0

サーバーでホストされている Excel 2003 ドキュメントを開くために ASP.NET を使用しています。私の管理外のシステムによって作成された Excel スプレッドシートには、5 つの名前付きワークシートがあります。次のように各シートのデータにアクセスします (読みやすくするために改行を追加しています)。

string ExcelConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\sample.xls;
    Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1;\";";

OleDbDataAdapter myData = 
    new OleDbDataAdapter("SELECT * FROM [mysheet]", ExcelConn);
myData.TableMappings.Add("Table", "mysheet");
myData.Fill(ExcelDS);

これは 5 枚中 3 枚で機能します。他の 2 つはこのエラーをスローします。

Microsoft Jet データベース エンジンは、オブジェクト 'mysheet' を見つけることができませんでした。オブジェクトが存在すること、およびその名前とパス名のつづりが正しいことを確認してください。

下部のタブのテキストを調べ、これが Excel で生成する文字列の末尾を調べることで、シート名を 4 重にチェックしました。

=CELL("filename")
c:\[sample.xls]mysheet

接続文字列は 1 回指定され、5 つのシートすべてで再利用されます。

Excel で表示される名前と一致しない文字列でシートを参照する必要がある可能性はありますか? たぶん隠し文字、スペースなど?シートの本当の名前を見つける別の方法はありますか? このデータを取得するための他の提案はありますか?

注: Excel ドキュメントを変更することはできません (自分のやり方でできれば、SSIS を使用して CSV をインポートしたはずです)。

.NET 3.5 / II6 を使用しています。

4

1 に答える 1

1

さて、シートの実際の名前を明らかにする方法を見つけました。

質問の接続文字列を使用して、これを行うことができます...

OleDbConnection conn = new OleDbConnection(ExcelConn);
conn.Open();
...
conn.Close();

接続を開いた状態で、デバッガーを使用してシート名を取得できます。

conn.GetSchema("Tables").Rows[0]["TABLE_NAME"]
conn.GetSchema("Tables").Rows[1]["TABLE_NAME"]
...
conn.GetSchema("Tables").Rows[9]["TABLE_NAME"]

Excel ドキュメントに 10 個のシート名があることがわかりました。エラーの原因となった 2 つのシートには、「$」で後置された同様の名前がありました。誰かが Excel 文書を私に送信する前にそれをいじっても構わないと思っているので、私はサポートの悪夢に直面していると思いますが、少なくともデータを引き出す方法は知っています。

于 2010-04-15T15:48:19.597 に答える