将 Excel 导入 DataTable 字符串为空
Posted
技术标签:
【中文标题】将 Excel 导入 DataTable 字符串为空【英文标题】:Import Excel to DataTable string's are empty 【发布时间】:2013-03-06 08:34:31 【问题描述】:要将excel导入数据表,我使用的是简单的代码:
string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0; data source=0; Extended Properties=Excel 12.0;", physicalFolder + FileUpload1.FileName);
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", connectionString);
DataSet ds = new DataSet();
在excel的某一行中,如果我的行如下所示
省略了字符串,我的数据集如下所示
但是,如果我添加一些字符串并且我的上传看起来像这样:
然后我的数据集看起来没有省略字符串:
【问题讨论】:
我也遇到了同样的问题。然后我手动将excel中该特定列的数据类型从一般更改为文本。它奏效了 【参考方案1】:尝试将您的 oledbconnection 字符串更改为以下格式:
代码片段 OleDbConnection con = 新 OleDbConnection( @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\book1.xls;Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'");
注意:“IMEX=1;”告诉驱动程序始终将“混合”(数字、日期、字符串等)数据列作为文本读取。请注意,此选项可能会影响 Excel 工作表写入访问权限。
【讨论】:
在我的情况下它不起作用。情况是在一列中的第一个单元格值为日期,其他为字符串,在另一列中,第一个单元格值为字符串,其余为数字。其余值仍为空白。【参考方案2】:MD.Unicorn 的答案并非 100% 正确。您的 OLEDB 提供程序使用名为 TypeGuessRows
的设置来确定读取多少行来决定列的数据类型。不幸的是,无法在连接字符串中指定此设置,必须在系统注册表中进行更改。有关详细信息,请参阅this 问题。
【讨论】:
【参考方案3】:这是因为提供者从列的第一行(标题行之后的行)决定列的类型。当第一行包含数字时,列的类型为double
或其他数字类型,因此不能包含字符串值。
我尝试了所有可能的方法(预先设置表格结构,使用DataReader
,更改单元格的格式,...)但都失败了。这似乎是Microsoft.Jet.OLEDB
提供者的问题。我强烈建议您使用第三方的 Excel 阅读库。有大量可用的开源库。
如果您的文件是 Excel 2007 (.xlsx) 文件,我强烈建议使用 EPPluse。它也可以作为NuGet package 使用。
否则,您可以查看this answer 以查找更多库。
【讨论】:
【参考方案4】:在连接字符串中使用 IMEX=1。希望它能解决这个问题..
【讨论】:
以上是关于将 Excel 导入 DataTable 字符串为空的主要内容,如果未能解决你的问题,请参考以下文章
Excel操作--使用NPOI导入导出Excel为DataTable
使用 Asp.net 将 Excel 导入 DataTable
DataTable 整行为空时,去除空行,常用于Excel导入,转换为DataTable时出现
解决从Excel导入数据库,导入到DataTable时数据类型发生变化的问题(如数字类型变成科学计数法,百分数变成小数)