【问题标题】:Is there a way to force Microsoft.Jet.OLEDB to get date Columns in MM/DD/YYYY format from Excel?有没有办法强制 Microsoft.Jet.OLEDB 从 Excel 获取 MM/DD/YYYY 格式的日期列?
【发布时间】:2011-04-01 17:23:33
【问题描述】:

我在从 Excel 表中读取 DateColumns 时遇到问题。

有时人们使用不同的日期格式,这会带来一个问题。假设当我期望来自 Excel 列的07/26/2010 时,我得到26-Jul-2010,因为用户更改了其日期格式。

我使用 Microsoft.Jet.OLEDB 将 xls 表读入 DataTable

无论 XLS 上的 DateFormat 设置如何,我能否以某种方式强制 OleDb 阅读器将所有日期转换为 MM/DD/YYYY 格式?

我用这段代码读取Excel文件:

string strConn;
strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
          "Data Source=" + uploadedFileInfo.FullName + ";" +
          @"Extended Properties=""Excel 8.0;HDR=NO;""";


using (OleDbConnection connToExcel = new OleDbConnection(strConn))
{
    //You must use the $ after the object you reference in the spreadsheet
    connToExcel.Open();

    string firstSheetName = ExcelUploadedFileReaderBuilder
                            .GetFirstExcelSheetName(connToExcel);

    OleDbDataAdapter myCommand 
    = new OleDbDataAdapter(String.Format("SELECT * FROM [{0}]", firstSheetName), connToExcel);

    DataSet myDataSet = new DataSet();

    myCommand.Fill(myDataSet, "uploadedExcelTable");

    DataTable dtUploadedExcel = myDataSet.Tables["uploadedExcelTable"];

    lineCount = GetLineNumberWhereNULLRowOccured(dtUploadedExcel) + 1;

    connToExcel.Close();
}

【问题讨论】:

    标签: c# excel date oledb oledbdatareader


    【解决方案1】:

    遍历数据集。对于每个日期,将其转换为日期(如果单元格已被修改为文本),然后将日期格式化为格式为“MM/DD/YYYY”的字符串。

    以下代码是帮助您入门的示例:

    string date1 = "07/26/2010";
    string date2 = "26-Jul-2010";
    
    DateTime dt1 = Convert.ToDateTime(date1);
    DateTime dt2 = Convert.ToDateTime(date2);
    
    string date1B = dt1.ToString("MM/DD/YYYY");
    string date2B = dt2.ToString("MM/DD/YYYY");
    

    date1B 和 date2B 将是相等的,并且采用您想要的格式。

    正在进行一些来回转换,这是因为您需要验证用户输入,因为它来自 Excel,并且用户很容易输入不符合您要求的数据数据库模型。

    最好将所有内容放在 Try-Catch 块中,以防某些输入的日期本身不是有效日期。

    【讨论】:

      【解决方案2】:

      您不必按照建议遍历数据集。您可以通过在查询中指定您想要的格式,让您的查询为您完成所有格式设置。
      一个例子如下:

      OleDbDataAdapter myCommand = 
        new OleDbDataAdapter("SELECT FORMAT([DateCol], 'MM/dd/yyyy') as [DateCol] FROM [SheetName]", connToExcel);
      

      只要您使用 JET OLEDB 或 Ace OLEDB 数据提供程序,就保证可以正常工作。我不能保证它会与其他数据提供者一起使用,但您可以随时检查。

      【讨论】:

      • 感谢亚历克斯。您知道任何涵盖 JET OLEDB 使用的查询语言的资源吗?
      • AFAIK,JET OLEDB 在 SQL 上运行,为此,我使用了一本关于 SQL 的书作为参考。 (这就是我得到查询的地方。)这本书是 SQL Fundamentals 3ed。约翰·J·帕特里克 (John J. Patrick)。它由 Prentice Hall 出版。
      • 由于 JET 是 Access 背后的引擎,因此 Excel 的查询应该使用与 Access 相同的语法。因此,Access 参考文档可能会有所帮助。
      猜你喜欢
      • 2021-06-12
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 2016-11-06
      相关资源
      最近更新 更多