电竞比分网-中国电竞赛事及体育赛事平台

分享

C#項目中操作Excel文件

 行走在理想邊緣 2020-04-14

實際C#項目中經(jīng)常會涉及到需要對本地Excel文件進行操作,特別是一些包含數(shù)據(jù)記錄、分析、匯總功能模塊的項目。常用的操作Excel文件的方法主要有三個:

1. OleDb:

這種方式是把整個Excel文件當做一個數(shù)據(jù)源來進行數(shù)據(jù)的讀取操作。

優(yōu)點:實現(xiàn)方式簡單,讀取速度快;

缺點:讀取Excel數(shù)據(jù)的過程不太靈活,對內(nèi)存的占用比較高,當數(shù)據(jù)量變的很大時,容易由于內(nèi)存空間不足導致內(nèi)存溢出異常。(不過貌似對于今天電腦的硬件配置來說,內(nèi)存問題不大)

2. Com組件

這種方式是通過Com組件 Microsoft.Office.Interop.Excel.dll實現(xiàn)Excel文件的操作。

優(yōu)點:讀取Excel數(shù)據(jù)非常靈活,可以實現(xiàn)Excel具有的各種數(shù)據(jù)處理功能;

缺點:對數(shù)據(jù)的訪問時基于單元格方式實現(xiàn)的,所以讀寫數(shù)據(jù)較慢,特別是當數(shù)據(jù)量較大時,訪問效率問題更為突出。另一點是要求本機安裝了Microsoft Office組件。

3. NPOI

這種方式是通過NPOI庫實現(xiàn)Excel文件操作,可以在沒有安裝微軟Office的情況下使用。

優(yōu)點:讀取Excel數(shù)據(jù)速度較快,操作方式靈活;

缺點:試了再說!

NPOI支持的文件格式處理xls、xlsx外,還包括doc、ppt、vsd等,功能強大,人稱Excel一哥。本文就準備單獨談一談NPOI對Excel的基本操作。

NPOI是什么?

NPOI的log圖標如下:

NPOI中N指代的是.Net,POI是一個完全開源的Java寫成的庫,能夠在沒有安裝微軟Office或者相應(yīng)環(huán)境的情況下讀寫Excel、Word等微軟OLE2組件文檔,幾乎支持所有的Office97~Office2007的文件格式。所以NPOI就是POI項目的.Net版本。目前NPOI的最新版本是今年5月份發(fā)布的V2.2.1,包含了.Net Framework2和.Net Framework4兩個版本。

各個版本.Net Framework對應(yīng)信息如下:

可以在C盤——C:\Windows\Microsoft.NET\Framework 下查看本機已經(jīng)安裝的.Net Framework版本,在我的機器上安裝了以下版本:

NPOI庫下載、解壓

NPOI官網(wǎng)下載地址:點擊打開鏈接,(如不能下載,可以試試csdn下載上的這個鏈接: NPOI v2.2.1 ) 打開之后,點擊紅色框里的“NPOI 2.2.1 package”即可下載:

下載完成的壓縮包大小只有3.5MB,解壓后可以看到主要文件其實就是5個Dll文件(.Net 2.0和.Net 4.0):

使用的時候只要在自己的C#項目中添加這幾個動態(tài)庫文件的引用就可以了。

在C#工程中添加NPOI動態(tài)庫引用

新建Visual Studio C# 控制臺應(yīng)用程序(或Windows窗體應(yīng)用程序、WPF應(yīng)用程序等均可),在解決方案管理器里項目下的“引用”上右擊“添加引用”:

在彈出的“引用管理器”對話框中單擊“瀏覽(B)”,選擇NPOI所在的文件夾,根據(jù)機器上.Net Framework版本,選擇Net20或Net40下的動態(tài)庫。

添加完成之后展開項目下的“引用”項,可以看到剛才所添加的動態(tài)庫。

經(jīng)過簡單的“添加引用”之后就可以在自己的代碼中使用NPOI提供的接口實現(xiàn)各種Excel操作了。

