Excel「外部テーブルは予期された形式ではありません。」


162

以下のコードを使用して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);
}

FWIWこれをExcelシートで受け取りました。開こうとすると、現在のACEと推奨される拡張プロパティを使用していました。ファイルを手動で開いたとき、編集を有効にするためのプロンプトが上部に表示されていたので、そのビットを自動的に反転する方法を整理する必要がありますが、これを取得している場合は、ファイルを開いて編集を有効にする必要があるだけです。 。私はファイルを読み取り専用で開くことができるかどうかを確認するかもしれませんが、このスレッドで非常に遠い何かについてそれを見ました。
ジェフパットン

回答:


246

「外部テーブルは予期された形式ではありません。」通常、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;";

10
皮肉なことに、私は他の誰かのアプリケーション(Scribe)からこのエラーを受け取りましたが、説明は私のために問題を解決しました: "名前を付けて保存" Excel 97-2003、そしてエラーは修正されました。
ジェフデイビス、

4
.xlsxまたは.xls拡張子?
FAtBalloon、2012年

3
最初にこれをインストールする必要があるかもしれません:microsoft.com/en-us/download/confirmation.aspx
id

11
信じられないかもしれませんが、シート名をすべて小文字に変更して、sheet1 $を使用します
Smith

3
LinqToExcelを使用していますが、LinqToExcelでそのクエリ文字列を使用するには、ファイルの名前をxlsxに変更する必要があります。問題のスプレッドシートは実際にはExcel 97のスプレッドシートですが、odbcプロバイダーはそれを気にしていません。LinqToExcelをだまして正しいクエリ文字列を使用させると、プロバイダーはファイルの拡張子に関係なく、ファイルの読み取り方法を明らかに決定します。私の場合、便利な抜け穴。
Tim Coker、2014年

26

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

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

