Есть ли способ заставить Microsoft.Jet.OLEDB получить столбцы даты в формате MM / DD / YYYY из Excel? - PullRequest
5 голосов
/ 20 августа 2010

У меня проблема с чтением DateColumns из листа Excel.

Иногда люди используют разные форматы даты, и это вызывает проблемы.Скажем, когда я ожидаю 07/26/2010 от столбца Excel, я получаю 26-Jul-2010, потому что пользователь изменил свой формат даты.

Я использую Microsoft.Jet.OLEDB для чтения листа xls в DataTable.

Могу ли я каким-то образом заставить программу чтения OleDb независимо от того, какой DateFormat установлен в XLS, преобразовать все даты в формат 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();
}

Ответы [ 2 ]

4 голосов
/ 20 августа 2010

Вам не нужно перебирать набор данных, как это было предложено.Вы можете сделать так, чтобы ваш запрос выполнял все форматирование за вас, указав в запросе нужный вам формат.
Пример:

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

Это гарантированно будет работать, пока выиспользуя JET OLEDB или провайдер данных Ace OLEDB.Я не могу гарантировать, что он будет работать с другими поставщиками данных, но вы всегда можете проверить.

1 голос
/ 20 августа 2010

Цикл по набору данных.Для каждой даты преобразуйте ее в дату (в случае, если ячейка была изменена, чтобы быть текстовой), а затем отформатируйте дату в виде строки формы "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 на тот случай, если некоторые из введенных дат сами по себе не будут действительными.

...