2009-11-25 8 views
0

XLS 파일에서 데이터를 가져올 수 있도록 허용하고 싶습니다. 이미 CSV 개의 파일과 XML 개의 파일을 가지고 있지만 사용자의 범위를 열고 싶습니다. 파일을로드하는 데 문제가 있습니다. 파일 (XLS, CSV, XML)을 데이터 세트에로드하고 거기에서 작업합니다. XLS의 로딩 코드는 Microsoft Jet 엔진을 사용하여 XLS 파일 읽기

FileInfo fi = new FileInfo(filename); 

//create and open a connection with the supplied string 
OleDbConnection objOleDBConn; 
objOleDBConn = new OleDbConnection(string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'", fi.FullName)); 
objOleDBConn.Open(); 

DataTable dt = objOleDBConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

if (dt == null || dt.Rows.Count == 0) 
{ 
    return; 
} 

string sheet = dt.Rows[0]["TABLE_NAME"].ToString(); 

//then read the data as usual. 
OleDbDataAdapter objOleDBDa; 
objOleDBDa = new OleDbDataAdapter(string.Format("select * from [{0}]",sheet), objOleDBConn); 
objOleDBDa.Fill(data); 
objOleDBConn.Close(); 

그래서 내 데이터를 확인로드되는

이하이지만, 다양한 컬럼의 데이터 유형을 설정하기 위해 나타나고,이 내 열 중 하나에 대한 문제입니다. 비트 필드이고 False, True, Yes, No, YN을 허용하도록 선택했습니다. 나중에 이것을 부울로 전송하는 코드가 있습니다. 이 파일은 CSV 파일 (연결 문자열이 다르지만)에서 작동하지만 XLS에서 처음 10 개의 행이 FALSE 또는 TRUE이라고 말한 다음 11 번째가 YES이라고 말하면 null 항목 만 표시됩니다. 나는 그것이 처음 몇 개의 엔트리를 읽고 그걸 기반으로 데이터 타입을 결정한다고 추측하고있다.

질문 : 처음 몇 개의 항목을 기반으로 열의 데이터 형식을 식별하는 메커니즘을 해제 할 수 있습니까?

+0

당신은 = 1 연결 문자열의 확장 속성에 MAXSCANROWS를 추가 시도해 볼 수도 있습니다에 대한 코드의 끝에이를 추가 한 다음 시트의 첫 번째 행의 텍스트 필드가 아니면. 나는 결코 이것을 시험해 보지 않았다. 그러나 그것은 일할지도 모른다?? – Tester101

답변

0

이 질문은 Excel cell-values are truncated by OLEDB-providerExcel reading in ASP.NET : Data not being read if column has different data formats과 매우 유사합니다. 몇 가지 유용한 해결책이 다른 질문에서 논의 된 것처럼 보입니다.

+0

고마워요.하지만 완벽한 솔루션을 제공하지 않았거나 찾고있는 것이 아닙니다. 사용자 보안 정책에 따라 레지스트리를 변경하면 레지스트리가 변경 될 수 있습니다. – wdhough

0

열에 대한 데이터 형식을 유추하기 위해 읽을 행 수를 Jet 공급자에게 알려주는 레지스트리 설정이 있습니다. 내가 믿는 것은 기본적으로 8이다. 그것은 :

HKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows 

(해당되는 경우 변경 버전)입니다. 귀하의 경우, 그것은 부울을 추론하고 그러므로 문자열 값 "예"를 무시합니다.

+0

감사하지만 사용자의 보안 정책이 잠겨 있기 때문에 레지스트리에 액세스하지 못하면 어떻게됩니까? 필자는 Microsoft가 기능을 작성하지 않을 것이며 기능을 해제하기 위해 모든 기능을 테스트하도록 설정해야만 기능을 사용하고 싶지 않다는 것을 알 수 있습니다. 감사합니다. Will – wdhough

+0

시트를 8 행의 많은 시트로 나누는 것보다는 그리 많지는 않습니다. –

0

시험해보십시오. OleDBAdapter Excel QA 스택 오버플로를 통해 게시했습니다.

디버그 모드에서

실행, 다음을 클릭합니다 ... 승/모든 TRUE 또는 FALSE 후 "예"또는 무작위로 "NO"가치와 그것이 잘 작동하지 몇 가지에 던져 내가 워크 시트 열을 채워

DataSet Visualizer가 결과를보기 위해 채워진 후 는 출력

// DataSet:   
Object row11Col3 = ds.Tables["xlsImport"].Rows[11][3]; 
string rowElevenColumn3 = row11Col3.ToString();