2009-04-03 3 views
1

제대로 작동하는 OLEDB (Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;)를 사용하는 Excel 파일 읽기 코드가 있는데 특정 날짜가 DBNull로 반환되는 문제가 발생합니다.Excel 날짜 시간이 DBNull로 반환됩니다.

"02/04/2009 17:00:00" // returned as a System.DateTime 

다음과 같은 스타일이 실패 : 원래 XLS 문서에서

, (EN-GB 로케일) 작업 날짜 형식은

"08/Jan/09 11:24 AM" // returned as DBNull 

엑셀들이 모두있어 알고 다음 날짜가 올바르게 표시되어 날짜를 올바르게 표시 할 수는 있지만 (정확하게 스타일을 적용 할 수는 없지만) 날짜는 올바르게 표시됩니다.

방법이 있습니까? 자동 생성 된 원본을 변경하지 않고 데이터를 가져 옵니까?


참조 편집, 여기 내 데이터 읽기 방법 (A dbAdapter가 이미 설정되어 가정하면 - 모두 해고되지 캐치에서 오지 않는 DBNull이주의)이다

public List<List<string>> GetData(string tableName, int maxColumns) 
    { 
     List<List<string>> rows = new List<List<string>>(); 

     DataSet ExcelDataSet = new DataSet(); 
     dbCommand.CommandText = @"SELECT * FROM [" + tableName + "]"; 
     dbAdapter.Fill(ExcelDataSet); 

     DataTable table = ExcelDataSet.Tables[0]; 

     foreach (DataRow row in table.Rows) 
     { 
      List<string> data = new List<string>(); 

      for (int column = 0; column < maxColumns; column++) 
      { 
       try 
       { 
        data.Add(row[column].ToString()); 
       } 
       catch (Exception) 
       { 
        data.Add(null); 
       } 
      } 

      // Stop processing at first blank row 
      if (string.IsNullOrEmpty(data[0])) break; 
      rows.Add(data); 
     } 

     return rows; 
    } 
+0

XLS 문서에서 정확히 얼마나 날짜를 얻고 있습니까? 당신이하고있는 것을 볼 수 있도록 코드 스 니펫을 게시 할 수 있습니까? –

답변

2

이것이 도움이 될지 모르겠지만 데이터를 예상 한 곳의 NULL을 반환하는 Excel OLEDB 코드 문제가 발생했으며 거의 ​​항상 데이터 형식 추론 문제가 발생했습니다. Excel은 데이터의 첫 번째 x 행을 기반으로하는 열의 데이터 유형을 결정합니다 (x = 10이라고 잘못 생각할 수 있음). 파일을 변경하고 싶지는 않지만 파일의 처음 10 개 행에 문제 날짜 스타일을 넣고 응용 프로그램의 동작이 변경되는지 확인하는 것이 좋습니다.

분명히 해결하면 문제가 해결되지 않습니다. 이 경우 유일한 수정 사항은 파일을 변경하는 것입니다 (올바른 데이터 유형을 사용하도록하는 처음 10 개의 행에 무언가를 넣으십시오). 죄송합니다 더 나은 솔루션을 제공 할 수는 없지만 적어도 문제의 원인을 파악하는 데 도움이되기를 바랍니다.

+0

사실 그것은 차이를 만듭니다. 1 월 23 일 이전의 데이터에서 한 형식을 사용했고 데이터를 나중에 사용했기 때문입니다. 데이터의 순서를 변경하면 데이터가 전환 된 지점에서 오류가 발생했습니다 (다른 방향의 스위치 사용). 대신 CSV를 사용해야 할 수도 있습니다 ... –

+0

원본 파일을 변경하는 옵션이있는 경우 열 (상단 근처)에 분명한 문자열 값을 넣으면 열을 문자열로 구문 분석해야합니다. 그런 다음 코드에서 DateTime으로 직접 변환하십시오. 최선의 선택은 아니지만 작동합니다 ... –

+0

아니요, 옵션이 아닙니다. 저는 비 기술적 인 사람들이 사용할보고 시스템을 만들려고 노력하고 있습니다. Csv (변환을 위해 Excel 자동화)로 구문 분석 한 다음 텍스트를 직접 구문 분석 할 수 있습니다. –

관련 문제