Мне нужен обходной путь для Excel угадывает типы данных - PullRequest
6 голосов
/ 29 августа 2010

Я создаю утилиту для импорта данных из Excel в базу данных Oracle,

У меня есть фиксированный шаблон для файла Excel,

Теперь, когда я пытаюсь импортировать данные провайдером Jet и средствами подключения ADO.Net - Ole, я обнаружил следующую проблему: некоторые столбцы не были импортированы, поскольку в их смешанных типах данных столбцы [строка и число],

Я искал эту проблему в интернете и нашел причину угадывания типов данных из Excel

Код загрузки:

connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0};Extended Properties=Excel 8.0;");
string columns = "P_ID, FULL_NAME_AR, job_no, GENDER, BIRTH_DATE, RELIGION, MARITAL_STATUS, NAT_ID, JOB_Name, FIRST_HIRE_DATE, HIRE_DATE, CONTRACT_TYPE, GRADE_CODE, QUALIFICATION";
string sheetName = "[Emps$]";
OleDbCommand command = new OleDbCommand(string.Format("select {0} from {1} where p_id is not null", columns, sheetName), connection);

connection.Open();
dr = command.ExecuteReader();
DataTable table = new DataTable();
table.Load(dr);

Что мне нужно сделать, чтобы программа Excel перестала гадать и выдать данные в виде текста?

если нет, можете ли вы помочь мне с обходными путями?

Заранее спасибо

Ответы [ 4 ]

7 голосов
/ 30 августа 2010

Я нашел решение, добавив IMEX = 1 для строки подключения, но есть специальный формат для нее, который описан в следующей ссылке .

Параметр IMEX предназначен для столбцов, которые используют смешанные числовые и буквенные значения. Драйвер Excel обычно сканирует первые несколько строк чтобы определить, какой тип данных использовать для каждого столбца. Если столбец определен как числовой на основе сканирования первых нескольких строк, то любые строки с альфа-символами в этом столбце будут возвращаться как Null. Параметр IMEX (1 - режим ввода) заставляет тип данных столбца текст, чтобы буквенно-цифровые значения обрабатывались правильно.

Привет

2 голосов
/ 16 июля 2012

Это не совсем правильно! Очевидно, что Jet / ACE ВСЕГДА принимает строковый тип, если первые 8 строк пусты, независимо от IMEX = 1, и всегда использует числовой тип, если первые 8 строк являются числами (опять же, независимо от IMEX = 1). Даже когда я сделал записи, считанные в реестре до 0, у меня все еще была та же проблема. Это был единственный верный способ заставить его работать:

try
{
    Console.Write(wsReader.GetDouble(j).ToString());
}
catch   //Lame unfixable bug
{
    Console.Write(wsReader.GetString(j));
}
1 голос
/ 29 августа 2010

Вы можете работать с Excel?Этот пример запуска в Excel помещает смешанные данные в таблицу SQL Server:

Dim cn As New ADODB.Connection

scn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
& sFullName _
& ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

cn.Open scn

s = "SELECT Col1, Col2, Col3 INTO [ODBC;Description=TEST;DRIVER=SQL Server;" _
& "SERVER=Some\Instance;Trusted_Connection=Yes;" _
& "DATABASE=test].TableZ  FROM [Sheet1$]"
cn.Execute s
0 голосов
/ 07 декабря 2018

Альтернативное решение - добавить или изменить параметр TypeGuessRows в реестре.Если установить значение 0, будет отсканирован весь документ.

К сожалению, настройки могут быть найдены в разных местах реестра, в зависимости от того, какие библиотеки и версии которых вы установили.

Например: [HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Jet \ 4.0 \ Engines \ Excel] "TypeGuessRows" = dword: 00000000

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Office \ Engine \ 14.0 \ Access\ Engines \ Excel] "TypeGuessRows" = dword: 00000000

Это также предотвратит усечение текстовых данных длиннее 255 символов.Это происходит, если у вас есть номер для TypeGuessRows больше 0, а первый текст, длина которого превышает 255 символов, выходит за пределы этого числа.

См. Также Настройка TypeGuessRows для Excel ACE Driver .

...