web-dev-qa-db-ja.com

Excel "外部テーブルの形式が正しくありません。"

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

「外部表の形式が正しくありません。」通常使用する接続文字列でExcel 2007ファイルを使用しようとすると、発生します。Microsoft.Jet.OLEDB.4.0とExtended Properties = Excel 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;";
232
FAtBalloon

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

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

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

Aceをインストールまたは登録していない場合は、次のURLから入手できます。 http://www.Microsoft.com/downloads/details.aspx?FamilyID=7554F536-8C28-4598-9B72- EF94E038C891&displaylang = ja

Excel 2010にも適用されます。

14
cederlof

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

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

8
Joe Ding

私はこれと同じ問題(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

リンクから:

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

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

(OS:64bitオフィス:64bit)または(OS:32bitオフィス:32bit)

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

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

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

(OS:64bitオフィス:32bit)

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

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

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

3
jordanhill123

私はサードパーティとOledbがXLSXブックを読んでいるときにエラーが出ました。問題は、エラーを引き起こす隠れたワークシートのようです。ワークシートを非表示にすると、ワークブックをインポートできました。

2
John M

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

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

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

そしてエラーは消えた。

2
John M. Black

私はこの問題を抱えていて、Extended PropertiesをHTML Importに変更して、 this Marcus Mirisによる投稿に従って修正しました。

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

ファイルが読み取り専用の場合は、それを削除するだけで再び機能します。

1
Tehscript

そのExcelファイルアドレスには、不正の拡張子があります。拡張子をxlsからxlsxに(またはその逆に)変更して、やり直してください。

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

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

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

1
kerwei

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

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

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

3)ドロップダウンをクリックしてください(タイプを付けて保存)

enter image description here

4)Excel 97-2003ブックを選択します

enter image description here

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

enter image description here

1
Kamran

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

https://msdn.Microsoft.com/ja-jp/library/Microsoft.office.interop.Excel.workbooks.open(v = office.15).aspx

1
Nelson

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();
0
Akshay Upadhyay

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

0
KthProg

それでもこの問題が解決しない場合は、権限を確認してください。これらの提案の多くを試してみました。具体的な問題は、処理したいファイルにソース管理があり、スレッドに権限がないということです。それは(私はそこに多くのファイルを処理していました)...それはまた働き始めました...それはまたファイルの名前を変えるか、またはファイルが他のプロセスによってなめらかにされていないことのチェックのような多くの提案にマッチします。

お役に立てば幸いです。

0
Juan

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

0
Kieran Quinn

私は最近、先に挙げた答えのどれとも一致しない文脈でこの誤りを見ました。 AutoVer と衝突していることがわかりました。回避策:一時的にAutoVerを無効にします。

0
unbob

ファイルが別のプロセスによってロックされている可能性があります、あなたはそれがこれで言うようにそれをロードしてそれをロードする必要がありますpost

0
user3140982

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

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

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

ここでデータがいっぱいになると、プログラムは期待通りに動作します。

問題が発生しているファイルに関連しているという考えをお持ちの方は、それを開いてExcel形式に変換して保存すればxml形式になり、うまく機能します。

好みのファイルタイプのExcelをダウンロードするというアイデアは?

0

いくつかの古いコードを使用して、この同じ一般的な例外に遭遇しました。問題を追跡するのは非常に難しいので、他の人に役立つ場合はここに追加すると思いました。

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

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

0
tbone

私は最近この "System.Data.OleDb.OleDbException(0x80004005):外部表の形式が適切ではありません"を見つけました。エラーが発生します。私はMicrosoft Access 2010 Runtimeに頼っていました。 2018年12月12日に私のサーバーに自動的にインストールされたアップデートの前に私のC#コードはMicrosoft.ACE.OLEDB.12.0プロバイダーを使ってうまく動いた。 2018年12月12日からの更新がインストールされた後、私は私のログファイルに "外部テーブルは期待されたフォーマットではありません"を取得し始めました。

Microsoft Access 2010ランタイムを捨ててMicrosoft Access 2013ランタイムをインストールしたところ、C#コードが "System.Data.OleDb.OleDbException(0x80004005):外部表の形式が正しくありません"と表示され、再度機能するようになりました。エラー.

このエラーを修正した2013年版 https://www.Microsoft.com/ja-jp/download/confirmation.aspx?id=39358

12月12日に私のサーバーに自動的にインストールされたアップデートの前に私のために働いていた2010年のバージョン。 https://www.Microsoft.com/en-us/download/confirmation.aspx?id=1091https://www.Microsoft.com/ja-jp/download/) confirmation.aspx?id = 1091

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

0
vvvv4d

これは、画像やチャートを含むファイルにすることもできます。こちらを参照してください。 フォーマット

推奨事項はExcel 2003として保存することです。

0
Andrey Belykh