c# - OLEDB连接不读取字符串值C#

标签 c# excel

我的要求是从本地文件夹中读取一个 excel 文件并导入到 DataTable 中。如果第一行包含字符串值,则导入工作正常,如果前 3 行中的值为 int,则列的数据类型变为 Integer 并且它忽略字符串值。我想读取值。我试图插入一行字符串值,但由于 int 数据类型它不允许。请帮助..我遇到了大麻烦。
我尝试在连接字符串中使用 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);

最佳答案

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

这里最简单的选择可能是增加 类型GuessRows 环境。但是,如果您需要使用的电子表格包含数万行,那么您将遇到问题,因为我相信无论如何它不会对超过 16,384 行进行采样。如果它不认为特定列是混合类型,那么它不会处理应用 ImportMixedTypes 设置(因此,如果您有 20,000 行,并且前 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 从文件导入可能是一种痛苦的体验,有时您甚至可能没有注意到存在问题。

关于c# - OLEDB连接不读取字符串值C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33453830/

相关文章:

c# - Kinect深度图像仅部分可见

c# - 如何使用 Regex 仅获取字符串中字符开头和结尾的数字?

c# - 排除 ef 核心迁移文件的代码覆盖率

VBA Excel : Argument not optional

excel - 获取列中的唯一值,但从原始列过滤的值除外 - 仅限 Excel 公式

excel - 过滤精确匹配并从范围中提取标准

c# - MVC4 Web API返回带有特殊字符的json propertykey字符串

c# - csv特殊字符的问题

Java 流将 excel CSV 收集到基于列的总和过滤的列表中

excel - VBA 中匹配函数所需的错误对象