문제

아래에 표시된 코드를 사용하여 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);
}
도움이 되었습니까?

해결책

"외부 테이블은 예상 형식이 아닙니다." 일반적으로 Microsoft.jet.oledb.4.0 및 확장 속성 = 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;";

다른 팁

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

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

(언급하기에는 평판이 너무 낮지 만 이것은 Excel 2007의 Jet 대신 ACE 엔진을 사용하는 Joshcaba의 항목에 대한 의견입니다.)

컴퓨터에 ACE를 설치/등록하지 않은 경우 다음을 얻을 수 있습니다. https://www.microsoft.com/en-us/download/details.aspx?id=13255

Excel 2010에도 적용됩니다.

내 케이스를 추가하십시오. 내 XLS 파일은 웹 사이트에서 데이터 내보내기 기능에 의해 생성되었으며, 파일 확장은 XLS이며, MS Excel 2003에서 일반적으로 열 수 있습니다. 외부 테이블은 예상 형식 "예외가 아닙니다.

마지막으로, 문제는 예외가 말했듯이 "예상되는 형식이 아님"입니다. Extention 이름은 XL이지만 텍스트 편집기와 함께 열면 실제로는 잘 형성된 HTML 파일이지만 모든 데이터는u003Ctable> , 각u003Ctr> 줄과 각각입니다u003Ctd> 셀입니다. 그런 다음 HTML 방식으로 구문 분석 할 수 있다고 생각합니다.

나는이 같은 문제 (ace.oledb 사용)를 가지고 있었고 나를 위해 해결 한 것은이 링크였습니다.

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

그것의 요점은 여러 사무실 버전과 다양한 Office SDK, 어셈블리 등을 설치하면 aceoledb.dll 참조가 Office14 대신 Office12 폴더를 가리키는 레지스트리에서 aceoledb.dll 참조로 이어졌다는 것입니다.

C : Program Files Common Files Microsoft Shared Office14 Aceoledb.dll

링크에서 :

또는 액세스 버전의 DLL 경로를 변경하도록 레지스트리 키를 수정할 수 있습니다.

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

또한 가져 오는 시트에 복잡한 간접 () 공식을 사용하려고 할 때이 오류를 보았습니다. 나는 이것이 하나의 수입과 다른 하나는 그렇지 않은 두 통합 문서 사이의 유일한 차이 였기 때문에 이것을 알아 차렸다. 둘 다 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 가져 오기에 대한 확장 속성을 변경했습니다. 이것 Marcus Miris의 게시물 :

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

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

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

같은 문제에 부딪쳐이 스레드를 찾았습니다. 위의 제안 중 어느 것도 @Smith의 의견을 제외하고 4 월 17 '13 년 4 월 17 일에 인정 된 답변에 대한 도움이되지 않았습니다.

내 문제의 배경은 @zhiyazw의 기본적으로 DTSX 패키지의 데이터 소스로 내보낸 Excel 파일 (내 경우 SSR)을 설정하려고합니다. 내가 한 일을 약간 땜질 한 후에는 워크 시트를 바꾸는 것이 었습니다. @Smith가 제안한 것처럼 소문자 일 필요는 없습니다.

ACE OLEDB는 Excel 파일이 특정 XML 구조를 따르기를 기대하지만 어떻게 든보고 서비스는이를 알지 못합니다.

해당 Excel 파일 주소는 잘못된 확장을 가질 수 있습니다. 확장을 XLS에서 XLSX로 변경하거나 그 반대를 변경하고 다시 시도 할 수 있습니다.

파일이 읽기 전용이면 제거하면 다시 작동해야합니다.

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

이미지 또는 차트가 포함 된 파일 일 수도 있습니다. http://kb.tableausoftware.com/articles/knowledgebase/resolving-error-external-stable-is-in-in-in-in-pected-format

권장 사항은 Excel 2003으로 저장하는 것입니다

이 문제에 대한 솔루션을 추가합니다. .xlsx 파일을 웹 서버에 업로드 한 다음 IT를 읽고 SQL Server에 대량 삽입을했습니다. 이 동일한 오류 메시지를 받고 있었고 모든 제안 된 답변을 시도했지만 아무도 작동하지 않았습니다. 결국 파일을 Excel 97-2003 (.xls)로 저장했습니다.

