C#使用NPOI將DataGridView內數據寫入電子表格Excel


    NPOI能夠在用戶沒有安裝office的情況下讀寫office文件,包括.xls/.doc/.ppt等類型的文件。本文介紹的是使用NPOI庫內的函數讀寫Excel(.xls)內的內容。在使用NPOI之前首先先要將NPOI添加到工程應用中,NPOI的官網鏈接:https://archive.codeplex.com/?p=npoi,本文最后也附帶了代碼和文件。

一、將DataGridView控件內的數據寫入Excel文件,如果Excel文件不存在則新建表格,如果文件存在則新建並替換該表格。

寫如Excel前需要知道的:

  1. 引入命名空間;
  2. 創建文件流;
  3. 創建workbook;
  4. 創建sheet;
  5. 創建行row;
  6. 創建單元格cell;
  7. 修改單元格的值;

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM