Excel "외부 테이블이 예상 한 형식이 아닙니다."


162

아래 표시된 코드를 사용하여 Excel (xlsx) 파일을 읽으려고합니다. "외부 테이블이 예상 한 형식이 아닙니다."라는 메시지가 나타납니다. Excel에서 파일을 이미 열지 않으면 오류가 발생합니다. 즉, C # 프로그램에서 if를 읽으려면 먼저 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 나는 이것을 엑셀 시트에 받았는데, 그것을 열려고 할 때 현재 ACE와 제안 된 확장 속성을 사용하고있었습니다. 수동으로 파일을 열면 맨 위에 편집을 활성화하라는 메시지가 표시되고 비트를 자동으로 뒤집는 방법을 정렬해야하지만 파일을 얻는 경우 파일을 연 다음 편집을 활성화해야 할 수도 있습니다 . 파일을 읽기 전용으로 열 수 있는지 확인할 수 있습니다.이 스레드에서 그에 대해 매우 먼 것을 보았습니다.
Jeff Patton

답변:


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 및 오류 수정.
Jeff Davis

4
.xlsx 또는 .xls 확장자?
FAtBalloon

3
: 당신이 먼저 설치해야 할 수도 있습니다 microsoft.com/en-us/download/confirmation.aspx?id=23734
rovsen

11
이것은 믿을 수 없지만, 나는 단순히 시트 이름을 모두 소문자로 바꾸고 sheet1 $를 사용합니다
Smith

3
LinqToExcel을 사용하고 있으며 LinqToExcel이 해당 쿼리 문자열을 사용하도록하려면 파일 이름을 xlsx로 바꿔야합니다. 문제의 스프레드 시트는 실제로 Excel 97 스프레드 시트이지만 odbc 공급자는 그 점에 신경 쓰지 않는 것 같습니다. LinqToExcel이 올바른 쿼리 문자열을 사용하도록 속이면 공급자는 파일 확장자와 관계없이 파일을 읽는 방법을 분명히 결정합니다. 내 경우에 편리한 허점.
Tim Coker

26

이 코드에 감사드립니다 :) 정말 감사합니다. 나를 위해 작동합니다.

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