여전히이 문제가 있다면 권한을 확인하고, 이러한 제안을 많이 시도했는데 구체적인 문제는 처리하려는 파일이 소스 제어하에 있었고 스레드에 권한이 없다는 것이 었습니다. 전체 폴더 권한을 변경해야했습니다. 그리고 그것은 작동하기 시작했습니다 (나는 거기에서 많은 파일을 처리하고있었습니다) ... 또한 파일 이름을 변경하거나 파일이 다른 프로세스에 의해 loicked가 아닌지 확인하는 것과 같은 많은 제안과 일치합니다.

도움이되기를 바랍니다.

에이스는 제트기를 대체했다

ACE는 이전의 모든 버전의 사무실을 지원합니다

이 코드는 잘 작동합니다!

        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과 같은 것을 사용하여 프로그래밍 방식으로 보호를 제거하는 것입니다.

최근에 이전에 나열된 답변과 일치하지 않는 상황 에서이 오류를 보았습니다. 그것은 갈등으로 판명되었습니다 자동. 해결 방법 : 일시적으로 자동 비활성화.

최근 에이 "System.data.oledb.oledbexception (0x80004005) : 외부 테이블이 예상 형식이 아닙니다." 오류가 발생합니다. Microsoft Access 2010 런타임에 의존했습니다. 2018 년 12 월 12 일에 내 서버에 자동으로 설치된 업데이트 전에 C# Code는 Microsoft.ace.oledb.12.0 제공 업체를 사용하여 잘 운영되었습니다. 2018 년 12 월 12 일의 업데이트가 설치된 후 로그 파일에서 "외부 테이블이 예상 형식이 아님"을 얻기 시작했습니다.

Microsoft Access 2010 런타임을 버리고 Microsoft Access 2013 런타임을 설치했으며 "System.data.oledb.oledbexception (0x80004005)없이 C# 코드가 다시 작동하기 시작했습니다. 외부 테이블은 예상 형식이 아닙니다." 오류.

이 오류를 수정 한 2013 버전https://www.microsoft.com/en-us/download/confirmation.aspx?id=39358

2010 년 12 월 12 일에 내 서버에 자동으로 설치된 업데이트 전에 저를 위해 작동 한 버전.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 폴더에 대한 권한이 필요하다는 것을 알았습니다.

내 범위는 템플릿 다운로드로 구성되며 템플릿이 데이터로 채워질 때 템플릿을 확인합니다.

1) 헤더 행이있는 템플릿 (.xlsx) 파일을 다운로드하십시오. 파일은 사용하여 생성됩니다 OpenXML 그리고 완벽하게 작동합니다.

2) 다운로드 된 상태에서 변경없이 동일한 파일을 업로드하십시오. 이렇게하면 연결 오류가 발생하고 실패합니다 (OLEDB 연결은 Excel 시트를 읽는 데 사용됩니다).

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

아이디어가있는 사람이라면 문제가 우리가 생성하는 파일과 연결되어 있습니다. XML 형식을 열고 변환을 Excel 형식으로 저장하면 잘 작동하면 잘 작동합니다.

선호하는 파일 유형으로 Excel을 다운로드 할 아이디어가 있습니까?

이전 코드로 작업하고 동일한 일반적인 예외를 발견했습니다. 이 문제를 추적하기가 매우 어렵 기 때문에 다른 사람을 도와 줄 경우 여기에 추가 할 것이라고 생각했습니다.

제 경우에는 프로젝트의 다른 곳에 코드가 있었는 ~ 전에 OLEDBCONNECTION은 파일을 열려고했습니다 (이것은 기본 클래스에서 수행되었습니다).

그래서 기본적으로 전화해야했습니다 Close() StreamReader 객체에서 먼저 OLEDB 연결을 성공적으로 열 수 있습니다. Excel 파일 자체 또는 OLEDBCONNECTION 문자열 (자연스럽게 처음으로보고있는 곳)과 관련이 없었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top