したがって、Excelファイルのdiffバージョンがある場合はファイル名を取得し、拡張子が.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;"""

5
参考:Jet OleDbがインストールされて.xlsいないPCでファイルを開こうとすると、OleDbExceptionがスローされます。
jp2code

@Trexあなたは最後のコード行が正しいと確信していますか?もう一度エディタで再確認できますか?
Jogi

15

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

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

Excel 2010にも適用されます。


ACEエンジンをインストールしましたが、インストーラーに含めるには、プロジェクトにどのリファレンスIIを含める必要があるかを知る必要があります。アプリがインストールされているすべてのマシンにMS Officeがインストールされているとは限りません。
jp2code

1
リンクでエラーメッセージが表示されるようになりました- We're sorry, this download is no longer available
RBT

9

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

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


これも私の場合でしたが、実際のファイルはXMLでした。それでも、OBDCを使用してインポートする方法を知っておくとよいでしょうが、サポートされている
デビッドロジャース

@ DavidRogers、XML ODBCドライバーのようなものを見たことがありますが、使用したことがないので、cdata.com / drivers / xml / odbcをご覧ください
Joseph Ding

同じケースで、メモ帳でファイルを開くことから魔法が始まったと思います。実際、私は今まで投稿を表示するために下にスクロールしなかったため、あなたの回答に賛成投票しています(そして今、ファイルを開いて解析しました) Html Agility packを使用して...)しかし、あなたの答えは純粋な論理によってトップに値するはずです:最初にファイルを開いてください!中にExcel風のファイルスタイルがあるかどうかを確認してください。
ガブリエルG

htmlファイルの場合は、次のように拡張プロパティを適用するだけですExtended Properties=""HTML Import;HDR=No;IMEX=1
。–ネパールズ

4

私も同じ問題を抱えていました。これらの手順を使用して解決されました:

1.)[ファイル]をクリックします

2.)[名前を付けて保存]を選択します

3.)ドロップダウンをクリックします(ファイルの種類)

ここに画像の説明を入力してください

4.)Excel 97-2003 Workbookを選択します

ここに画像の説明を入力してください

5.)[保存]ボタンをクリックします

ここに画像の説明を入力してください


1
ブー!古いファイル形式に戻すことも考慮すべきではありません。この回答の時点では、97-2003形式は16歳で12年古くなっています。数年は理解できましたが、10年以上古くても、ファイル形式を古いものにする必要があることを専門の開発者に示唆するべきではありません。
レミアーティ

3

私はこれと同じ問題(ACE.OLEDBの使用)があり、それを解決したのはこのリンクでした:

http://support.microsoft.com/kb/2459087

その要点は、複数のOfficeバージョンやさまざまなOffice SDK、アセンブリなどをインストールすると、レジストリのACEOleDB.dll参照が、OFFICE14ではなくOFFICE12フォルダを指すようになったことです。

C:\ Program Files \ Common Files \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

リンクから:

または、dllパスを変更してレジストリバージョンを変更し、Accessバージョンのパスと一致させることもできます。

Access 2007はOFFICE12、Access 2010-OFFICE14およびAccess 2013-OFFICE15を使用する必要があります

(OS:64ビットOffice:64ビット)または(OS:32ビットOffice:32ビット)

キー:HKCR \ CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} \ InprocServer32 \

値の名前:(デフォルト)

値のデータ:C:\ Program Files \ Common Files \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

(OS:64ビットOffice:32ビット)

キー:HKCR \ Wow6432Node \ CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} \ InprocServer32 \

値の名前:(デフォルト)

値のデータ:C:\ Program Files(x86)\ Common Files \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL


プログラムと機能に移動してACEを修復する方が簡単だと思いました。(私にとって、ACEはMicrosoft Access Runtime 2016という名前です)。私はこの変種の問題が発生しており、Regeditに煩わされることなく、Repairがすべてのレジストリキーをリセットしただけだと思います;-)。
binki 2016年

2

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

私はこれが問題であることを確認しました:

  • ファイルのコピーを作成する(まだ問題があったので、多少の違いはありませんでした)
  • 間接式を使用してシートのすべてのセルを選択する
  • 値としてのみ貼り付け

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


2

サードパーティとXLSXワークブックのOledbの読み取りでエラーが発生しました。問題は、エラーの原因となる非表示のワークシートのようです。ワークシートを再表示すると、ワークブックをインポートできるようになりました。



1

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

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

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


予想された形式ではない表の同じ問題に出くわしました。ワークブックに非表示のシートがないことを確認しました。ワークブックの実際のワークシート名は大文字ですが、C#コードではファイルを解析するために追加しました。タブ名に.ToLower()を追加したので、Excelファイルを再度解析できます。ありがとうございました!
vvvv4d

1

そのExcelファイルのアドレスの拡張子が正しくない可能性があります。拡張子をxlsからxlsxに、またはその逆に変更して、再試行できます。


0

ファイルが別のプロセスによってロックされている可能性があります。この投稿に記載されているように、ファイルをコピーしてロードする必要があります



0

この問題に私の解決策を追加するだけです。.xlsxファイルをWebサーバーにアップロードし、それを読み取ってSQL Serverに一括挿入していました。これと同じエラーメッセージが表示され、提案されたすべての回答を試しましたが、どれも機能しませんでした。最終的に私はファイルをExcel 97-2003(.xls)として保存しましたが、うまくいきました...私が今持っている唯一の問題は、元のファイルが110,000+行を持っていたことです。


0

それでもこの問題が解決しない場合は、アクセス許可を確認してください。これらの提案の多くを試しましたが、具体的な問題は、処理したいファイルがソース管理下にあり、スレッドにアクセス許可がないため、フォルダー全体のアクセス許可を変更する必要があったことですそして、それは働き始めました(そこで多くのファイルを処理していました)...それはまた、ファイルの名前を変更したり、ファイルが別のプロセスによってフリックされていないことを確認したりするなど、多くの提案と一致します。

お役に立てば幸いです。


0

私はこの問題を抱えていて、拡張プロパティをHTML Importに変更すると、Marcus Mirisによるこの投稿に従って修正されました。

strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & importedFilePathAndName _
         & ";Extended Properties=""HTML Import;HDR=No;IMEX=1"";"

0

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

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


5
Excelの相互運用は、Excelでの作業に推奨される方法ではありません。これは多くの問題を引き起こす可能性があるため、お勧めできません。
MaxOvrdrv 2013

これは古い投稿ですが、MaxOvrdrvに同意します。サーバーにExcelを完全にインストールする以外に理由がない場合は、相互運用機能を使用することはお勧めできません。
Lemiarty 2016

これは絶対に行わないでください。
1

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();

1
ありません。私のファイルはすべてExcel 2007からのものであり、一部は機能し、一部は機能しないため、問題は依然として発生する可能性がありますが、理由はまだわかりません。
Henrik

その主張の出所はありますか?私は自分自身を知りません、ただ疑問に思います。:-)
midoriha_senpai 2018年

0

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


0

私は最近、以前にリストされた回答のいずれとも一致しないコンテキストでこのエラーを見ました。AutoVerと競合していることが判明しました。回避策:AutoVerを一時的に無効にします。


0

私は最近この "System.Data.OleDb.OleDbException(0x80004005):外部テーブルが予期された形式ではありません"が発生しました。エラーが発生します。Microsoft Access 2010ランタイムに依存していました。2018年12月12日にサーバーに自動的にインストールされた更新の前は、Microsoft.ACE.OLEDB.12.0プロバイダーを使用してC#コードが正常に実行されていました。2018年12月12日からの更新がインストールされた後、ログファイルに「外部テーブルが予期された形式ではありません」が表示されるようになりました。

Microsoft Access 2010ランタイムを破棄し、Microsoft Access 2013ランタイムをインストールすると、C#コードが「System.Data.OleDb.OleDbException(0x80004005):外部テーブルが予期される形式ではありません」なしで再び機能し始めました。エラー。

このエラーを修正した2013バージョン https://www.microsoft.com/en-us/download/confirmation.aspx?id=39358

12月12日にサーバーに自動的にインストールされる更新の前に機能した2010バージョン。 https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910 https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910

このエラーは先月、自動化プロセスで発生しました。デバッグを実行すると、C#コードは正常に実行されました。コードを実行しているサービスアカウントにもC:\ Windows \ Tempフォルダーへのアクセス許可が必要であることがわかりました。


0

私のスコープはテンプレートのダウンロードで構成されており、データがいっぱいになったときにテンプレートを検証します。

1)ヘッダー行を含むテンプレート(.xlsx)ファイルをダウンロードします。ファイルはopenxmlを使用して生成され、完全に機能しています。

2)ダウンロードした状態から変更せずに同じファイルをアップロードします。これにより、接続エラーが発生して失敗します(OLEDB接続はExcelシートの読み取りに使用されます)。

ここでデータが入力されると、プログラムは期待どおりに動作します。

問題が発生しているという考えを持っている人は誰でも、それを開いてExcel形式に変換して保存すれば、作成中のファイルはxml形式になります。

好みのファイルタイプでExcelをダウンロードするアイデアはありますか?


答えの中で質問するべきではありません。もし質問への答えが必要なら、必要に応じて別々に尋ねてください。
Abhishek Garg

0

いくつかの古いコードを操作して、この同じ一般的な例外に遭遇しました。問題を追跡するのは非常に難しいので、誰かを助けるためにここに追加したいと思いました。

私の場合、OleDbConnectionがファイルを開こうとするに、ExcelのファイルでStreamReaderを開くコードがプロジェクトのどこかにありました(これは基本クラスで行われました)。

したがって、基本的にClose()は、まずStreamReaderオブジェクトを呼び出す必要があり、それからOleDb接続を正常に開くことができました。それは、Excelファイル自体、またはOleDbConnection文字列(当然、私が最初に見ていた場所)とは何の関係もありませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.