Excel工作簿、工作表、xls、xlsx概念

在用NPOI編碼之前,簡單明確一下Excel中工作簿、工作表、xls、xlsx的概念,行、列、單元格等很明了的概念就不啰嗦了。

1. 每一個Excel文件都可以看做是一個工作簿,當打開一個Excel文件時,就等于打開了一個Excel工作簿。

2. 當打開了excel工作簿后在窗口底部看到的“Sheet”標簽標示的是工作表,有幾個標簽就表示有幾個工作表。

    簡單做一個類比,一個Excel文件即一個工作簿可以看做一本書,一個工作表即一個Sheet頁面是書內(nèi)的一頁,可以     有很多頁。Excel2003最多可以添加255(有強迫癥的程序猿最愛的數(shù)字之一)個,Excel2007隨意加。

3. xls是Office 2003以及之前版本Excel的擴展名,xlsx是Office 2007及之后版本Excel所用的擴展名。xlsx用新的基于     XML的壓縮文件格式取代了之前的默認文件格式,在傳統(tǒng)的文件名后面添加了字面x(即.docx取代.doc、.xlsx取         代.xls,等等),使其占用的空間更小。xlsx向下兼容xls。

新建一個Excel工作表

除添加Dll文件的引用外,還需要添加名稱空間:

  1. using NPOI.SS.UserModel;
  2. using NPOI.HSSF.UserModel;
  3. using NPOI.XSSF.UserModel;

HSSF使用于2007之前的xls版本,XSSF適用于2007及其之后的xlsx版本。

以下程序新建一個Excel 2003 xls和一個2007 xlsx文件,跟用Office建立的標準Excel格式一樣,每一個Excel文件初始包含了3個工作表。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using NPOI.SS.UserModel;
  7. using NPOI.HSSF.UserModel;
  8. using NPOI.XSSF.UserModel;
  9. using System.IO;
  10. namespace Excel_NPOI
  11. {
  12. class Program
  13. {
  14. static void Main(string[] args)
  15. {
  16. HSSFWorkbook workbook2003 = new HSSFWorkbook(); //新建xls工作簿
  17. workbook2003.CreateSheet("Sheet1"); //新建3個Sheet工作表
  18. workbook2003.CreateSheet("Sheet2");
  19. workbook2003.CreateSheet("Sheet3");
  20. FileStream file2003 = new FileStream(@"E:\Excel2003.xls", FileMode.Create);
  21. workbook2003.Write(file2003);
  22. file2003.Close(); //關(guān)閉文件流
  23. workbook2003.Close();
  24. XSSFWorkbook workbook2007 = new XSSFWorkbook(); //新建xlsx工作簿
  25. workbook2007.CreateSheet("Sheet1");
  26. workbook2007.CreateSheet("Sheet2");
  27. workbook2007.CreateSheet("Sheet3");
  28. FileStream file2007 = new FileStream(@"E:\Excel2007.xlsx", FileMode.Create);
  29. workbook2007.Write(file2007);
  30. file2007.Close();
  31. workbook2007.Close();
  32. }
  33. }
  34. }

運行之后會在E盤根目錄下生成Excel2003.xls和Excel2007.xlsx兩個文件。


 

寫入Excel文件數(shù)據(jù)

以xls文件為例,介紹把數(shù)據(jù)寫入Excel文件的方法。

