日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

C#項(xiàng)目中操作Excel文件

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

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

1. OleDb:

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

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

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

2. Com組件

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

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

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

3. NPOI

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

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

缺點(diǎn):試了再說!

NPOI支持的文件格式處理xls、xlsx外,還包括doc、ppt、vsd等,功能強(qiáng)大,人稱Excel一哥。本文就準(zhǔn)備單獨(dú)談一談NPOI對(duì)Excel的基本操作。

NPOI是什么?

NPOI的log圖標(biāo)如下:

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

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

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

NPOI庫(kù)下載、解壓

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

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

使用的時(shí)候只要在自己的C#項(xiàng)目中添加這幾個(gè)動(dòng)態(tài)庫(kù)文件的引用就可以了。

在C#工程中添加NPOI動(dòng)態(tài)庫(kù)引用

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

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

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

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

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

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

1. 每一個(gè)Excel文件都可以看做是一個(gè)工作簿,當(dāng)打開一個(gè)Excel文件時(shí),就等于打開了一個(gè)Excel工作簿。

2. 當(dāng)打開了excel工作簿后在窗口底部看到的“Sheet”標(biāo)簽標(biāo)示的是工作表,有幾個(gè)標(biāo)簽就表示有幾個(gè)工作表。

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

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

新建一個(gè)Excel工作表

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

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

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

以下程序新建一個(gè)Excel 2003 xls和一個(gè)2007 xlsx文件,跟用Office建立的標(biāo)準(zhǔn)Excel格式一樣,每一個(gè)Excel文件初始包含了3個(gè)工作表。

  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個(gè)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. }

運(yùn)行之后會(huì)在E盤根目錄下生成Excel2003.xls和Excel2007.xlsx兩個(gè)文件。


 

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

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

寫數(shù)據(jù)要遵循一定的順序,可以概括為:讀?。ɑ蛐陆ㄒ粋€(gè)工作簿)->獲取工作表->對(duì)工作表添加行->對(duì)每一行添加單元格->對(duì)單元格賦值

  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個(gè)Sheet工作表
  18. HSSFSheet SheetOne = (HSSFSheet)workbook2003.GetSheet("Sheet1"); //獲取名稱為Sheet1的工作表
  19. //對(duì)工作表先添加行,下標(biāo)從0開始
  20. for (int i = 0; i < 10; i++)
  21. {
  22. SheetOne.CreateRow(i); //創(chuàng)建10行
  23. }
  24. //對(duì)每一行創(chuàng)建10個(gè)單元格
  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個(gè)單元格
  30. }
  31. //創(chuàng)建之后就可以賦值了
  32. SheetCell[0].SetCellValue(true); //賦值為bool型
  33. SheetCell[1].SetCellValue(0.000001); //賦值為浮點(diǎn)型
  34. SheetCell[2].SetCellValue("Excel2003"); //賦值為字符串
  35. SheetCell[3].SetCellValue("123456789987654321");//賦值為長(zhǎng)字符串
  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. }

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

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

HSSFWorkbook類和XSSFWorkbook類都繼承自IWorkbook類,所以在不知道所要讀取的Excel文件時(shí)xls還是xlsx時(shí),可以使用IWorkbook來聲明一個(gè)通用的工作簿變量,隨后根據(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對(duì)象
  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); //獲取第一個(gè)工作表
  28. IRow row;// = sheet.GetRow(0); //新建當(dāng)前工作表行數(shù)據(jù)
  29. for (int i = 0; i < sheet.LastRowNum; i++) //對(duì)工作表每一行
  30. {
  31. row = sheet.GetRow(i); //row讀入第i行數(shù)據(jù)
  32. if (row != null)
  33. {
  34. for (int j = 0; j < row.LastCellNum; j++) //對(duì)工作表每一列
  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. }

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

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

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多