使用OLEDB +读取.xlsx文件某些单元格未加载数据的问题

时间:2012-06-02 05:13:07

标签: c# excel oledb

希望有人可以在这里帮助我......

我正在尝试将.xlsx文件加载到DataTable中,然后使用C#.Net来处理信息。

启动并运行基础知识,使用OLEDB连接,加载数据并将其输出到DataGridView以检查数据。

我遇到的问题是某些单元格(只有少数单元格)不加载excel文件中包含的数据。在我的示例单元格“C3”中,例如,这是一个通用格式化单元格,就像excel中此行上的所有其他单元格一样,不会加载其内容。

实际的Cell应该作为MEMBERSHIP加载,但是当它输出到gridview时它会显示一个空白,或者在调试DataRow / Col值时它是空白的,即使excel文件包含该单元格的数据。如果我将此单元格MEMBERSHIP的内容更改为123456之类的数字,则会将此值加载为ok,但如果我将该值更改回字符,则会再次返回空白。

除了2之外,大多数单元格(15个中的13个)加载到此行,并且它们具有相同的格式。

这是我在我的代码中使用的连接字符串,实际上是从这个网站获得的:):

try
{

string tabsheet = Path.GetFileNameWithoutExtension(FullFileName); 
string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FullFileName + ";" + "Extended Properties='Excel 12.0 Xml;HDR=NO'";

var adapter = new OleDbDataAdapter("SELECT * FROM [" + tabsheet + "$]",connectionString);

adapter.Fill(aDataTable); 
}
catch (Exception er)
{
logfile.AddToFile("GetDataTableFromCsv exception: " + er.Message);
}

坚持,帮助! :)

1 个答案:

答案 0 :(得分:5)

我的猜测是,在一个(s)上面的同一列中有几个单元格,其字符串值为'MEMBERSHIP',即数字。这会导致OLEDB推断这些列中的数据是数字的,因此将忽略非数字值。

解决方案是在conn字符串的扩展属性部分中包含IMEX = 1:

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FullFileName + ";" + "Extended Properties='Excel 12.0 Xml;HDR=NO;IMEX=1;'"; 

connectionstrings.com处的Excel条目说明了此属性设置,并且还有一个警告:

  

“IMEX = 1;”告诉司机总是读“混合”(数字,   日期,字符串等)数据列为文本。请注意,此选项可能   影响excel表写访问否定。