168

以下に示すコードを使用して、Excel (xlsx) ファイルを読み込もうとしています。「外部テーブルが予期された形式ではありません」というメッセージが表示されます。ファイルを既に Excel で開いていない限り、エラーが発生します。つまり、C# プログラムから読み取るには、まず Excel でファイルを開く必要があります。xlsx ファイルは、ネットワーク上の共有にあります。最初にファイルを開かずにファイルを読むにはどうすればよいですか? ありがとう

string sql = "SELECT * FROM [Sheet1$]";
string excelConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathname + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\"";

using (OleDbDataAdapter adaptor = new OleDbDataAdapter(sql, excelConnection)) {
    DataSet ds = new DataSet();
    adaptor.Fill(ds);
}
4

25 に答える 25

252

「外部テーブルが予期された形式ではありません。」通常、Microsoft.Jet.OLEDB.4.0 および Extended Properties=Excel 8.0 を使用する接続文字列で Excel 2007 ファイルを使用しようとすると発生します。

次の接続文字列を使用すると、ほとんどの問題が解決するようです。

public static string path = @"C:\src\RedirectApplication\RedirectApplication\301s.xlsx";
public static string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";
于 2009-09-01T16:38:52.207 に答える
28

このコードをありがとう:)本当に感謝しています。私のために働きます。

public static string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

したがって、Excelファイルの差分バージョンを使用している場合は、ファイル名を取得します。拡張子が.xlsxの場合は、次を使用します。

Private Const connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

.xlsの場合は、次を使用します。

Private Const connstring As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" + path + ";Extended Properties=""Excel 8.0;HDR=YES;"""
于 2010-02-11T06:38:45.470 に答える
16

(私はコメントするには評判が低すぎますが、これはJoshCabaのエントリに対するコメントであり、Jet for Excel 2007の代わりにAceエンジンを使用しています)

マシンにAceがインストール/登録されていない場合は、https ://www.microsoft.com/en-US/download/details.aspx?id=13255で入手できます。

Excel2010にも適用されます。

于 2011-02-25T14:10:29.453 に答える
9

私のケースを追加するだけです。私の xls ファイルは Web サイトからのデータ エクスポート機能によって作成されたもので、ファイル拡張子は xls で、通常は MS Excel 2003 で開くことができます。外部テーブルが期待される形式ではありません」という例外が発生します。

最後に、問題は、例外が言ったように、「期待される形式ではない」ことです。エクステンション名は xls ですが、テキスト エディターで開くと、実際には整形式の html ファイルであり、すべてのデータは <table> にあり、各 <tr> は行であり、各 <td> は行です。細胞。次に、htmlの方法で解析できると思います。

于 2016-01-22T12:25:00.073 に答える
2

インポート中のシートで複雑な INDIRECT() 式を使用しようとしたときにも、このエラーが発生しました。これは、一方がインポートされ、もう一方がインポートされていない 2 つのワークブックの唯一の違いであるため、これに気付きました。どちらも 2007 年以降の .XLSX ファイルで、12.0 エンジンがインストールされていました。

これが問題であることを次の方法で確認しました。

  • ファイルのコピーを作成します(まだ問題があったため、名前を付けて保存した場合の違いではありませんでした)
  • 間接数式でシート内のすべてのセルを選択する
  • 値としてのみ貼り付け

そしてエラーは消えました。

于 2012-05-11T19:33:51.103 に答える
2

これが非常に古い投稿であることは承知していますが、この問題をどのように解決したかについて、私も貢献できます。

「Microsoft.ACE.OLEDB.12.0」もプロバイダーとして使用します。コードで XLSX ファイルを読み込もうとすると、「外部テーブルが予期された形式ではありません」というエラーが表示されました。ただし、ファイルを Excel で開いたままにしておくと、コードがそれを読み込もうとしましたが、うまくいきました。

解決策: 会社のドキュメントで Office 365 を使用しています。私の場合、解決策は非常に簡単でした。ドキュメントの機密性を無効にして、「公開」に設定するだけで済みました。詳細: 「公開」として保存した後も、緑色のチェックは「内部使用」にマークされたままでしたが、その後問題は解決したままでした。

ここに画像の説明を入力

于 2020-11-18T14:14:54.327 に答える
1

この問題があり、拡張プロパティを HTML インポートに変更すると、Marcus Miris によるこの投稿に従って修正されました。

strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & importedFilePathAndName _
         & ";Extended Properties=""HTML Import;HDR=No;IMEX=1"";"
于 2016-06-24T13:07:54.017 に答える
1

同じ問題に遭遇し、このスレッドを見つけました。13年4月17日に受け入れられた回答に対する@Smithのコメントを除いて、上記の提案はどれも役に立ちませんでした。

私の問題の背景は@zhiyazwのものに十分近いです-基本的に、エクスポートされたExcelファイル(私の場合はSSRS)をdtsxパッケージのデータソースとして設定しようとしています。私がやったのは、いじくり回した後、ワークシートの名前を変更することだけでした。@Smithが示唆しているように、小文字である必要はありません。

ACE OLEDB は Excel ファイルが特定の XML 構造に従うことを期待していると思いますが、Reporting Services はそれを認識していません。

于 2018-06-27T08:02:40.980 に答える
0

ACEはJETに取って代わりました

Ace は以前のバージョンの Office をすべてサポートしています

このコードはうまく機能します。

        OleDbConnection MyConnection;
        DataSet DtSet;
        OleDbDataAdapter MyCommand;
        
        MyConnection = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\\Book.xlsx;Extended Properties=Excel 12.0;");
        MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection);
        DtSet = new System.Data.DataSet();
        
        MyCommand.Fill(DtSet);
        dataGridView1.DataSource = DtSet.Tables[0];
        MyConnection.Close();
于 2016-10-03T11:14:14.653 に答える
0

OleDb の代わりに、Excel Interop を使用してワークシートを読み取り専用で開くことができます。

https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.workbooks.open(v=office.15).aspx

于 2009-07-16T18:33:25.780 に答える
0

これは、画像やグラフを含むファイルにすることもできます。これを参照してください: http://kb.tableausoftware.com/articles/knowledgebase/resolving-error-external-table-is-not-in-expected-format

Excel 2003 として保存することをお勧めします。

于 2014-09-24T02:53:42.730 に答える
0

これは、ブックがパスワードで保護されている場合に発生する可能性があります。この保護を解除する回避策はいくつかありますが、オンラインで見つけられる例のほとんどは古くなっています。いずれにせよ、簡単な解決策はワークブックの保護を手動で解除することです。それ以外の場合は、OpenXML などを使用してプログラムで保護を解除します。

于 2017-02-02T15:25:31.323 に答える