我需要一个Excel猜测数据类型问题的解决方法

时间:2010-08-29 14:34:03

标签: c# ado.net jet import-from-excel

我正在创建一个实用程序,用于将数据从Excel导入Oracle数据库,

我有一个固定的excel文件模板,

现在,当我尝试通过Jet提供程序和ADO.Net - Ole连接工具导入数据时,我发现了以下问题:由于其中存在混合数据类型,因此尚未导入某些列列[字符串和数字],

我在网上找了这个问题,我发现原因是guessing data types from 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 STOP GUESSING并将数据作为文本提供?

如果没有,你能帮我解决一下吗?

提前致谢

4 个答案:

答案 0 :(得分:7)

我通过为连接字符串添加IMEX = 1找到了解决方案,但是它有一种特殊的格式,在下面的link中进行了描述。

  

IMEX参数适用于使用混合数字和Alpha值的列。   Excel驱动程序通常会扫描前几行   为了确定每列使用什么数据类型。如果确定列是数字   根据前几行的扫描,此列中包含字母字符的任何行都将   作为Null返回。 IMEX参数(1是输入模式)强制列的数据类型   文本,以便正确处理字母数字值。

此致

答案 1 :(得分:2)

这不完全正确!显然,如果前8行为空,则Jet / ACE ALWAYS采用字符串类型,无论IMEX = 1,并且如果前8行是数字,则始终使用数字类型(同样,无论IMEX = 1)。即使我在注册表中将行读取为0,我仍然遇到同样的问题。这是让它发挥作用的唯一可靠方法:

try
{
    Console.Write(wsReader.GetDouble(j).ToString());
}
catch   //Lame unfixable bug
{
    Console.Write(wsReader.GetString(j));
}

try { Console.Write(wsReader.GetDouble(j).ToString()); } catch //Lame unfixable bug { Console.Write(wsReader.GetString(j)); }

答案 2 :(得分:1)

你能从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

答案 3 :(得分:0)

另一种解决方案是在注册表中添加或更改设置 TypeGuessRows 。通过将其值设置为0,将扫描整个文档。

不幸的是,取决于您所安装的库和版本,这些设置可能会在注册表中的各个位置出现。

例如: [HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Jet \ 4.0 \ Engines \ Excel] “ TypeGuessRows” = dword:00000000

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

这还将防止截断超过255个字符的文本数据。如果您的TypeGuessRows的数字大于0,并且长度超过255个字符的第一个文本超出该数字,则会发生这种情况。

另请参阅Setting TypeGuessRows for excel ACE Driver