由於項目的需要,從一開始接觸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 }