質問

以下に示すコードを使用して 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);
}
役に立ちましたか?

解決

「外部表は、予想される形式ではありません。」使用する接続文字列を使用してExcel 2007のファイルを使用しようとすると、通常発生します。Microsoft.Jet.OLEDB.4.0と拡張プロパティ=エクセル8.0

次の接続文字列を使用して、ほとんどの問題を修正するようです。

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;";

他のヒント

このコードのおかげで:)私はそれを本当に感謝しています。私のために動作します。

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;"""

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

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

Excel 2010 にも適用されます。

ただ、私の場合を追加します。私のXLSファイルは、ファイル拡張子がxlsファイルで、ウェブサイトからのデータエクスポート機能によって作成された、それは通常、MSエクセル2003で開くことができますが、両方Microsoft.Jet.OLEDB.4.0とMicrosoft.ACE.OLEDB.12.0は "です外部テーブルは予期された形式」例外ではありません。

最後に、問題がある、例外が言ったと同じように、「それは期待の形式ではありません」。それは拡張子名はXLSあるのですが、私は、テキストエディタで開いたときに、それは実際によく形成されたhtmlファイルですが、すべてのデータは、各の行で、<表>にあり、それぞれがであります細胞。それから私は、私は、HTMLの方法でそれを解析することができると思います。

私はこの同じ問題(ACE.OLEDBを使用した)を持っていたものを私のためにそれを解決することは、このリンクします:

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

それの要旨はなど、複数のバージョンのOfficeと様々なオフィスのSDKの、アセンブリを、インストールは

ではなくOFFICE14のOffice12にフォルダにレジストリポインティングでACEOleDB.dll参照につながっていたということです
  

C:\ Program Files \ Commonファイル\ Microsoft共有\ OFFICE14 \ ACEOLEDB.DLL

のリンクから:

  

また、あなたはあなたのAccessのバージョンのものと一致するDLLのパスを変更するレジストリキーを変更することができます。

     OFFICE14とアクセス -

アクセス2007はOffice12に、アクセス2010を使用する必要があります   2013 - OFFICE15

     

(OS:64ビット版のOffice:64)または(OS:32ビットオフィス:32ビット)

     

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

     

値の名前:(既定)

     

値のデータ:C:\ Program Files \ Commonファイル\マイクロソフト   共有\ OFFICE14 \ ACEOLEDB.DLL

     

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

     

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

     

値の名前:(既定)

     

値のデータ:C:\プログラムファイル(x86の)\ CommonのFiles \マイクロソフト   共有\ OFFICE14 \ ACEOLEDB.DLL

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

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

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

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

私は、サードパーティとXLSXワークブックのOLEDBの読み取りでエラーを得ていました。 問題は、エラーの原因と隠されたワークシートのように見えます。ワークシートがインポートするワークブックを有効に非表示解除ます。

私も同じ問題を抱えていました。これは次の手順で解決できます。

1.) 「ファイル」をクリックします。

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

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

enter image description here

4.) Excel 97-2003 ワークブックを選択します。

enter image description here

5.) 「保存」ボタンをクリックします。

enter image description here

私はこの問題を抱えていたし、HTMLのインポートに拡張プロパティを変更すると、<のhref = "http://forums.asp.net/t/993765.aspx?External%20table%20is%20not%20in%20theあたりとして、それを固定しました%20expected%20format%20" REL = "nofollowを">マーカスMirisによってこのの後:

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

の代わりにOLEDBの、あなたはエクセル相互運用機能を使用すると、読み取り専用としてワークシートを開くことができます。

<のhref = "https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.workbooks.open(v=office.15).aspx" のrel = "nofollowをnoreferrer 「> https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.workbooks.open(V = office.15).aspxのの

同じ問題に遭遇し、このスレッドを発見しました。上記の提案はいずれも4月17日'13に受け入れ答えに@スミスさんのコメント以外に役立っていない。

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

私は、ACE OLEDBは、特定のXML構造に従ってExcelファイルを見込んで何とかReporting Servicesをすると、その認識していないと仮定します。

Excelファイルのアドレスが正しくない拡張子を有することができること。あなたは、XLSX、またはその逆と再試行しXLSから拡張子を変更することができます。

ファイルは読み取り専用である場合は、それを削除し、それが再び動作するはずです。

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

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

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

ただ、この問題に私の溶液を加えます。私はそれからの読み取りとバルクは、SQL Serverに挿入し、ウェブサーバへの.xlsxファイルをアップロードしました。この同じエラーメッセージを取得した、すべての推奨的回答を試みたが、どれも働きました。最終的に私が働いていた...私が今持っている唯一の問題は、元のファイルが110,000+の行を持っていたことであるエクセル97-2003(.XLS)としてファイルを保存しました。

あなたはまだあなたの権限を確認し、その後、この問題を持っている場合は、

、私はこれらの提案の多くを試してみましたが、私の具体的な問題は、私が処理したいファイルがソース管理下にあったとのスレッドが何の権限を持っていた、私は変更しなければならなかったということでしたフォルダ全体のアクセス権と、それは(私はそこに多くのファイルを処理していた)仕事を始めた...それはまた、ファイルの名前を変更したり、ファイルが別のプロセスによってloickedされていないことを確認するように多くの示唆に一致します。

私はそれはあなたを助け願っています。

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();
ワークブックは、パスワードで保護されているとき、

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

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

私は最近、「System.Data.OleDb.OleDbException(0x80004005が):外部表が期待形式ではありません。」これを持っていましたエラーが発生します。私はのMicrosoft Access 2010ランタイムに頼りました。私のC#のコードは、罰金Microsoft.ACE.OLEDB.12.0プロバイダを使用して走った2018年、自動的に12月12日に私のサーバーにインストールされた更新に先立ち。 12月12日2018からの更新をインストールした後、私は私のログファイル内の「外部テーブルは予期された形式ではありません」を取得し始めています。

私はのMicrosoft Access 2010 Runtimeを不時着してのMicrosoft Access 2013 Runtimeをインストールして、私のC#のコードは、なしで再び働き始め、「System.Data.OleDb.OleDbException(0x80004005が):外部表が期待形式ではありません」エラーます。

私のために、このエラーを修正2013年版 https://www.microsoft.com/en-us/ダウンロード/ confirmation.aspx?ID = 39358

は自動的に12月12日私のサーバーにインストールされた更新前に私のために働いた2010年バージョン。 https://www.microsoft.com/en-us/ダウンロード/ confirmation.aspx?ID = 10910こちら https://www.microsoft.com/en-us/ダウンロード/ confirmation.aspx?ID = 10910

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

私のスコープは、テンプレートのダウンロードで構成され、それがデータでいっぱいのテンプレートを検証します だから、

1)テンプレート(.xlsx形式)ヘッダ行を使用してファイルをダウンロードします。ファイルはのの OPENXMLを使用して生成され、それが完璧に働いています。

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

ここでのデータは、期待通りのプログラムが動作満たされている場合。

問題は、我々はそれを開いて、ちょうどフォーマットをエクセルするには、それを変換し、保存し、それがうまく動作するかどうか、それはの XML の形式でだ作成しているファイルに接続されているという考えを持つ

誰ます。

有利なファイルタイプでExcelをダウンロードするには、

任意のアイデア?

いくつかの古いコードでの作業と同じ汎用的な例外に出くわしました。問題を追跡するのは非常に難しいので、私はそれが他の誰かを助け場合、私はここで追加しようと思いました。

私の場合、コードはの前にのOleDbConnectionオブジェクトは、ファイルを(これは基底クラスで行われた)。開こうとしました だから、基本的に私は最初のStreamReaderオブジェクトにClose()を呼び出すために必要な

、その後、私は正常にOLE DB接続を開くことができます。それは自分自身をExcelファイルとは何の関係も、または(私が最初に見ていたところ、当然である)OleDbConnectionオブジェクトの文字列ではありませんでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top