아래 표시된 코드를 사용하여 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 엔진이 설치되었습니다.
나는 이것이 다음과 같은 문제임을 확인했다.
- 파일 사본 만들기 (여전히 문제가 있었으므로 다른 이름으로 저장 차이는 없었습니다)
- 간접 수식을 사용하여 시트의 모든 셀 선택
- 값으로 만 붙여 넣기
오류가 사라졌습니다.