2012-03-17 48 views
0

我有一个奇怪的问题,
当我尝试打开并加载Excel数据到DataTable,
在Excel工作表中加载一些数据,但有些数据不加载,
是什么问题,
你能帮助我吗?
我加了GetExcelData函数,
请看这段代码,
请告诉我是什么问题。的Excel在C#中的DataTable错误

GROUP  CLASS  TYPE  C1  C2  C3  C4  C4  C5 
M1   10   A   D  B  D  A  A  D 
M1   10   B   C  D  E  E  D  D 
M2   11   A   D  D  D  D  D  E 
M2   11   B   C  D  E  D  E  A 

上面我放置了样本表。
它只复制GROUP,CLASS和TYPE列中的数据。
但奇怪的是,在一些Excel文件中,这个错误不会发生,
,我没有找到答案,决定在这里问它。

public DataTable GetExcelData(string fileName, string sheetName) 
    { 
     string sql = ""; 
     OleDbConnection conn = new OleDbConnection(); 
     OleDbCommand command; 
     OleDbDataAdapter adapter = new OleDbDataAdapter(); 
     DataTable dt = new DataTable(); 
     command = conn.CreateCommand(); 
     string excel_file = fileName; 
     string excel_type = System.IO.Path.GetExtension(excel_file); 
     string connstr = ""; 

     if(excel_type=="XLSX") 
      connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=Excel 8.0"; 
     else 
      connstr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +fileName + ";Extended Properties='Excel 12.0;IMEX=1; HDR=YES'"; 

     conn.ConnectionString = connstr; 
     sql = "SELECT * FROM [" + sheetName + "$]"; 

     command.CommandText = sql; 
     adapter.SelectCommand = command; 
     adapter.Fill(dt); 

     return dt; 
    } 
+2

请添加更多的信息在什么数据加载,什么没有,我们还需要知道的Excel工作表中的内容,至少在数据类型 – ntziolis 2012-03-17 13:08:48

+3

不会吧需要交换两个连接字符串?你正在使用Excel 8.0的.xlsx文件,我相信这应该是其他方法。 – xxbbcc 2012-03-17 13:10:36

+0

@xxbbcc:起初我以为同样的事情,但代码将工作,因为对'GetExtension()'的调用将返回“.xlsx”而不是“XLSX”,这意味着将无意中选择正确的连接字符串。所以它的工作原理是错误的。 – 2012-05-08 00:10:05

回答

0

,因为你的第一个连接字符串

connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=Excel 8.0"; 

是不是有IMEX = 1将不能够导入混合类型的列,有时只发生,因为如果clause.Same与HDR您的在1例HDR缺失的情况下。在if条件应该是你的连接字符串,

connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=Excel 8.0;HDR=Yes;IMEX=1";