C#操作excel

今天项目中碰到了需要从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表格的结构的一致性。

 参考文章:

http://hi.baidu.com/softyimao/item/11009ac8c703c16ef6c95dc4

http://blog.csdn.net/happy09li/article/details/7431967

原文地址:https://www.cnblogs.com/huang1990/p/3104055.html