OLEDB连接没有读取字符串值C#

时间:2015-10-31 16:25:21

标签: c# excel

我的要求是从本地文件夹中读取excel文件并导入DataTable。如果第一行包含字符串值,则导入工作正常。如果前三行中的值为int,则列的数据类型将变为Integer,并且忽略字符串值。我想读一些价值观。我试图插入一行字符串值,但由于int数据类型不允许。 Plz帮助..我遇到了大麻烦。 我在连接字符串中尝试使用IMEX = 1,但没有去

string Extension = ".xlsx";
string conStr = "";
switch (Extension)
{
    case ".xls": //Excel 97-03
    conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString;
    break;
    case ".xlsx": //Excel 07
    conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"].ConnectionString;
    break;
}
conStr = String.Format(conStr, strPath);
oledbConn = new OleDbConnection(conStr);
if (oledbConn.State != ConnectionState.Open)
    oledbConn.Open();
OleDbCommand cmd = new OleDbCommand(); ;
OleDbDataAdapter oleda = new OleDbDataAdapter();
DataTable dt = new DataTable();
dt.Columns.Add("Store", typeof(string)).DefaultValue = strPath.Substring(18, 3);
var sheets = oledbConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
cmd.Connection = oledbConn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = " SELECT * FROM [" + sheets.Rows[0]["TABLE_NAME"].ToString() + "] ";
oleda = new OleDbDataAdapter(cmd);
//oleda.FillSchema(dt, SchemaType.Source);
dt.TableName = strPath.Substring(18, 3);

oleda.Fill(dt);

1 个答案:

答案 0 :(得分:2)

不幸的是,使用Jet或ACE引擎从Excel(和其他文件类型)导入时使用的注册表设置。引擎将扫描前N行数据(由名为 TypeGuessRows 的注册表值控制,默认为8),并使用它来确定它认为每列的数据类型是什么。如果在电子表格的第一行 TypeGuessRows 行中检测到多种类型,则会使用 ImportMixedTypes 设置(其唯一有效值为文本 MajorityType Text 就是你想要的。)

这里最简单的选项可能是增加 TypeGuessRows 设置。但是,如果您需要使用的电子表格包含数万行,那么您将遇到问题,因为我相信它不会采样超过16,384行。如果它不认为某个特定列是混合类型,那么就不会应用 ImportMixedTypes 设置(所以如果你有2万行,那么第一个17000都是int,即使最后3000个不是整数,该列仍保持int,并且你的位置会得到空值)。在Excel中格式化列将不起作用,也不会指定目标数据类型。

您可能需要在多个位置更改设置,具体取决于您的连接字符串以及安装的Excel版本或Access连接引擎。例如,在Windows 7 64位上,注册表中Jet设置的位置是HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Jet \ 4.0 \ Engines \ Excel。

使用ACE引擎有类似的位置,具体取决于Excel的版本。 更多信息here,包括旧博文和最近的评论。

基本上,使用Jet / ACE从文件导入可能是一种痛苦的经历,有些时候您可能甚至没有注意到这是一个问题。