[C#] Excel “외부 테이블이 예상 한 형식이 아닙니다.”

아래 표시된 코드를 사용하여 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 및 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;";


답변

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

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 for Jet 2007 대신 Ace 엔진을 사용하는 JoshCaba의 항목에 대한 의견입니다)

컴퓨터에 Ace를 설치 / 등록하지 않은 경우 다음 사이트에서 구할 수 있습니다. https://www.microsoft.com/en-US/download/details.aspx?id=13255

Excel 2010에도 적용됩니다.


답변

내 사건을 추가하십시오. 내 xls 파일은 웹 사이트의 데이터 내보내기 기능으로 만들어졌으며 파일 확장자는 xls이며 일반적으로 MS Excel 2003에서 열 수 있습니다. 그러나 Microsoft.Jet.OLEDB.4.0과 Microsoft.ACE.OLEDB.12.0은 ” 외부 테이블이 예상 한 형식이 아닙니다 “예외입니다.

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


답변

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

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

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

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

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

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

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

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

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


답변

나는 동일한 문제 (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


답변

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

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

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

오류가 사라졌습니다.