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

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

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

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

Могу ли я каким-то образом заставить OleDb reader независимо от того, какой формат даты установлен в XLS, преобразовывать все даты в формат ММ/ДД/ГГГГ?

Я использую этот фрагмент кода для чтения файла 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();
}

person pencilCake    schedule 20.08.2010    source источник


Ответы (2)


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

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

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

person Alex Essilfie    schedule 20.08.2010
comment
спасибо Алекс. Знаете ли вы какие-либо ресурсы, посвященные языку запросов, используемому JET OLEDB? - person pencilCake; 23.08.2010
comment
Насколько я знаю, JET OLEDB работает на SQL, и для этой цели я использую книгу по SQL для справки. (Вот откуда я получил запрос.) Эта книга называется «Основы SQL, 3-е издание». Джон Дж. Патрик. Это издано Prentice Hall. - person Alex Essilfie; 23.08.2010
comment
Поскольку JET является ядром Access, запросы для Excel должны использовать тот же синтаксис, что и Access. Так что справочные документы Access могут помочь. - person Ronald Zarīts; 12.11.2010

Прокрутите набор данных. Для каждой даты преобразуйте ее в дату (в случае, если ячейка была изменена на текст), а затем отформатируйте дату как строку формы «ММ/ДД/ГГГГ».

Следующий код является примером для начала:

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

person NakedBrunch    schedule 20.08.2010