1

我有一些使用 OLEDB ( Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;) 的 Excel 文件读取代码,它运行良好,但我一直遇到一个问题,即某些日期返回为 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 回答