由于项目的需要,从一开始接触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 }