Bảng Excel bên ngoài không ở định dạng mong đợi.


162

Tôi đang cố đọc tệp Excel (xlsx) bằng mã được hiển thị bên dưới. Tôi nhận được một "Bảng bên ngoài không ở định dạng mong đợi." lỗi trừ khi tôi đã mở tệp trong Excel. Nói cách khác, tôi phải mở tệp trong Excel trước khi tôi có thể đọc nếu từ chương trình C # của mình. Tệp xlsx được chia sẻ trên mạng của chúng tôi. Làm thế nào tôi có thể đọc tệp mà không cần phải mở nó trước? Cảm ơn

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 Tôi đã nhận được điều này trên một bảng excel, khi cố gắng mở nó, tôi đã sử dụng ACE hiện tại và các thuộc tính mở rộng được đề xuất. Khi tôi mở tệp theo cách thủ công, nó có dấu nhắc ở trên cùng để bật chỉnh sửa, tôi cần sắp xếp cách tự động lật bit đó, nhưng nếu bạn nhận được điều này, bạn có thể chỉ cần mở tệp, sau đó bật chỉnh sửa . Tôi có thể xem nếu tôi có thể mở tệp chỉ đọc, tôi đã thấy một cái gì đó rất xa trong chủ đề này về điều đó.
Jeff Patton

Câu trả lời:


246

"Bảng bên ngoài không ở định dạng mong đợi." thường xảy ra khi cố gắng sử dụng tệp Excel 2007 với chuỗi kết nối sử dụng: Microsoft.Jet.OLEDB.4.0 và Thuộc tính mở rộng = Excel 8.0

Sử dụng chuỗi kết nối sau đây dường như để khắc phục hầu hết các vấn đề.

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
Trớ trêu thay, tôi đã nhận được lỗi này từ ứng dụng của người khác (Scribe), nhưng lời giải thích vẫn giải quyết được vấn đề cho tôi: "Lưu dưới dạng" Excel 97-2003 và đã sửa lỗi.
Jeff Davis

4
.xlsx hoặc .xls mở rộng?
FAtBalloon

3
bạn có thể phải cài đặt cái này trước: microsoft.com/en-us/doad/confirmation.aspx?id=23734
rovsen

11
điều này có thể không thể tin được, nhưng tôi chỉ cần thay đổi tên trang tính thành tất cả chữ thường và sử dụng sheet1 $
Smith

3
Tôi đang sử dụng LinqToExcel và để LinqToExcel sử dụng chuỗi truy vấn đó, tôi phải đổi tên tệp thành xlsx. Bảng tính trong câu hỏi thực sự là một bảng tính excel 97, nhưng nhà cung cấp odbc dường như không quan tâm đến điều đó. Khi tôi lừa LinqToExcel sử dụng chuỗi truy vấn chính xác, Nhà cung cấp rõ ràng xác định cách đọc tệp độc lập với phần mở rộng của tệp. Lỗ hổng thuận tiện trong trường hợp của tôi.
Tim Coker

26

Cảm ơn mã này :) Tôi thực sự đánh giá cao nó. Làm việc cho tôi.

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

Vì vậy, nếu bạn có phiên bản khác của tệp Excel, hãy lấy tên tệp, nếu phần mở rộng của nó là .xlsx , hãy sử dụng:

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

và nếu là .xls , hãy sử dụng:

