NPOI能夠在用戶沒有安裝office的情況下讀寫office文件,包括.xls/.doc/.ppt等類型的文件。本文介紹的是使用NPOI庫內的函數讀寫Excel(.xls)內的內容。在使用NPOI之前首先先要將NPOI添加到工程應用中,NPOI的官網鏈接:https://archive.codeplex.com/?p=npoi,本文最后也附帶了代碼和文件。
一、將DataGridView控件內的數據寫入Excel文件,如果Excel文件不存在則新建表格,如果文件存在則新建並替換該表格。
寫如Excel前需要知道的:
- 引入命名空間;
- 創建文件流;
- 創建workbook;
- 創建sheet;
- 創建行row;
- 創建單元格cell;
- 修改單元格的值;
1.引入命名空間:
本文操作所用到的NPOI中命名空間有:
using NPOI.HSSF.UserModel; using NPOI.SS.UserModel;
2.創建文件流:
使用FileStream創建文件流FileStream fs = new FileStream(文件路徑, 文件操作方式, 文件讀寫權限);
FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
3.創建workbook:
創建workbook只要創建一個HSSFWorkbook實例就可以了,HSSFWorkbook是NPOI.HSSF.UserModel中的類。NPOI.HSSF.UserModel.HSSFWorkbook這個類便是用來創建.xls文件的。
HSSFWorkbook workbook = new HSSFWorkbook();
4.創建sheet:
創建完workbook后,還需要為其添加工作表,即創建sheet。創建sheet同樣是創建ISheet實例便可以了,ISheet是NPOI.SS.UserModel中用來創建工作表的類。
ISheet sheet = workbook.CreateSheet("Sheet1");
5.創建行row:
創建行的方法與上述類似,即創建IRow實例。
IRow row = sheet.CreateRow(i);//i為行序號
6.創建單元格cell:
同樣的創建單元格就是創建ICell實例。
ICell cell = row.CreateCell(j);//j為列序號
7.修改單元格值:
修改單元格值通過調用cell的方法SetCellValue()即可;
放個例子:
1 //------------【函數:將表格控件保存至Excel文件(新建/替換)】------------ 2 3 //filePath要保存的目標Excel文件路徑名 4 //datagGridView要保存至Excel的表格控件 5 //------------------------------------------------------------------------ 6 public static bool SaveToExcelNew(string filePath,DataGridView dataGridView) 7 { 8 bool result = true; 9 10 FileStream fs = null;//創建一個新的文件流 11 HSSFWorkbook workbook = null;//創建一個新的Excel文件 12 ISheet sheet = null;//為Excel創建一張工作表 13 14 //定義行數、列數、與當前Excel已有行數 15 int rowCount = dataGridView.RowCount;//記錄表格中的行數 16 int colCount = dataGridView.ColumnCount;//記錄表格中的列數 17 18 //為了防止出錯,這里應該判定一下文件與文件是否存在 19 20 //創建工作表 21 try 22 { 23 fs = new FileStream(filePath, FileMode.Create, FileAccess.Write); 24 workbook = new HSSFWorkbook(); 25 sheet = workbook.CreateSheet("Sheet1"); 26 IRow row = sheet.CreateRow(0); 27 for (int j = 0; j < colCount; j++) //列循環 28 { 29 if (dataGridView.Columns[j].Visible && dataGridView.Rows[0].Cells[j].Value != null) 30 { 31 ICell cell = row.CreateCell(j);//創建列 32 cell.SetCellValue(dataGridView.Columns[j].HeaderText.ToString());//更改單元格值 33 } 34 } 35 } 36 catch 37 { 38 result = false; 39 return result; 40 } 41 42 for (int i = 0; i < rowCount; i++) //行循環 43 { 44 //防止行數超過Excel限制 45 if (i >= 65536) 46 { 47 result = false; 48 break; 49 } 50 IRow row = sheet.CreateRow(1 + i); //創建行 51 for (int j = 0; j < colCount; j++) //列循環 52 { 53 if (dataGridView.Columns[j].Visible && dataGridView.Rows[i].Cells[j].Value != null) 54 { 55 ICell cell = row.CreateCell(j);//創建列 56 cell.SetCellValue(dataGridView.Rows[i].Cells[j].Value.ToString());//更改單元格值 57 } 58 } 59 } 60 try 61 { 62 workbook.Write(fs); 63 } 64 catch 65 { 66 result = false; 67 return result; 68 } 69 finally 70 { 71 if (fs != null) 72 { 73 fs.Close(); 74 fs.Dispose(); 75 } 76 workbook = null; 77 } 78 return result; 79 }
二、將DataGridView控件內的數據寫入Excel文件,如果Excel文件不存在則新建表格,如果文件存在則將數據添加至表格末尾。
思路與上文例子相同,只是在寫入電子表格時使用ISheet的LastRowNum屬性獲取Excel的最后一行,將新的數據一次向下存放。
放個例子:
1 //------------【函數:將表格控件保存至Excel文件(添加/新建)】------------ 2 //filePath要保存的目標Excel文件路徑名 3 //datagGridView要保存至Excel的表格控件 4 //------------------------------------------------ 5 public static bool SaveToExcelAdd(string filePath, DataGridView dataGridView) 6 { 7 bool result = true; 8 9 FileStream fs = null;//創建一個新的文件流 10 HSSFWorkbook workbook = null;//創建一個新的Excel文件 11 ISheet sheet = null;//為Excel創建一張工作表 12 13 //定義行數、列數、與當前Excel已有行數 14 int rowCount = dataGridView.RowCount;//記錄表格中的行數 15 int colCount = dataGridView.ColumnCount;//記錄表格中的列數 16 int numCount = 0;//Excell最后一行序號 17 18 //為了防止出錯這里應該判斷文件夾是否存在 19 20 //判斷文件是否存在 21 if (!File.Exists(filePath)) 22 { 23 try 24 { 25 fs = new FileStream(filePath, FileMode.Create, FileAccess.Write); 26 workbook = new HSSFWorkbook(); 27 sheet = workbook.CreateSheet("Sheet1"); 28 IRow row = sheet.CreateRow(0); 29 for (int j = 0; j < colCount; j++) //列循環 30 { 31 if (dataGridView.Columns[j].Visible && dataGridView.Rows[0].Cells[j].Value != null) 32 { 33 ICell cell = row.CreateCell(j);//創建列 34 cell.SetCellValue(dataGridView.Columns[j].HeaderText.ToString());//更改單元格值 35 } 36 } 37 workbook.Write(fs); 38 } 39 catch 40 { 41 result = false; 42 return result; 43 } 44 finally 45 { 46 if (fs != null) 47 { 48 fs.Close(); 49 fs.Dispose(); 50 fs = null; 51 } 52 workbook = null; 53 } 54 } 55 //創建指向文件的工作表 56 try 57 { 58 fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); 59 workbook = new HSSFWorkbook(fs);//.xls 60 sheet = workbook.GetSheetAt(0); 61 if (sheet == null) 62 { 63 result = false; 64 return result; 65 } 66 numCount = sheet.LastRowNum + 1; 67 } 68 catch 69 { 70 result = false; 71 return result; 72 } 73 74 for (int i = 0; i < rowCount; i++) //行循環 75 { 76 //防止行數超過Excel限制 77 if (numCount + i >= 65536) 78 { 79 result = false; 80 break; 81 } 82 IRow row = sheet.CreateRow(numCount + i); //創建行 83 for (int j = 0; j < colCount; j++) //列循環 84 { 85 if (dataGridView.Columns[j].Visible && dataGridView.Rows[i].Cells[j].Value != null) 86 { 87 ICell cell = row.CreateCell(j);//創建列 88 cell.SetCellValue(dataGridView.Rows[i].Cells[j].Value.ToString());//更改單元格值 89 } 90 } 91 } 92 try 93 { 94 fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); 95 workbook.Write(fs); 96 } 97 catch 98 { 99 result = false; 100 return result; 101 } 102 finally 103 { 104 if (fs != null) 105 { 106 fs.Close(); 107 fs.Dispose(); 108 fs = null; 109 } 110 workbook = null; 111 } 112 return result; 113 }
本文所說的只是單純的實現寫入電子表格的功能,關於NPOI更加詳細的說明可以參考NPOI手冊,或者博客,這個給一個連接:http://blog.csdn.net/pan_junbiao/article/details/39717443
如何將Excel內數據讀取到DataGridView中,參考下篇博文:http://blog.csdn.net/nicewe/article/details/79621698
本文的源文件程序(Visual Studio 2017)與NPOI.DLL文件下載地址:https://download.csdn.net/download/nicewe/10296960
