1

OLEDB ( ) を使用する Excel ファイル読み取りコードはProvider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;正常に動作しますが、特定の日付が DBNull として返されるという問題が引き続き発生します。

元の XLS ドキュメントでは、機能する日付の形式 (en-GB ロケール) は次のとおりです。

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

そして、次のスタイルは失敗します:

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

次の例では日付が正しく表示されているため、Excel は両方の日付を認識しています (ただし、強制的にスタイルを正しく設定することはできません)。

=DATE(YEAR(c),MONTH(c),DAY(c))  // where c = cell reference.

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


参考までに編集してください。ここに私のデータ読み取りメソッドがあります(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;
    }
4

1 に答える 1

2

これが役立つかどうかはわかりませんが、Excel OLEDBコードがデータを期待していた場所でNULLを返すという問題が発生し、ほとんどの場合、データ型の推論の問題が発生しました。Excelは、データの最初のx行に基づいて列のデータ型を決定します(x = 10、間違っている可能性があります)。ファイルを変更したくないことはわかっていますが、問題のある日付スタイルを最初の10行に入れて、アプリケーションの動作が変わるかどうかを確認する価値があるかもしれません。

明らかにそれがそれを修正するならば、それはあなたの問題を解決しません。その場合の唯一の修正は、ファイルを変更することです(最初の10行に何かを入れて、正しいデータ型を使用するように強制します)。申し訳ありませんが、これ以上の解決策を提供することはできませんが、少なくとも、問題の原因を特定するのに役立つことを願っています。

于 2009-04-03T14:59:23.987 に答える