Private Const connstring As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" + path + ";Extended Properties=""Excel 8.0;HDR=YES;"""

5
FYI: Điều này sẽ ném OleDbException nếu bạn cố mở một .xlstệp trên PC không cài đặt Jet OleDb trên đó.
jp2code

@Trex bạn có chắc dòng mã cuối cùng của bạn là chính xác? Bạn có thể kiểm tra lại nó trong một số trình soạn thảo một lần nữa?
Jogi

15

(Tôi có tiếng tăm quá thấp để bình luận, nhưng đây là nhận xét về mục nhập của JoshCaba, sử dụng công cụ Ace thay vì Jet cho Excel 2007)

Nếu bạn chưa cài đặt / đăng ký Ace trên máy của mình, bạn có thể tải xuống tại: https://www.microsoft.com/en-US/doad/details.aspx?id=13255

Nó cũng áp dụng cho Excel 2010.


Tôi đã cài đặt công cụ ACE, nhưng tôi cần biết tham chiếu II cần bao gồm trong dự án của mình để trình cài đặt của tôi bao gồm nó. Không phải tất cả các máy mà ứng dụng của tôi được cài đặt sẽ nhất thiết phải cài đặt MS Office.
jp2code

1
Liên kết hiện đưa ra một thông báo lỗi - We're sorry, this download is no longer available.
RBT

9

Chỉ cần thêm trường hợp của tôi. Tệp xls của tôi được tạo bởi chức năng xuất dữ liệu từ một trang web, phần mở rộng tệp là xls, nó có thể được mở bằng MS Excel 2003. Nhưng cả Microsoft.Jet.OLEDB.4.0 và Microsoft.ACE.OLEDB.12.0 đều có " Bảng bên ngoài không ở định dạng dự kiến ​​"ngoại lệ.

Cuối cùng, vấn đề là, giống như ngoại lệ đã nói, "nó không ở định dạng mong đợi". Mặc dù tên mở rộng của nó là xls, nhưng khi tôi mở nó bằng trình soạn thảo văn bản, nó thực sự là một tệp html được định dạng tốt, tất cả dữ liệu nằm trong một <bảng>, mỗi <tr> là một hàng và mỗi <td> là một tế bào. Sau đó, tôi nghĩ rằng tôi có thể phân tích nó theo cách html.


Đây cũng là trường hợp của tôi, tuy nhiên tệp của tôi thực sự là một XML. Tuy nhiên, sẽ rất tuyệt nếu biết cách nhập nó bằng OBDC, nhưng tôi không nghĩ nó được hỗ trợ.
David Rogers

@DavidRogers, tôi đã từng thấy một cái gì đó giống như Trình điều khiển ODBC XML, nhưng chưa bao giờ được sử dụng, bạn hãy xem cdata.com/drivers/xml/odbc .
Joseph Đinh

Trường hợp tương tự ở đây, tôi đoán phép thuật bắt đầu khi mở tệp bằng notepad, thực tế tôi đang bỏ phiếu cho câu trả lời của bạn vì tôi đã không cuộn xuống để xem bài đăng của bạn cho đến bây giờ (và bây giờ tôi đã mở tệp / phân tích cú pháp với gói Agml Agility ...) nhưng câu trả lời của bạn xứng đáng đứng đầu, theo logic thuần túy: MỞ ĐẦU FILE ĐẦU TIÊN! và xem nếu nó có một số kiểu tệp Excel-ish bên trong!
Gabriel G

Nếu đó là một tệp html, chỉ cần áp dụng các thuộc tính mở rộng như vậy:Extended Properties=""HTML Import;HDR=No;IMEX=1
Nepaluz

4

Tôi đã từng gặp vấn đề tương tự. mà như đã giải quyết bằng các bước sau:

1.) Nhấp vào Tệp

2.) Chọn "lưu dưới dạng"

3.) Nhấp vào thả xuống (Lưu dưới dạng)

nhập mô tả hình ảnh ở đây

4.) Chọn Sổ làm việc Excel 97-2003

nhập mô tả hình ảnh ở đây

5.) Nhấp vào nút Lưu

nhập mô tả hình ảnh ở đây


1
Boo! Hoàn nguyên về một định dạng tệp lỗi thời thậm chí không nên được xem xét. Tại thời điểm trả lời này, định dạng 97-2003 đã 16 tuổi và hết hạn 12 năm. Tôi có thể hiểu một vài năm, nhưng hơn một thập kỷ không nên đề xuất với nhà phát triển chuyên nghiệp rằng định dạng tệp cần phải cũ hơn.
Lemiarty

3

Tôi đã gặp vấn đề tương tự (Sử dụng ACE.OLEDB) và điều đã giải quyết cho tôi là liên kết này:

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

Ý chính của nó là việc cài đặt nhiều phiên bản văn phòng và các bộ, văn phòng khác nhau, v.v. đã dẫn đến tham chiếu ACEOleDB.dll trong sổ đăng ký trỏ đến thư mục OFFICE12 thay vì OFFICE14 trong

C: \ Tệp chương trình \ Tệp chung \ Microsoft đã chia sẻ \ OFFICE14 \ ACEOLEDB.DLL

Từ liên kết:

Ngoài ra, bạn có thể sửa đổi khoá đăng ký thay đổi đường dẫn dll để khớp với phiên bản Access của bạn.

Access 2007 nên sử dụng OFFICE12, Access 2010 - OFFICE14 và Access 2013 - OFFICE15

(Hệ điều hành: Văn phòng 64 bit: 64 bit) hoặc (Hệ điều hành: Văn phòng 32 bit: 32 bit)

Khóa: HKCR \ CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} \ InprocServer32 \

Tên giá trị: (Mặc định)

Dữ liệu giá trị: C: \ Tệp chương trình \ Tệp chung \ Microsoft đã chia sẻ \ OFFICE14 \ ACEOLEDB.DLL

(Hệ điều hành: Văn phòng 64 bit: 32 bit)

Khóa: HKCR \ Wow6432Node \ CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} \ InprocServer32 \

Tên giá trị: (Mặc định)

Dữ liệu giá trị: C: \ Tệp chương trình (x86) \ Tệp chung \ Microsoft đã chia sẻ \ OFFICE14 \ ACEOLEDB.DLL


Tôi thấy dễ dàng hơn khi chỉ cần đi đến Chương trình và Tính năng và Sửa chữa ACE. (Đối với tôi, ACE được đặt tên là Microsoft Access Runtime 2016). Tôi giả sử rằng tôi đã gặp phải biến thể của sự cố này và Sửa chữa chỉ cần đặt lại tất cả các khóa đăng ký cho tôi mà không phải bận tâm với regedit ;-).
b Liệu

2

Tôi cũng đã thấy lỗi này khi cố gắng sử dụng các công thức INDIRECT () phức tạp trên trang tính đang được nhập. Tôi nhận thấy điều này bởi vì đây là sự khác biệt duy nhất giữa hai sổ làm việc mà một là nhập khẩu và một là không. Cả hai đều là các tệp .XLSX 2007+ và công cụ 12.0 đã được cài đặt.

Tôi xác nhận đây là vấn đề bởi:

  • Tạo một bản sao của tệp (vẫn có vấn đề, vì vậy nó không phải là một sự khác biệt lưu lại)
  • Chọn tất cả các ô trong trang tính với công thức gián tiếp
  • Chỉ dán giá trị

và lỗi biến mất.


2

Tôi đã gặp lỗi với bên thứ ba và Oledb khi đọc sổ làm việc XLSX. Vấn đề dường như là một bảng tính ẩn gây ra lỗi. Bỏ ẩn bảng tính cho phép bảng tính để nhập.


2

Nếu tệp chỉ đọc, chỉ cần loại bỏ nó và nó sẽ hoạt động trở lại.


1

Ran vào cùng một vấn đề và tìm thấy chủ đề này. Không có gợi ý nào ở trên giúp được ngoại trừ nhận xét của @ Smith cho câu trả lời được chấp nhận vào ngày 17 tháng Tư.

Bối cảnh của vấn đề của tôi đủ gần với @ zhiyazw - về cơ bản là cố gắng đặt tệp Excel đã xuất (SSRS trong trường hợp của tôi) làm nguồn dữ liệu trong gói dtsx. Tất cả những gì tôi đã làm, sau vài lần mày mò xung quanh, là đổi tên bảng tính. Nó không phải là chữ thường như @Smith đã đề xuất.

Tôi cho rằng ACE OLEDB mong muốn tệp Excel tuân theo một cấu trúc XML nhất định nhưng bằng cách nào đó Dịch vụ báo cáo không nhận thức được điều đó.


Tôi gặp vấn đề tương tự của bảng không ở định dạng mong đợi. Tôi xác nhận sổ làm việc của tôi không có bảng ẩn. Tên bảng tính thực tế trong sổ làm việc được viết hoa nhưng trong mã C # để phân tích tệp tôi đã thêm .ToLower () cho tên tab và bây giờ tôi có thể phân tích lại tệp excel. CẢM ƠN BẠN!
vvvv4d

1

Địa chỉ tệp excel đó có thể có phần mở rộng không chính xác. Bạn có thể thay đổi tiện ích mở rộng từ xls sang xlsx hoặc ngược lại và thử lại.




0

Chỉ cần thêm giải pháp của tôi cho vấn đề này. Tôi đã tải lên một tệp .xlsx lên máy chủ web, sau đó đọc từ nó và chèn số lượng lớn vào SQL Server. Đã nhận được thông báo lỗi tương tự, đã thử tất cả các câu trả lời được đề xuất nhưng không có kết quả nào. Cuối cùng, tôi đã lưu tệp dưới dạng excel 97-2003 (.xls) hoạt động ... chỉ có vấn đề tôi có bây giờ là tệp gốc có hơn 110.000 hàng.


0

Nếu bạn vẫn gặp sự cố này, sau đó kiểm tra quyền của bạn, tôi đã thử nhiều đề xuất này và vấn đề cụ thể của tôi là tệp mà tôi muốn xử lý nằm dưới sự kiểm soát nguồn và luồng không có quyền, tôi phải thay đổi toàn bộ quyền của thư mục và nó bắt đầu hoạt động (Tôi đang xử lý nhiều tệp trong đó) ... Nó cũng khớp với nhiều đề xuất như thay đổi tên của tệp hoặc kiểm tra xem tệp không bị lừa bởi quy trình khác.

Tôi hy vọng nó sẽ giúp bạn.


0

Tôi đã gặp sự cố này và thay đổi Thuộc tính mở rộng sang Nhập HTML đã sửa nó theo bài đăng này của Marcus Miris:

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

0

Thay vì OleDb, bạn có thể sử dụng Excel Interop và mở bảng tính dưới dạng chỉ đọc.

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


5
Excel interop không phải là một phương pháp làm việc được đề xuất với Excel. Nó có thể gây ra nhiều vấn đề và do đó không nên được khuyến khích.
MaxOvrdrv

Mặc dù đây là một bài viết cũ, tôi đồng ý với MaxOvrdrv, sử dụng interop không phải là một ý tưởng hay và nên tránh, nếu không có lý do nào khác ngoài việc nó yêu cầu cài đặt đầy đủ Excel trên máy chủ.
Lemiarty 2/2/2016

Bạn tuyệt đối không nên làm điều này.
sovemp

0

ACE đã chế tạo máy bay phản lực

Ace Hỗ trợ tất cả các phiên bản trước của Office

Mã này hoạt động tốt!

        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
Nó không. Vấn đề vẫn có thể xảy ra, tôi vẫn chưa tìm ra lý do tại sao, vì các tệp của tôi đều từ excel 2007 và một số trong số chúng hoạt động, một số trong số chúng thì không.
Henrik

Bạn có một nguồn cho yêu cầu đó? Tôi không biết bản thân mình, chỉ tự hỏi. :-)
midoriha_senpai

0

Điều này có thể xảy ra khi sổ làm việc được bảo vệ bằng mật khẩu. Có một số cách giải quyết để loại bỏ sự bảo vệ này nhưng hầu hết các ví dụ bạn sẽ tìm thấy trực tuyến đã lỗi thời. Dù bằng cách nào, giải pháp đơn giản là bỏ bảo vệ sổ làm việc theo cách thủ công, nếu không hãy sử dụng một cái gì đó như OpenXML để loại bỏ bảo vệ theo chương trình.


0

Gần đây tôi đã thấy lỗi này trong ngữ cảnh không khớp với bất kỳ câu trả lời nào được liệt kê trước đây. Hóa ra đó là một cuộc xung đột với AutoVer . Giải pháp thay thế: tạm thời tắt AutoVer.


0

Gần đây tôi đã có "System.Data.OleDb.OleDbException (0x80004005): Bảng bên ngoài không ở định dạng mong đợi." xảy ra lỗi Tôi đã dựa vào Microsoft Access 2010 Runtime. Trước bản cập nhật được cài đặt tự động trên máy chủ của tôi vào ngày 12 tháng 12 năm 2018, mã C # của tôi đã chạy tốt khi sử dụng nhà cung cấp Microsoft.ACE.OLEDB.12.0. Sau khi bản cập nhật từ ngày 12 tháng 12 năm 2018 được cài đặt, tôi bắt đầu nhận được Bảng bên ngoài không ở định dạng mong đợi "trong tệp nhật ký của mình.

Tôi đã bỏ Microsoft Access 2010 Runtime và cài đặt Microsoft Access 2013 Runtime và mã C # của tôi bắt đầu hoạt động trở lại mà không có "System.Data.OleDb.OleDbException (0x80004005): Bảng bên ngoài không ở định dạng mong đợi." lỗi.

Phiên bản 2013 đã sửa lỗi này cho tôi https://www.microsoft.com/en-us/doad/conf Confirmation.aspx ? Id = 39353

Phiên bản 2010 hoạt động với tôi trước bản cập nhật được cài đặt tự động trên máy chủ của tôi vào ngày 12 tháng 12. https://www.microsoft.com/en-us/doad/conf Confirmation.aspx? id = 10910 https://www.microsoft.com/en-us/doad/conf Confirmation.aspx? id = 10910

Tôi cũng đã có lỗi này xảy ra vào tháng trước trong một quy trình tự động. Mã C # chạy tốt khi tôi chạy nó gỡ lỗi. Tôi thấy rằng tài khoản dịch vụ chạy mã cũng cần có quyền đối với thư mục C: \ Windows \ Temp.


0

Phạm vi của tôi bao gồm tải xuống mẫu và xác minh mẫu khi nó chứa đầy dữ liệu Vì vậy,

1) Tải xuống tệp mẫu (.xlsx) với hàng tiêu đề. tập tin được tạo bằng openxml và nó hoạt động hoàn hảo.

2) Tải lên cùng một tệp mà không có bất kỳ thay đổi nào từ trạng thái được tải xuống. Điều này sẽ gây ra lỗi kết nối và không thành công (kết nối OLEDB đang sử dụng để đọc bảng excel).

Ở đây nếu dữ liệu được lấp đầy, chương trình hoạt động như mong đợi.

Bất cứ ai có ý tưởng vấn đề được kết nối với tệp chúng tôi đang tạo trong xml định dạng nếu chúng tôi mở nó và chỉ lưu chuyển đổi nó thành định dạng excel và nó hoạt động tốt.

Bất kỳ ý tưởng để tải excel với loại tệp ưa thích?


bạn không nên đặt câu hỏi trong câu trả lời của mình, nếu bạn cần câu trả lời cho câu hỏi của mình, hãy hỏi riêng họ nếu cần.
Abhishek Garg

0

Làm việc với một số mã cũ hơn và gặp phải ngoại lệ chung này. Rất khó để theo dõi vấn đề, vì vậy tôi nghĩ tôi sẽ thêm vào đây trong trường hợp nó giúp được người khác.

Trong trường hợp của tôi, đã có mã ở nơi khác trong dự án đang mở StreamReader trên tệp Excel trước đó OleDbConnection cố gắng mở tệp (điều này đã được thực hiện trong lớp cơ sở).

Vì vậy, về cơ bản tôi chỉ cần gọi Close()đối tượng StreamReader trước, sau đó tôi có thể mở Kết nối OleDb thành công. Nó không liên quan gì đến chính tệp Excel hoặc với chuỗi OleDbConnection (đây là nơi tôi tự nhiên nhìn vào đầu tiên).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.