C#的Excel基本操作

由于项目的需要,从一开始接触C#就在操作Excel。从网上查看的资料上,个人知道3种操作Excel数据库的方法。

1、SQL操作数据库。通过SQL语言操作Excel数据库。之前一直用这个办法。但是问题就是Excel版本不同,OleDbConnection使用的连接字符命令是不同的。为了保证通用性,其实项目中一直都在使用office2003的.xls格式。SQL语句常用的多看看就知道怎么用了。(有空整理下自己设计的一些函数吧。)

2、Excel对象库的引用。移植性有问题,要是被移植的对象装的office版本不一样会有问题的。没有细看。

3、采用第三方提供的动态链接库。如NPOI,myexcel。这些动态链接库可移植性强,没有被移植对象的环境限制。虽然NPOI只适用于office2003版本的,但是这就足够了,Excel仅仅是我们使用的数据库罢了,移植程序的时候不出问题就好了,没有其他要求。目前在用NPOI实现项目需要的一些基本内容:读、写。设计了三个函数。

另外,可以去看看大神写的关于操作Excel的东东

http://www.yongfa365.com/item/DataGridViewToExcel.html

以下是我自己写的操作函数,功能比较单一。。

读函数,将指定位置、表名的数据存为二维数组返回。 

 1         /*
 2          * 本函数正常运行有一些必要的限制。必须从第一行开始连续有数据,而且每一行数据列数还是一样的。
 3          * 不过没问题,因为数据本来就是我们写的,按此格式写就好了。
 4          * **********************************************************************************
 5          * 如果要实现更通用的读,就需要更多的判断sheet.TopRow、sheet.LastRowNum、
 6          * sheet.PhysicalNumberOfRows联合判断对应row、cell是否null
 7          */
 8         public static void ReadExcel(string FilePath, string SheetName, out double[,] Matrix)
 9         {
10             using (FileStream file = File.OpenRead(FilePath))
11             {
12 
13                 NPOI.HSSF.UserModel.HSSFWorkbook wk = new NPOI.HSSF.UserModel.HSSFWorkbook(file);
14                 NPOI.SS.UserModel.ISheet sheet = wk.GetSheet(SheetName);
15                 if (sheet.PhysicalNumberOfRows != 0)
16                 {
17                     //由于sheet.PhysicalNumberOfRows的值会随时的变动,故先存起来
18                     int RowNum = sheet.PhysicalNumberOfRows;
19                     NPOI.SS.UserModel.IRow row = sheet.GetRow(0);
20                     Matrix = new double[sheet.PhysicalNumberOfRows, row.LastCellNum];
21 
22                     for (int j = 0; j < RowNum; j++)
23                     {
24                         row = sheet.GetRow(j);
25                         for (int k = 0; k < row.LastCellNum; k++)
26                         {
27                             NPOI.SS.UserModel.ICell cell = row.GetCell(k);
28                             Matrix[j, k] = Convert.ToDouble(cell.ToString());
29                         }
30                     }
31                 }
32                 else
33                 {
34                     Matrix = null;
35                 }
36             }
37         }

 写函数。将二维数组中的数据写到指定目录、表名的Excel中。写之前先将原数据删除了。

 1         /*
 2          * 先删除表内的数据然后在写入新的数据
 3          * * **********************************************************************************
 4          * 从第一行连续的写入数据,每一行数据列数一样。
 5          */
 6         public static void WriteExcel(string FilePath, string SheetName, double[,] Matrix)
 7         {
 8             using(FileStream file = File.OpenRead(FilePath))
 9             {
10                 NPOI.HSSF.UserModel.HSSFWorkbook workbook = new NPOI.HSSF.UserModel.HSSFWorkbook(file);
11                 NPOI.SS.UserModel.ISheet sheet =  workbook.GetSheet(SheetName);
12                 //由于sheet.PhysicalNumberOfRows的值会随时的变动,故先存起来
13                 int RowNum = sheet.PhysicalNumberOfRows;
14                 for (int i = 0; i < RowNum; i++)
15                 {
16                     sheet.RemoveRow(sheet.GetRow(i));
17                 }
18 
19                 NPOI.SS.UserModel.IRow row;
20                 for (int j = 0; j < Matrix.GetLength(0); j++)
21                 {
22                     row = sheet.CreateRow(j);
23                     for (int k = 0; k < Matrix.GetLength(1); k++)
24                     {
25                         //如果用数字类型存,数字太小的会转为科学计数法形式,这样就读的时候读不出来。
26                         row.CreateCell(k).SetCellValue(Matrix[j, k].ToString());
27                     }
28                 }
29                 //写之后,需要调用Write函数,才算成功。
30                 FileStream fileSave = File.OpenWrite(FilePath);
31                 workbook.Write(fileSave);
32                 fileSave.Close();
33             }
34         }

 将二维数组插入到指定表格的尾部。

 1         /*
 2          * 向Excel中添加数据。需保证Excel中的从第一条开始连续有数据。
 3          */
 4         public static void AppendExcel(string FilePath, string SheetName, double[,] Matrix)
 5         {
 6             using (FileStream file = File.OpenRead(FilePath))
 7             {
 8                 NPOI.HSSF.UserModel.HSSFWorkbook workbook = new NPOI.HSSF.UserModel.HSSFWorkbook(file);
 9 
10                 NPOI.SS.UserModel.ISheet sheet = workbook.GetSheet(SheetName);
11                 NPOI.SS.UserModel.IRow row;
12 
13                 for (int i = 0; i < Matrix.GetLength(0); i++)
14                 {
15                     row = sheet.CreateRow(sheet.PhysicalNumberOfRows);
16                     for (int j = 0; j < Matrix.GetLength(1); j++)
17                     {
18                         row.CreateCell(j).SetCellValue(Matrix[i, j].Tostring());
19                     }
20                 }
21 
22                 FileStream fileSave = File.OpenWrite(FilePath);
23                 workbook.Write(fileSave);
24                 fileSave.Close();
25             }
26         }
原文地址:https://www.cnblogs.com/tqianly/p/3647961.html