注意事项:Excel的数据表中最多只能储存65535行数据,超出后,需要将数据分割开来进行储存。同时对于Excel中的乱码象限,是由于编码的错误方式导致引起的!
一、读取Excel数据表,获得DataSet数据内存
我们先看一下网上比较流行的一段代码,然后进行分析说明。
1 //加载Excel 2 public static DataSet LoadDataFromExcel(string filePath) 3 { 4 try 5 { 6 string strConn; 7 strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'"; 8 OleDbConnection OleConn = new OleDbConnection(strConn); 9 OleConn.Open(); 10 String sql = "SELECT * FROM [Sheet1$]";//可是更改Sheet名称,比如sheet2,等等 11 12 OleDbDataAdapter OleDaExcel = new OleDbDataAdapter(sql, OleConn); 13 DataSet OleDsExcle = new DataSet(); 14 OleDaExcel.Fill(OleDsExcle, "Sheet1"); 15 OleConn.Close(); 16 return OleDsExcle; 17 } 18 catch (Exception err) 19 { 20 MessageBox.Show("数据绑定Excel失败!失败原因:" + err.Message, "提示信息", 21 MessageBoxButtons.OK, MessageBoxIcon.Information); 22 return null; 23 } 24 }
给我们的第一感觉是:C#程序自然就把Excel文件的数据表等同一张数据库来对待了!与ACCESS数据库极为相似。我们对此拆分分解。
1.1 连接字符串
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'";
这里特别说明的是:Provider “Microsoft.Jet.OLEDB.4.0”数据库连接驱动是针对office2003之前的数据列表的,自从07年后就对此进行了代码修正,扩充改成了,strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties='Excel 12.0;HDR=False;IMEX=1'";在此需要安装对应的数据连接驱动AccessDatabaseEngine;
连接字符串中,特别之处的是,Provider是数据连接驱动的接口对应形式,也可以理解成数据库软件的提供者;DataSource指的是:数据表的地址,也就是指的数据库特定的文件。http://blog.csdn.net/superhoy/article/details/8264133
Jet 引擎,可以访问Office97-2003,但不能访问 Office 2007。
ACE 引擎,是随Office2007一起发布的数据库连接组件,既可以访问 Office 2007,也可以访问Office97-2003。
另外:Microsoft.ACE.OLEDB.12.0 可以访问正在打开的 Excel 文件,而 Microsoft.Jet.OLEDB.4.0 是不可以的。
HDR 表示第一行是否是标题行。
- 若为 YES,则第一行是标题行(即列名称),不是数据;
- 若为 NO,则第一行不是标题行,跟后面的行一样,是数据。
IMEX 表示混合数据类型时如何处理。
- 若为 0,则为输出模式,此情况下只能用作写入 Excel;
- 若为 1,则为输入模式,此情况下只能用作读取 Excel,并且始终将 Excel 数据作为文本类型读取;
- 若为 2,则为连接模式,此情况下既可用作写入、也可用作读取。
Excel 第一行第一列可以存储字符串,第二行第一列又可以存储数字……同样的列,存储不同的数据类型,这就形成了混合数据类型。
所以若要读取混合数据类型,应该将 IMEX 设置为 1;若误设置为 0,则读取不到任何行;若误设置为 2 或省略,则有些数据读取出来是空白。
DataSet的简介
一个DataSet中包含多个DataTable,一个DataTable又包含有多个Row,这就是我们操作DataSet的基础啦!!!
二、写入Excel数据表,及时保存内容
我们先看一下网上比较流行的一段代码,然后进行分析说明。
1 public static bool SaveDataTableToExcel(System.Data.DataTable excelTable, string filePath) 2 { 3 Microsoft.Office.Interop.Excel.Application app = 4 new Microsoft.Office.Interop.Excel.ApplicationClass(); 5 try 6 { 7 app.Visible = false; 8 Workbook wBook = app.Workbooks.Add(true); 9 Worksheet wSheet = wBook.Worksheets[1] as Worksheet; 10 if (excelTable.Rows.Count > 0) 11 { 12 int row = 0; 13 row = excelTable.Rows.Count; 14 int col = excelTable.Columns.Count; 15 for (int i = 0; i < row; i++) 16 { 17 for (int j = 0; j < col; j++) 18 { 19 string str = excelTable.Rows[i][j].ToString(); 20 wSheet.Cells[i + 2, j + 1] = str; 21 } 22 } 23 } 24 25 int size = excelTable.Columns.Count; 26 for (int i = 0; i < size; i++) 27 { 28 wSheet.Cells[1, 1 + i] = excelTable.Columns[i].ColumnName; 29 } 30 //设置禁止弹出保存和覆盖的询问提示框 31 app.DisplayAlerts = false;//用来提示覆盖保存的修改!可以删除后尝试一下效果就可以了!!! 32 app.AlertBeforeOverwriting = false; 33 //保存工作簿 34 wBook.Save(); 35 //保存excel文件 36 app.Save(filePath); 37 app.SaveWorkspace(filePath); 38 app.Quit(); 39 app = null; 40 return true; 41 } 42 catch (Exception err) 43 { 44 MessageBox.Show("导出Excel出错!错误原因:" + err.Message, "提示信息", 45 MessageBoxButtons.OK, MessageBoxIcon.Information); 46 return false; 47 } 48 finally 49 { 50 } 51 }
首先我们通过这份代码,知道这是针对2003之前的Excel数据列表展开的。在03之前的时候,一个EXCEl程序只能打开一个文件,也就是工作薄。现在的话,好了可以同时打开很多工作薄。第8行代码和34行代码的关系,我们有这样一个疑问,添加一个工作薄,直接保存的话,需要我们为之指定一个储存地址的 啊!!! 需要改成wBook.saveAS()方法与之对应。或者相应的方法,必须指定地址。如果第8行代码改成open()而不是add()的话,那样的话也就可以了。
我们通过上述代码,可以明显分析得到,对于写入的话,就好比我们去操作相应的软件程序去操作文件。注意.Application app 的使用关系。