7

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

有时人们使用不同的日期格式,这会带来问题。假设当我期望07/26/2010从 Excel 列中获得时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();
}
4

2 回答 2

5

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

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

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

于 2010-08-20T16:15:30.090 回答
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 块中,以防某些输入的日期本身不是有效日期。

于 2010-08-20T15:29:55.537 回答