2009-04-03 1 views
1

私は、うまくいくOLEDB(Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;)を使用するExcelファイルのコードを読んでいますが、特定の日付がDBNullとして返されるという問題が発生しています。オリジナルXLS文書でExcel DateTimeがDBNullとして返されます

、(JA-GBロケール)作業日付の書式は以下のとおりです。

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

、次のスタイルが失敗します。

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

Excelは、彼らは両方だ知っています日付は正しく表示されます(ただし、正しくスタイルするよう強制することはできません)。

方法はありますか自動生成されたオリジナルを変更せずにデータを取得しますか?参照用


EDITが、ここに私のリードデータ方式である(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を返すエクセルOLEDBコードの問題に遭遇していると、それはほとんど常にバックデータ型推論の問題になりました。 Excelは最初のx行のデータに基づいて列のデータ型を決定します(x = 10だと間違っている可能性があります)。ファイルを変更したくないのは分かっていますが、問題の日付スタイルを最初の10行に入れて、アプリケーションの動作を変更するかどうかを確認することは価値があります。

明らかにそれを修正すれば、問題は解決しません。その場合の私が知っている唯一の修正は、ファイルを変更することです(最初の10行に何かを入れて、正しいデータ型を使用させる)。申し訳ありませんが、私はより良い解決策を提供することはできませんが、少なくともあなたの問題の原因を突き止めるのを助けることを願っています。

+0

実際には、1月23日以前のデータでは1つのフォーマットが使用され、その後のデータは別のフォーマットで使用されていたため、違いが生じました。データの順序を変更すると、データが切り替えられた時点でエラーが発生しました(ただし、他の方向のスイッチを使用した場合)。代わりにCSVを使用する必要があるかもしれません... –

+0

元のファイルを変更するオプションがある場合は、列の上に(上の近くに)明白な文字列値を入れて、列を文字列として解析することができます。次に、コード内でDateTimeに変換します。最高のオプションではありませんが、動作します... –

+0

いいえ、オプションはありません。私は非技術的な人々によって使用される報告システムを作成しようとしており、彼らはそれを間違って取得します。私はCsv(変換のためにExcelを自動化する)として解析し、あなたが言うように、テキストを直接解析することができます。 –

関連する問題