OleDBConnection с IMEX 1 игнорирует AM / PM во временном значении - PullRequest
4 голосов
/ 26 октября 2019

Я читаю файл xls, используя этот код:

private static DataSet GetDataSetFromExcelFilePath(string filePath)
{
    try
    {

        //Microsoft.Jet.OLEDB.4.0
        using (OleDbConnection oleDbConnection = new
        OleDbConnection(string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}; Extended Properties=\"Excel 8.0;Persist Security Info=False;HDR=No;IMEX=1;\"", filePath)))
        //OleDbConnection(string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; Extended Properties=\"Excel 8.0;Persist Security Info=False;HDR=No;IMEX=1\"", filePath)))
        //  using (OleDbConnection oleDbConnection = new
        //     OleDbConnection(string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}; Extended Properties=\"Excel 8.0;Persist Security Info=False;HDR=No;IMEX=1\"", filePath)))
        {
            oleDbConnection.Open();

            DataTable schema = oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
            string sheetName = schema.Rows[0].Field<string>("TABLE_NAME");

            var adapter = new OleDbDataAdapter(string.Format("SELECT * FROM [{0}]", sheetName), oleDbConnection);
            var dataSet = new DataSet();
            adapter.Fill(dataSet, Path.GetFileName(filePath));

            return dataSet;
        }
    }
    catch (Exception ex)
    {       

        return null;
    }
}

Обратите внимание, что в строке подключения установлен IMEX 1, поэтому он считывает все данные в виде строки, но у меня возникла странная проблема на компьютере моего клиента, гдеAM / PM или полный HH полностью игнорируются на время. Вот как набор данных заполняется приведенным выше кодом: https://gyazo.com/f45c29c42b5d1339ae1fe159be4caf76, где нет различий между AM и PM.

и вот как фактические данные находятся в Excel: https://gyazo.com/caf91c165eb08e3110fd2c3b7d4b8c51

Обратите внимание, что изменить формат или структуру Excel невозможно. Предпочтительно любые возможные изменения должны быть сделаны в коде.

Для справок, если кто-то хочет скачать файл Excel для тестирования здесь, это: https://www.dropbox.com/s/7824xh3ihlym9v9/test.xls?dl=0

Еще одна вещь, которую может решить проблемабудет реплицироваться при установке языка окна в Норвегии, как показано здесь: https://gyazo.com/d03b3056ed81e177076471a74058fdb7

1 Ответ

3 голосов
/ 29 октября 2019

Проблема с ODBC в том, что он общеизвестно глючит. Трудно дать правильный совет, если у вас нет точных настроек / версии офиса / реестра и т. Д.

Использованная вами настройка IMEX=1 устанавливает только «режим», который является режимом импорта. Тогда у вас есть параметр реестра ImportMixedTypes, где вы можете указать два значения: Text или Majority Type. По умолчанию установлено значение Text, и по этой причине вы получаете все как текст. Для более подробной информации вы можете прочитать мой ответ здесь .

Ваша проблема времени сложнее, чем просто преобразовать его в текст, как вы пытаетесь. Само Excel имеет внутреннее представление времени, которое вы затем переводите в текст. Вот почему вы пропускаете часть PM / AM. Самый простой выход - использовать 24-часовой формат, который вы, вероятно, знаете и не хотите.

Есть ли выход? Да. Вам необходимо указать столбец непосредственно при подключении к файлу Excel:

...
var timeColumn = 
  new OleDbDataAdapter("SELECT FORMAT([Time], 'hh:mm tt') as [Time] FROM [sheetName]", oleDbConnection);
...

Чтобы просмотреть дополнительные параметры для FORMAT, см. MSDN .

...