今天项目中碰到了需要从excel中读取数据导入到一个dataSet里的问题。仔细研究了下,将碰到的问题与解决方案整理出来,供参考。
完整的代码如下:
1 // 上传文件的物理路径 2 string strUpFilePath = string.Empty; 3 // 产生文件名 4 string strFileName = System.Guid.NewGuid().ToString() + ".xls"; 5 // 上传文件的物理路径 6 strUpFilePath = Server.MapPath("..\\FullUpExcel\\") + strFileName; 7 // 上传文件的真实路径 8 FileUp.PostedFile.SaveAs(strUpFilePath); 9 string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strUpFilePath + ";" + "Extended Properties='Excel 8.0;HDR=yes'"; 10 OleDbConnection olecon = new OleDbConnection(strConn); 11 olecon.Open(); 12 DataTable FromExcel = olecon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null,null, "Table" }); 13 string[] strTableNames = new string[FromExcel.Rows.Count]; 14 for (int i = 0; i < FromExcel.Rows.Count; i++) 15 { 16 strTableNames[i] = FromExcel.Rows[i]["TABLE_NAME"].ToString(); 17 } 18 OleDbDataAdapter oada = new OleDbDataAdapter("select * from [" + strTableNames[0] + "] where not [name] is null", olecon); 19 oada.Fill(ds); 20 oada.Dispose(); 21 olecon.Close();
在操作过程中,你可能会碰到各种问题。
1、以上代码的第18行,我原来的做法是:
OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Person$] where not [name] is null", olecon);
然后报错:
这个问题很有可能是因为,有的用户拿到excel表后,会将你原来设定的sheet表名person改为自己想要的类型了,而代码中已将表名写死,程序当然会报错,这就希望无论用户输入什么表名,我们都可以将其读出来,这就产生了我们以上代码的12-18行,为这种问题的解决方案。
2、关于第9行的理解。
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strUpFilePath + ";" + "Extended Properties='Excel 8.0;HDR=yes'";
这里的strUpFilePath为目标文件的绝对物理路径,类似于 E:\..\..\...xls 的形式。
这里的HDR可取的值有两种,YES/NO,分别代表的意思为表中第一行是否为标题行。这里的值设好后一定要注意与你的Excel表格的结构的一致性。
参考文章: