要将excel导入datatable,我使用的是简单代码:
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的一行中时,如果我的行如下所示
字符串被省略,我的数据集看起来像这样
但是,如果我添加一些字符串,并且我的上传内容如下:
然后我的数据集看起来好像没有省略字符串:
答案 0 :(得分:2)
MD.Unicorn的回答并非100%正确。您的OLEDB提供程序使用名为TypeGuessRows
的设置来确定要读取的行数以确定列的数据类型。遗憾的是,此设置无法在连接字符串中指定,必须在系统注册表中进行更改。有关详细信息,请参阅this问题。
答案 1 :(得分:2)
尝试按以下格式更改oledbconnection字符串:
代码段 OleDbConnection con = new OleDbConnection( @" Provider = Microsoft.Jet.OLEDB.4.0;数据源= C:\ book1.xls;扩展属性=' Excel 8.0; HDR =是; IMEX = 1'") ;
注意:" IMEX = 1;"告诉司机总是读"混合" (数字,日期,字符串等)数据列为文本。请注意,此选项可能会影响Excel工作表写入访问权限。
答案 2 :(得分:1)
这是因为提供程序从列的第一行(标题行之后的行)决定列的类型。当第一行包含数字时,列的类型为double
或其他数字类型,因此它不能包含字符串值。
我尝试了一切可能的方法(预先设置表结构,使用DataReader
,更改单元格的格式,...)并且它们都失败了。这似乎是Microsoft.Jet.OLEDB
提供商的问题。我强烈建议您使用第三方Excel阅读库。有很多开源库可供使用。
如果您的文件是Excel 2007(.xlsx)文件,我强烈建议您使用EPPluse。它也可以NuGet package。
的形式提供否则,您可以查看this answer以查找更多库。
答案 3 :(得分:1)
在连接字符串中使用IMEX = 1。希望它能解决这个问题。