따라서 diff 버전의 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;"""

5
참고 : Jet OleDb가 설치되어 .xls있지 않은 PC 에서 파일 을 열려고하면 OleDbException이 발생 합니다.
jp2code

@Trex 마지막 코드 줄이 정확합니까? 편집기에서 다시 확인할 수 있습니까?
Jogi

15

(저는 평판이 너무 좋지 않지만 이것은 Excel for Jet 2007 대신 Ace 엔진을 사용하는 JoshCaba의 항목에 대한 의견입니다)

컴퓨터에 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에서 열 수 있습니다. 그러나 Microsoft.Jet.OLEDB.4.0과 Microsoft.ACE.OLEDB.12.0은 " 외부 테이블이 예상 한 형식이 아닙니다 "예외입니다.

마지막으로 예외는 "예상 된 형식이 아닙니다"라는 문제가 있습니다. 확장자 이름은 xls이지만 텍스트 편집기로 열면 실제로 잘 구성된 html 파일이며 모든 데이터는 <table>에 있으며 각 <tr>은 행이고 각 <td>는 세포. 그런 다음 html 방식으로 구문 분석 할 수 있다고 생각합니다.


이것은 나의 경우이기도하지만 내 파일은 실제로 XML이었습니다. 여전히 OBDC를 사용하여 가져 오는 방법을 아는 것이 좋지만 지원되는 것으로
David Rogers

@DavidRogers, XML ODBC Driver와 같은 것을 보았지만 결코 사용하지 않았습니다 .cdata.com / drivers / xml / odbc를 살펴 보십시오 .
Joseph Ding

같은 경우, 메모장으로 파일을 열 때 마술이 시작된 것 같습니다. 사실 지금까지 게시물을보기 위해 아래로 스크롤하지 않았기 때문에 답변을 상향 투표하고 있습니다 (이미 파일을 이미 열거 나 파싱했습니다) HTML 민첩성 팩으로 ...)하지만 당신의 대답은 순수한 논리에 의해 최고가 될 가치가 있습니다 : 파일 열기! 내부에 Excel 스타일의 파일 스타일이 있는지 확인하십시오!
Gabriel G

html 파일 인 경우 다음과 같이 확장 된 속성을 간단히 적용하십시오.Extended Properties=""HTML Import;HDR=No;IMEX=1
Nepaluz

4

나는 같은 문제가 있었다. 다음 단계를 사용하여 해결했습니다.

1.) 파일을 클릭하십시오

2.) "다른 이름으로 저장"을 선택하십시오

3.) 드롭 다운을 클릭하십시오 (유형으로 저장).

여기에 이미지 설명을 입력하십시오

4.) Excel 97-2003 통합 문서를 선택하십시오.

여기에 이미지 설명을 입력하십시오

5.) 저장 버튼을 클릭하십시오

여기에 이미지 설명을 입력하십시오


1
우우! 오래된 파일 형식으로 되 돌리는 것도 고려할 필요가 없습니다. 이 답변을 작성할 당시 97-2003 형식은 16 세이고 12 년이 지났습니다. 몇 년 동안 이해할 수 있었지만 10 년이 지난 구식 전문가는 파일 형식이 더 오래되어야한다고 제안해서는 안됩니다.
Lemiarty

3

나는 동일한 문제 (ACE.OLEDB 사용)를 가지고 있었고 나를 위해 그것을 해결 한 것은 다음 링크였습니다.

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

요점은 여러 사무실 버전과 다양한 사무실 SDK, 어셈블리 등을 설치하면 레지스트리에서 OFFICE14 대신 OFFICE12 폴더를 가리키는 ACEOleDB.dll 참조가 발생한다는 것입니다.

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

링크에서 :

또는 dll 경로를 Access 버전의 경로와 일치하도록 변경하여 레지스트리 키를 수정할 수 있습니다.

Access 2007은 OFFICE12, Access 2010-OFFICE14 및 Access 2013-OFFICE15를 사용해야합니다.

(OS : 64 비트 오피스 : 64 비트) 또는 (OS : 32 비트 오피스 : 32 비트)

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

값 이름 : (기본값)

값 데이터 : C : \ Program Files \ Common Files \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

(OS : 64 비트 오피스 : 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입니다. 나는이 변형의 문제가 있었고 Repair는 regedit ;-)로 귀찮게하지 않고 모든 레지스트리 키를 재설정한다고 가정합니다.
binki

2

가져 오는 시트에 복잡한 INDIRECT () 수식을 사용하려고 할 때도이 오류가 발생했습니다. 하나는 가져오고 다른 하나는 그렇지 않은 두 통합 문서 간의 유일한 차이점이기 때문에 이것을 알았습니다. 둘 다 2007+ .XLSX 파일이었으며 12.0 엔진이 설치되었습니다.

나는 이것이 다음과 같은 문제임을 확인했다.

  • 파일 사본 만들기 (여전히 문제가 있었으므로 다른 이름으로 저장 차이는 없었습니다)
  • 간접 수식을 사용하여 시트의 모든 셀 선택
  • 값으로 만 붙여 넣기

오류가 사라졌습니다.


2

XLSX 통합 문서를 읽는 타사 및 Oledb에서 오류가 발생했습니다. 이 문제는 오류를 발생시키는 숨겨진 워크 시트 인 것으로 보입니다. 워크 시트를 숨기면 통합 문서를 가져올 수있었습니다.



1

같은 문제가 발생 하여이 스레드를 찾았습니다. 위의 제안 중 어느 것도 @Smith가 '13 년 4 월 17 일 수락 된 답변에 대한 의견을 제외하고는 도움이되지 않았습니다.

내 문제의 배경은 @zhiyazw와 충분히 가깝습니다. 기본적으로 내 보낸 Excel 파일 (필자의 경우 SSRS)을 dtsx 패키지의 데이터 소스로 설정하려고합니다. 땜질을 한 후에 내가 한 모든 일은 워크 시트의 이름을 바꾸는 것입니다. @Smith가 제안한 것처럼 소문자 일 필요는 없습니다.

ACE OLEDB는 Excel 파일이 특정 XML 구조를 따를 것으로 예상하지만 Reporting Services는이를 인식하지 못합니다.


예상 형식이 아닌 동일한 테이블 문제가 발생했습니다. 통합 문서에 숨겨진 시트가 없는지 확인했습니다. 통합 문서의 실제 워크 시트 이름은 대문자이지만 C # 코드에서 탭 이름으로 .ToLower () 추가 한 파일을 구문 분석하면 Excel 파일을 다시 구문 분석 할 수 있습니다. 감사합니다!
vvvv4d

1

Excel 파일 주소의 확장자가 잘못되었을 수 있습니다. 확장명을 xls에서 xlsx로 변경하거나 그 반대로 변경할 수 있습니다.


0

파일이 다른 프로세스에 의해 잠겨있을 수 있습니다.이 게시물에 표시된대로 파일을 복사 한 다음로드해야합니다.



0

이 문제에 내 솔루션을 추가하십시오. .xlsx 파일을 웹 서버에 업로드 한 다음 파일을 읽고 SQL Server에 대량 삽입했습니다. 이 동일한 오류 메시지가 나타 났으며 모든 제안 된 답변을 시도했지만 아무것도 작동하지 않았습니다. 결국 나는 파일을 엑셀 97-2003 (.xls)으로 저장했는데 ... 이제 유일한 문제는 원본 파일에 110,000 + 행이 있다는 것입니다.


0

여전히이 문제가 발생하면 권한을 확인하십시오. 이러한 제안을 많이 시도했으며 구체적인 문제는 처리하려는 파일에 소스 제어가 있고 스레드에 권한이 없다는 것입니다. 전체 폴더 권한을 변경해야했습니다 그리고 그것은 작동하기 시작했습니다 (저는 많은 파일을 처리하고있었습니다) ... 또한 파일 이름을 변경하거나 다른 프로세스가 파일을 핥지 않았는지 확인하는 것과 같은 많은 제안과 일치합니다.

도움이 되길 바랍니다.


0

나는이 문제가 있었고 확장 속성을 HTML 가져 오기로 변경 하면 Marcus Miris 가이 게시물에 따라 수정했습니다 .

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

0

OleDb 대신 Excel Interop을 사용하여 워크 시트를 읽기 전용으로 열 수 있습니다.

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


5
Excel interop은 Excel 작업에 권장되는 방법이 아닙니다. 많은 문제가 발생할 수 있으므로 권장하지 않습니다.
MaxOvrdrv

이 게시물은 오래된 게시물이지만 MaxOvrdrv에 동의하지만 interop을 사용하는 것은 좋은 생각이 아니며 다른 이유로 서버에 Excel을 완전히 설치 해야하는 경우 피해야합니다.
Lemiarty

절대로이 작업을 수행해서는 안됩니다.
sovemp

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

0

통합 문서가 암호로 보호되어있을 때 발생할 수 있습니다. 이 보호 기능을 제거하는 몇 가지 해결 방법이 있지만 온라인에서 볼 수있는 대부분의 예제는 구식입니다. 어느 쪽이든, 간단한 해결책은 통합 문서를 수동으로 보호 해제하는 것입니다. 그렇지 않으면 OpenXML과 같은 것을 사용하여 보호를 프로그래밍 방식으로 제거하십시오.


0

최근에 이전에 나열된 답변과 일치하지 않는 컨텍스트에서이 오류가 발생했습니다. AutoVer 와 충돌 한 것으로 판명되었습니다 . 해결 방법 : AutoVer를 일시적으로 비활성화하십시오.


0

최근에이 "System.Data.OleDb.OleDbException (0x80004005) : 외부 테이블이 예상 한 형식이 아닙니다." 오류가 발생했습니다. Microsoft Access 2010 Runtime을 사용하고있었습니다. 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 시트를 읽는 데 사용 중임).

여기에 데이터가 채워지면 프로그램이 예상대로 작동합니다.

문제가 우리가 그것을 만들고있는 파일과 관련이 있다고 생각하는 사람은 누구나 XML입니다. 을 열고 저장하면 Excel 형식으로 변환하면 제대로 작동합니다.

선호하는 파일 형식으로 Excel을 다운로드 할 생각이 있습니까?


당신은 당신의 답변에 질문을하지 않아야합니다, 당신은 당신의 질문에 대한 답변이 필요한 경우 별도로 질문하십시오.
Abhishek Garg 12

0

이전 코드로 작업하고 동일한 일반 예외가 발생했습니다. 문제를 추적하기가 매우 어려우므로 다른 사람을 돕기 위해 여기에 추가 할 것이라고 생각했습니다.

필자의 경우 프로젝트의 다른 곳에서 이전에 Excel 파일에서 StreamReader를 여는 코드가있었습니다. OleDbConnection이 시도 (기본 클래스에서 수행되었습니다).

따라서 기본적으로 Close()StreamReader 개체를 먼저 호출 하면 OleDb 연결을 성공적으로 열 수 있습니다. Excel 파일 자체 또는 OleDbConnection 문자열과 관련이 없습니다 (당연히 내가 처음 보았던 곳).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.