寫數(shù)據(jù)要遵循一定的順序,可以概括為:讀取(或新建一個工作簿)->獲取工作表->對工作表添加行->對每一行添加單元格->對單元格賦值;

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using NPOI.SS.UserModel;
  7. using NPOI.HSSF.UserModel;
  8. using NPOI.XSSF.UserModel;
  9. using System.IO;
  10. namespace Excel_NPOI
  11. {
  12. class Program
  13. {
  14. static void Main(string[] args)
  15. {
  16. HSSFWorkbook workbook2003 = new HSSFWorkbook(); //新建工作簿
  17. workbook2003.CreateSheet("Sheet1"); //新建1個Sheet工作表
  18. HSSFSheet SheetOne = (HSSFSheet)workbook2003.GetSheet("Sheet1"); //獲取名稱為Sheet1的工作表
  19. //對工作表先添加行,下標從0開始
  20. for (int i = 0; i < 10; i++)
  21. {
  22. SheetOne.CreateRow(i); //創(chuàng)建10行
  23. }
  24. //對每一行創(chuàng)建10個單元格
  25. HSSFRow SheetRow = (HSSFRow)SheetOne.GetRow(0); //獲取Sheet1工作表的首行
  26. HSSFCell[] SheetCell = new HSSFCell[10];
  27. for (int i = 0; i < 10; i++)
  28. {
  29. SheetCell[i] = (HSSFCell)SheetRow.CreateCell(i); //為第一行創(chuàng)建10個單元格
  30. }
  31. //創(chuàng)建之后就可以賦值了
  32. SheetCell[0].SetCellValue(true); //賦值為bool型
  33. SheetCell[1].SetCellValue(0.000001); //賦值為浮點型
  34. SheetCell[2].SetCellValue("Excel2003"); //賦值為字符串
  35. SheetCell[3].SetCellValue("123456789987654321");//賦值為長字符串
  36. for (int i = 4; i < 10; i++)
  37. {
  38. SheetCell[i].SetCellValue(i); //循環(huán)賦值為整形
  39. }
  40. FileStream file2003 = new FileStream(@"E:\Excel2003.xls", FileMode.Create);
  41. workbook2003.Write(file2003);
  42. file2003.Close();
  43. workbook2003.Close();
  44. }
  45. }
  46. }

運行之后在生成的Exce2003.xls中的內(nèi)容為:

讀取Excel文件數(shù)據(jù)

HSSFWorkbook類和XSSFWorkbook類都繼承自IWorkbook類,所以在不知道所要讀取的Excel文件時xls還是xlsx時,可以使用IWorkbook來聲明一個通用的工作簿變量,隨后根據(jù)傳入的文件名判斷是xls還是xlsx。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using NPOI.SS.UserModel;
  7. using NPOI.HSSF.UserModel;
  8. using NPOI.XSSF.UserModel;
  9. using System.IO;
  10. namespace Excel_NPOI
  11. {
  12. class Program
  13. {
  14. static void Main(string[] args)
  15. {
  16. IWorkbook workbook = null; //新建IWorkbook對象
  17. string fileName = "E:\\Excel2003.xls";
  18. FileStream fileStream = new FileStream(@"E:\Excel2003.xls", FileMode.Open, FileAccess.Read);
  19. if (fileName.IndexOf(".xlsx") > 0) // 2007版本
  20. {
  21. workbook = new XSSFWorkbook(fileStream); //xlsx數(shù)據(jù)讀入workbook
  22. }
  23. else if (fileName.IndexOf(".xls") > 0) // 2003版本
  24. {
  25. workbook = new HSSFWorkbook(fileStream); //xls數(shù)據(jù)讀入workbook
  26. }
  27. ISheet sheet = workbook.GetSheetAt(0); //獲取第一個工作表
  28. IRow row;// = sheet.GetRow(0); //新建當前工作表行數(shù)據(jù)
  29. for (int i = 0; i < sheet.LastRowNum; i++) //對工作表每一行
  30. {
  31. row = sheet.GetRow(i); //row讀入第i行數(shù)據(jù)
  32. if (row != null)
  33. {
  34. for (int j = 0; j < row.LastCellNum; j++) //對工作表每一列
  35. {
  36. string cellValue = row.GetCell(j).ToString(); //獲取i行j列數(shù)據(jù)
  37. Console.WriteLine(cellValue);
  38. }
  39. }
  40. }
  41. Console.ReadLine();
  42. fileStream.Close();
  43. workbook.Close();
  44. }
  45. }
  46. }

這段代碼實現(xiàn)讀取一個Excel文件內(nèi)第一個工作表中的所有單元格內(nèi)容,并打印輸出。

取在上段代碼中生成的xml文件作為輸入,運行結(jié)果為:

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多