2013-12-19 4 views
2

ACE.OLEDB를 사용하여 C# 응용 프로그램에서 Excel 파일을 읽고 있습니다. 오늘까지 열 이름 중 하나가 잘못 읽혀질 때까지 모든 것이 정상적으로 작동했습니다. 여기 ACE.OLEDB 공급자가 일부 열 이름을 잘못 읽음

내가 여기

Here's what I've got in my excel file

내가 내 디버거

And here's what is read in the code

기본적으로

점에있어 무슨 파일 내 엑셀에있어 무엇 (".")입니다 어떤 이유로 해시 ("#")로 바뀌 었습니다.

코드는 간단하고 대부분 문제없이 작동하지만 문제가 있다고 생각하지는 않지만 명확성을 위해 여기에 표시됩니다.

DataTable data = new DataTable();  
string strAccessConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path.FullName + ";Extended Properties=\"Excel 12.0\";\"HDR=YES\";\"IMEX=1;\"";  
OleDbConnection myAccessConn = new OleDbConnection(strAccessConn); 
string strAccessSelect = "select * from [" + SheetName + "];"; 
OleDbCommand myAccessCommand = new OleDbCommand(strAccessSelect, myAccessConn); 
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myAccessCommand);       
myDataAdapter.Fill(0, maxRows, data); 

내가 잘못하고있는 것이 있거나 OLEDB의 버그입니까?

+0

이것은 버그가 아니며 기능입니다. String.Replace로 바꾸세요. – Taosique

+0

심각하게? 당신은 정교 할 수 있습니까? 나는 거대한 파일을 Excel에서 읽으며, 나는 유효한 것을 많이 가질 수있다. ' 그곳에있는 상징들, 나는 그들 모두를 '#'으로 맹목적으로 대체 할 수는 없습니다. – taralex

답변

1

이 문제는 헤더 행에서만 발생하며 점 (.)이 Excel 파일 헤더에 표시되지 않기 때문에 발생합니다. Excel 파일의 헤더에있는 점 (XML로 변환 할 때)으로 인해 일부 문제가 발생할 수 있습니다. XML에서 .에 대한 의미가 없다는 사실에도 불구하고 Excel에서 앞뒤로 직렬화하는 방식에는 추가 규칙이 있어야합니다 (이 경우 100 %가 아님). 따라서 데이터를 입력하는 동안 #을 입력하면 .의 헤더가 Excel로 변환되고 .으로 헤더를 출력하면 #으로 표시됩니다.

이 문제를 해결하려면 연결 문자열 헤더 구문을 HDR=No으로 변경하여 헤더를 전환하면됩니다. 데이터가 이 아니라이 아니라 정상적인 행인 경우 플로트 번호로 쉽게 처리 할 수 ​​있으며 .은 문제가되지 않습니다.

0

여기 Excel에서 헤더 행에서 가져온 특수 문자에 대한 열 이름 변환에 대한 참조를 찾고 있습니다. 이 같은 SQL을 사용하여 : 여기

select * from 
OPENROWSET(
'Microsoft.ACE.OLEDB.12.0','Excel 12.0; 
Database=<INSERT-FILENAME>; 
Extended Properties=Excel 12.0;IMEX=1;' 
,'select * From [Sheet1$]') 

는 내가 본 변환은 다음과 같습니다

Excel | SQL 
----------------------- 
[  | (
]  |) 
.  | # 
!  | _ 
`  | _ 

이 포괄적 인 목록이 아니라, 누군가를 도움이 될 수 있습니다. 나는 그것이 자유롭게 편집 될 수 있도록 커뮤니티 위키로서 답을 남겼습니다.

관련 문제