C# 操作Excel基础篇,读取Excel、写入Excel

注意事项: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 的使用关系。