将Excel导入到DataTablestring是空的

为了将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中,如果我的行看起来像下面

在这里输入图像说明

stringommited和我的数据集看起来像这样

在这里输入图像说明

但是,如果我添加一些string,如果我的上传看起来像这样:

在这里输入图像说明

然后我的数据集看起来像不会省略string:

在这里输入图像说明

这是因为提供者决定列的第一行(标题行之后的行)的列的types。 当第一行包含一个数字时,列的types是double或另一个数字types,所以它不能包含string值。

我尝试了所有可能的方法(事先设置表结构,使用DataReader ,更改单元格的格式,…),但都失败了。 这似乎是与Microsoft.Jet.OLEDB提供者的问题。 我高度推荐你使用第三方excel阅读库。 有很多开源库可用。

如果您的文件是Excel 2007(.xlsx)文件,我强烈build议使用EPPluse 。 它也可以作为一个NuGet包 。

否则,你可以看看这个答案来find更多的库。

医生医生的答案不是100%正确的。 您的OLEDB提供程序使用名为TypeGuessRows的设置来确定要读取多less行来确定列的数据types。 不幸的是,这个设置不能在连接string中指定,并且必须在系统registry中进行更改。 看到这个问题的更多细节。

尝试按以下格式更改您的oledbconnectionstring:

代码片段OleDbConnection con = new OleDbConnection(@“Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:\ book1.xls; Extended Properties ='Excel 8.0; HDR = Yes; IMEX = 1'”);

注意:“IMEX = 1;” 告诉驱动程序总是读取“混合”(数字,date,string等)数据列作为文本。 请注意,这个选项可能会影响Excel表单写访问的负面影响。

在连接string中使用IMEX = 1。 希望能解决这个问题..