版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
0NPOI1.2教程/npoi-1-2-1%E6%95%99%E7%A8%8B1認(rèn)識(shí)NPOI本章將介紹NPOI的一些基本信息,包括以下幾個(gè)部分什么是NPOI版權(quán)說(shuō)明相關(guān)資源團(tuán)隊(duì)介紹未來(lái)展望各Assembly的作用1.1什么是NPOINPOI,顧名思義,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java寫(xiě)成的庫(kù),能夠幫助開(kāi)發(fā)者在沒(méi)有安裝微軟Office的情況下讀寫(xiě)Office97-2003的文件,支持的文件格式包括xls,doc,ppt等。在本文發(fā)布時(shí),POI的最新版本是3.5beta6。NPOI1.x是基于POI3.x版本開(kāi)發(fā)的,與poi3.2對(duì)應(yīng)的版本是NPOI1.2,目前最新發(fā)布的版本是1.2.1,在該版本中僅支持讀寫(xiě)Excel文件和Drawing格式,其他文件格式將在以后的版本中得到支持。1.2版權(quán)說(shuō)明NPOI采用的是Apache2.0許可證(poi也是采用這個(gè)許可證),這意味著它可以被用于任何商業(yè)或非商業(yè)項(xiàng)目,你不用擔(dān)心因?yàn)槭褂盟仨氶_(kāi)放你自己的源代碼,所以它對(duì)于很多從事業(yè)務(wù)系統(tǒng)開(kāi)發(fā)的公司來(lái)說(shuō)絕對(duì)是很不錯(cuò)的選擇。當(dāng)然作為一個(gè)開(kāi)源許可證,肯定也是有一些義務(wù)的,例如如果你在系統(tǒng)中使用NPOI,你必須保留NPOI中的所有聲明信息。對(duì)于源代碼的任何修改,必須做出明確的標(biāo)識(shí)。完整的apache2.0許可證請(qǐng)見(jiàn)/man/Apache-2/license.html1.3相關(guān)資源官方網(wǎng)站:/POIFSBrowser1.2下載地址:/Release/ProjectReleases.aspx?ReleaseId=243051.4團(tuán)隊(duì)介紹TonyQu來(lái)自于中國(guó)上海,是這個(gè)項(xiàng)目的發(fā)起人和開(kāi)發(fā)人員,時(shí)區(qū)是GMT+8,2008年9月開(kāi)始了NPOI的開(kāi)發(fā),負(fù)責(zé)NPOI所有底層庫(kù)的開(kāi)發(fā)、測(cè)試和bug修復(fù)。個(gè)人blog地址為/HüseyinTüfek?ilerli來(lái)自于土耳其的伊斯坦布爾,也是這個(gè)項(xiàng)目的開(kāi)發(fā)人員,時(shí)區(qū)是GMT+2,2008年11月參與了NPOI的開(kāi)發(fā),主要負(fù)責(zé)POIFSBrowser1.0的開(kāi)發(fā)工作。個(gè)人blog地址為/aTao.Xiang,來(lái)自中國(guó),2009年8月開(kāi)始參與該項(xiàng)目,主要參與了NPOI1.2中文版的撰寫(xiě)工作和推廣工作個(gè)人blog地址為/atao/1.5回顧與展望目前POI版本中的HWPF(用于Word的讀寫(xiě)庫(kù))還不是很穩(wěn)定,并非正式發(fā)布版本,且負(fù)責(zé)HWPF的關(guān)鍵開(kāi)發(fā)人員已經(jīng)離開(kāi),所以NPOI可能考慮自己重新開(kāi)發(fā)HWPF。另外,目前微軟正在開(kāi)發(fā)OpenXMLFormatSDK,NPOI可能會(huì)放棄對(duì)ooxml的支持,當(dāng)然這取決于用戶(hù)的需求和OpenXMLFormatSDK的穩(wěn)定性和速度。從目前而言,NPOI有幾大優(yōu)勢(shì)第一,完全基于.NET2.0,而非.NET3.0/3.5。第二,讀寫(xiě)速度快(有個(gè)國(guó)外的兄弟回復(fù)說(shuō),他原來(lái)用ExcelPackage生成用了4-5個(gè)小時(shí),現(xiàn)在只需要4-5分鐘)第三,穩(wěn)定性好(相對(duì)于用OfficeOIA而言,畢竟那東西是基于Automation做的,在Server上跑個(gè)Automation的東西,想想都覺(jué)得可怕),跑過(guò)了將近1000個(gè)測(cè)試用例(來(lái)自于POI的testcase目錄)第四,API簡(jiǎn)單易用,當(dāng)然這得感謝POI的設(shè)計(jì)師們第五,完美支持Excel2003格式(據(jù)說(shuō)myxls無(wú)法正確讀取xls模板,但NPOI可以),以后也許是所有Office2003格式希望NPOI把這些優(yōu)勢(shì)繼續(xù)發(fā)揚(yáng)下去,這樣NPOI才會(huì)更有競(jìng)爭(zhēng)力。1.6NPOI1.2中各Assembly的作用NPOI目前有好幾個(gè)assembly,每個(gè)的作用各有不同,開(kāi)發(fā)人員可以按需加載相應(yīng)的assembly。在這里大概羅列一下:NPOI.Util基礎(chǔ)輔助庫(kù)NPOI.POIFSOLE2格式讀寫(xiě)庫(kù)NPOI.DDFMicrosoftDrawing格式讀寫(xiě)庫(kù)NPOI.SSExcel公式計(jì)算庫(kù)NPOI.HPSFOLE2的SummaryInformation和DocumentSummaryInformation屬性讀寫(xiě)庫(kù)NPOI.HSSFExcelBIFF格式讀寫(xiě)庫(kù)2.使用NPOI生成xls文件2.1創(chuàng)建基本內(nèi)容2.1.1創(chuàng)建Workbook和Sheet創(chuàng)建Workbook說(shuō)白了就是創(chuàng)建一個(gè)Excel文件,當(dāng)然在NPOI中更準(zhǔn)確的表示是在內(nèi)存中創(chuàng)建一個(gè)Workbook對(duì)象流。本節(jié)作為第2章的開(kāi)篇章節(jié),將做較為詳細(xì)的講解,以幫助NPOI的學(xué)習(xí)者更好的理解NPOI的組成和使用。NPOI.HSSF是專(zhuān)門(mén)負(fù)責(zé)ExcelBIFF格式的命名空間,供開(kāi)發(fā)者使用的對(duì)象主要位于NPOI.HSSF.UserModel和NPOI.HSSF.Util命名空間下,下面我們要講到的Workbook的創(chuàng)建用的就是NPOI.HSSF.UserModel.HSSFWorkbook類(lèi),這個(gè)類(lèi)負(fù)責(zé)創(chuàng)建.xls文檔。在開(kāi)始創(chuàng)建Workbook之前,我們先要在項(xiàng)目中引用一些必要的NPOIassembly,如下所示:NPOI.dllNPOI.POIFS.dllNPOI.HSSF.dllNPOI.Util.dll要?jiǎng)?chuàng)建一個(gè)新的xls文件其實(shí)很簡(jiǎn)單,只要我們初始化一個(gè)新的HSSFWorkbook實(shí)例就行了,如下所示:123usingNPOI.HSSF.UserModel;...HSSFWorkbookhssfworkbook=newHSSFWorkbook();是不是很方便啊,沒(méi)有任何參數(shù)或設(shè)置,但這么創(chuàng)建有一些限制,這樣創(chuàng)建出來(lái)的Workbook在Excel中打開(kāi)是會(huì)報(bào)錯(cuò)的,因?yàn)镋xcel規(guī)定一個(gè)Workbook必須至少帶1個(gè)Sheet,這也是為什么在Excel界面中,新建一個(gè)Workbook默認(rèn)都會(huì)新建3個(gè)Sheet。所以必須加入下面的創(chuàng)建Sheet的代碼才能保證生成的文件正常:1HSSFSheetsheet=hssfworkbook.CreateSheet("newsheet");如果要?jiǎng)?chuàng)建標(biāo)準(zhǔn)的Excel文件,即擁有3個(gè)Sheet,可以用下面的代碼:123hssfworkbook.CreateSheet("Sheet1");hssfworkbook.CreateSheet("Sheet2");hssfworkbook.CreateSheet("Sheet3");最后就是把這個(gè)HSSFWorkbook實(shí)例寫(xiě)入文件了,代碼也很簡(jiǎn)單,如下所示:123FileStreamfile=newFileStream("test.xls",FileMode.Create);hssfworkbook.Write(file);file.Close();這里假設(shè)文件名是test.xls,,在創(chuàng)建完FileStream之后,直接調(diào)用HSSFWorkbook類(lèi)的Write方法就可以了。最后你可以打開(kāi)test.xls文件確認(rèn)一下,是不是有3個(gè)空的Sheet。相關(guān)范例請(qǐng)見(jiàn)NPOI1.2正式版中的CreateEmptyExcelFile項(xiàng)目。2.1.2創(chuàng)建DocumentSummaryInformation和SummaryInformation前一節(jié)中我們講解了如何創(chuàng)建一個(gè)新的Workbook,但在此過(guò)程中大家也許會(huì)發(fā)現(xiàn)一個(gè)細(xì)節(jié),這些文件沒(méi)有包括DocummentSummaryInformation和SummaryInformation頭。如果你還不是很清楚我在說(shuō)什么,可以看POIFSBrowser打開(kāi)test.xls文件后的截圖:你會(huì)發(fā)現(xiàn)只有Workbook目錄,其他什么都沒(méi)有,但事實(shí)上一個(gè)正常的xls文件,比如說(shuō)Excel生成的xls文件是類(lèi)似下面的結(jié)構(gòu):是不是多出來(lái)DocumentSummaryInformation和SummaryInformation兩個(gè)頭?很多人可能對(duì)DocumentSummaryInformation和SummaryInformation很陌生,可能第一次聽(tīng)說(shuō)這玩意,沒(méi)事,這很正常,因?yàn)槠胀ㄓ脩?hù)很少會(huì)去使用這些東西,但它們其實(shí)比想象中有用。請(qǐng)看上圖中的信息,如作者、標(biāo)題、標(biāo)記、備注、主題等信息,其實(shí)這些信息都是存儲(chǔ)在DocummentSummaryInformation和SummaryInformation里面的,這么一說(shuō)我想大家應(yīng)該明白了吧,這些信息是為了快速提取文件信息準(zhǔn)備。在WindowsXP中,也有對(duì)應(yīng)的查看和修改界面,只是沒(méi)有Vista這么方便,如下所示:這恐怕也是很多人對(duì)于這些信息漠不關(guān)心的原因吧,因?yàn)闆](méi)有人愿意通過(guò)右擊文件->屬性這樣復(fù)雜的操作去查看一些摘要信息。提示DocummentSummaryInformation和SummaryInformation并不是Office文件的專(zhuān)利,只要是OLE2格式,都可以擁有這兩個(gè)頭信息,主要目的就是為了在沒(méi)有完整讀取文件數(shù)據(jù)的情況下獲得文件的摘要信息,同時(shí)也可用作桌面搜素的依據(jù)。要了解DocummentSummaryInformation的全部屬性請(qǐng)見(jiàn)/en-us/library/aa380374(VS.85).aspx;要了解SummaryInformation的全部屬性請(qǐng)見(jiàn)/en-us/library/aa369794(VS.85).aspx。好了,說(shuō)到這里,我想大家對(duì)于接下來(lái)我們要?jiǎng)?chuàng)建的內(nèi)容有了初步的認(rèn)識(shí),下面我們就馬上動(dòng)手創(chuàng)建。首先引用以下這些命名空間:usingNPOI.HSSF.UserModel;usingNPOI.HPSF;usingNPOI.POIFS.FileSystem;其中與DocummentSummaryInformation和SummaryInformation密切相關(guān)的是HPSF命名空間。首先創(chuàng)建WorkbookHSSFWorkbookhssfworkbook=newHSSFWorkbook();然后創(chuàng)建DocumentSummaryInformationDocumentSummaryInformationdsi=PropertySetFactory.CreateDocumentSummaryInformation();dsi.Company="NPOITeam";再創(chuàng)建SummaryInformationSummaryInformationsi=PropertySetFactory.CreateSummaryInformation();si.Subject="NPOISDKExample";因?yàn)槭欠独?,這里僅各設(shè)置了一個(gè)屬性,其他都沒(méi)有設(shè)置?,F(xiàn)在我們把創(chuàng)建好的對(duì)象賦給Workbook,這樣才能保證這些信息被寫(xiě)入文件。hssfworkbook.DocumentSummaryInformation=dsi;hssfworkbook.SummaryInformation=si;最后和2.1.1節(jié)一樣,我們把Workbook通過(guò)FileStream寫(xiě)入文件。相關(guān)范例請(qǐng)見(jiàn)NPOI1.2正式版中的CreatePOIFSFileWithProperties2.1.3創(chuàng)建單元格用過(guò)Excel的人都知道,單元格是Excel最有意義的東西,我們做任何操作恐怕都要和單元格打交道。在Excel中我們要添加一個(gè)單元格只需要點(diǎn)擊任何一個(gè)單元格,然后輸入內(nèi)容就是了,但是Excel底層其實(shí)沒(méi)有這么簡(jiǎn)單,不同的單元格是有不同的類(lèi)型的,比如說(shuō)數(shù)值單元格是用NumberRecord表示,文本單元格是用LabelSSTRecord表示,空單元格是用BlankRecord表示。這也就意味著,在設(shè)置單元格時(shí),你必須告訴NPOI你需要?jiǎng)?chuàng)建哪種類(lèi)型的單元格。要?jiǎng)?chuàng)建單元格首先要?jiǎng)?chuàng)建單元格所在的行,比如,下面的代碼創(chuàng)建了第0行:12ISheetsheet1=hssfworkbook.CreateSheet("Sheet1");IRowrow1=sheet1.CreateRow(0);行建好了,就可以建單元格了,比如創(chuàng)建A1位置的單元格:1row1.CreateCell(0).SetCellValue(1);這里要說(shuō)明一下,SetCellValue有好幾種重載,你可以設(shè)置單元格為bool、double、DateTime、string和HSSFRichTextString類(lèi)型。其中對(duì)于string類(lèi)型的重載調(diào)用的就是HSSFRichTextString類(lèi)型的重載,所以是一樣的,HSSFRichTextString可用于有字體或者Unicode的文本。如果你覺(jué)得每一行要聲明一個(gè)HSSFRow很麻煩,可以用下面的方式:1sheet1.CreateRow(0).CreateCell(0).SetCellValue("ThisisaSample");這么用有個(gè)前提,那就是第0行還沒(méi)創(chuàng)建過(guò),否則得這么用:1sheet1.GetRow(0).CreateCell(0).SetCellValue("ThisisaSample");注意:這里的行在Excel里是從1開(kāi)始的,但是NPOI內(nèi)部是從0開(kāi)始的;列在Excel里面是用字母表示的,而NPOI中也是用從0開(kāi)始的數(shù)字表示的,所以要注意轉(zhuǎn)換。如果你要獲得某一個(gè)已經(jīng)創(chuàng)建的單元格對(duì)象,可以用下面的代碼:1sheet1.GetRow(row_index).GetCell(column_index);本節(jié)僅講解最基本的單元格創(chuàng)建,有關(guān)單元格格式設(shè)置、樣式等高級(jí)話題請(qǐng)見(jiàn):2.2節(jié)單元格相關(guān)操作。2.1.4創(chuàng)建批注很多人不怎么用Excel中的批注,所以我特地截了張圖,讓大家知道本節(jié)我們要?jiǎng)?chuàng)建的到底是什么東西。在過(guò)去,我們恐怕沒(méi)有辦法實(shí)現(xiàn)這一功能,因?yàn)闊o(wú)論是cvs法、html法、oledb法都沒(méi)有提供這樣的接口,當(dāng)然OfficePIA法可以做到,但是性能實(shí)在太差,而且穩(wěn)定性不好,經(jīng)常莫名其妙crash(這是某某兄弟給我的反饋,我引用了下,呵呵)。在以后的教程中,你將看到更多在過(guò)去無(wú)法通過(guò)傳統(tǒng)方法實(shí)現(xiàn)的東西,好戲才剛剛開(kāi)始。批注主要有三個(gè)屬性需要設(shè)置,一個(gè)是批注的位置和大小、一個(gè)是批注的文本、還有一個(gè)是批注的作者。批注的位置和大小,在Excel中是與單元格密切相關(guān)的,NPOI中通過(guò)HSSFClientAnchor的實(shí)例來(lái)表示,它的構(gòu)造函數(shù)比較復(fù)雜,有8個(gè)參數(shù),它們分別是參數(shù)說(shuō)明dx1第1個(gè)單元格中x軸的偏移量dy1第1個(gè)單元格中y軸的偏移量dx2第2個(gè)單元格中x軸的偏移量dy2第2個(gè)單元格中y軸的偏移量col1第1個(gè)單元格的列號(hào)row1第1個(gè)單元格的行號(hào)col2第2個(gè)單元格的列號(hào)row2第2個(gè)單元格的行號(hào)例如,如果我們打算讓注釋顯示在B3和E5之間,就應(yīng)該這么寫(xiě):HSSFPatriarchpatr=sheet.CreateDrawingPatriarch();HSSFCommentcomment1=patr.CreateComment(newHSSFClientAnchor(0,0,0,0,1,2,4,4));下面我們?cè)O(shè)置這個(gè)批注的內(nèi)容和作者,這個(gè)比較簡(jiǎn)單:comment1.String=newHSSFRichTextString("HelloWorld");comment1.Author="NPOITeam";最后一步就是把批注賦給某個(gè)單元格:HSSFCellcell=sheet.CreateRow(1).CreateCell(1);cell.CellComment=comment1;對(duì)于批注,你有兩種選擇,一種是隱藏(默認(rèn)),一種是顯示(即表單一打開(kāi)就顯示該批注),可以通過(guò)comment1.Visible屬性來(lái)控制。看了上面這張圖大家就應(yīng)該明白了,這里有2個(gè)批注,下面那個(gè)是顯示的,上面那個(gè)是隱藏的。相關(guān)范例請(qǐng)見(jiàn)NPOI1.2正式版中的SetCellCommentInXls。2.1.5創(chuàng)建頁(yè)眉和頁(yè)腳很多人并不知道Excel的頁(yè)眉和頁(yè)腳功能,因?yàn)樵诮缑嫔鲜秋@示不了頁(yè)眉和頁(yè)腳的,必須在打印頁(yè)面中才能看到,這也直接導(dǎo)致了其設(shè)置界面也顯得更隱秘,你必須進(jìn)入頁(yè)面設(shè)置–>頁(yè)眉和頁(yè)腳才能設(shè)置。以下是Office2007中的設(shè)置界面。當(dāng)你按“自定義頁(yè)眉”或“自定義頁(yè)腳”時(shí),你會(huì)看到以下界面,Excel把頁(yè)眉、頁(yè)腳分成了左中右三部分,這一點(diǎn)絕非單純體現(xiàn)在界面上,在底層的存儲(chǔ)中也是如此。如果你設(shè)置的是“左”的內(nèi)容,底層的存儲(chǔ)字符串就會(huì)在開(kāi)頭加上&L,如果是“右”的內(nèi)容則會(huì)加上&R,所以HeaderRecord中的字符串看上去是這樣的:"&C&LFooterA&R”,這個(gè)字符串的意思是僅設(shè)置了“左”的內(nèi)容,內(nèi)容是FooterA。看了這些我想你應(yīng)該對(duì)頁(yè)眉和頁(yè)腳有所了解了,回過(guò)頭來(lái)說(shuō)NPOI,NPOI中主要是靠HSSFSheet.Header和HSSFSheet.Footer來(lái)設(shè)置的,這兩個(gè)屬性分別是HSSFHeader和HSSFFooter類(lèi)型的。參考代碼如下:12345678HSSFSheets1=hssfworkbook.CreateSheet("Sheet1");s1.CreateRow(0).CreateCell(1).SetCellValue(123);
//setheadertexts1.Header.Center="Thisisatestsheet";//setfootertexts1.Footer.Left="CopyrightNPOITeam";s1.Footer.Right="createdbyTonyQu(瞿杰)";以上代碼中我添加了頁(yè)眉的Center內(nèi)容,F(xiàn)ooter的Left和Right內(nèi)容,在打印預(yù)覽中看到的效果大概是這樣的:頁(yè)眉頁(yè)腳至于一些Excel特殊字符,比如說(shuō)頁(yè)碼可以用&P,當(dāng)前日期可以用&D,其他的東西你就自己研究吧。本范例完整代碼請(qǐng)見(jiàn)NPOI.Examples中的CreateHeaderFooterInXls項(xiàng)目。2.2單元格操作2.2.1設(shè)置格式在Excel中我們經(jīng)常要設(shè)置格式,比如說(shuō)日期格式(yyyymmdd)、小數(shù)點(diǎn)格式(1.20)、貨幣格式($2000)、百分比格式(99.99%)等等,這些東西在過(guò)去我們恐怕只能在服務(wù)器端生成好,不但增加了服務(wù)器端的代碼量,還造成了不必要的字符串替換操作,如今NPOI將讓服務(wù)器從這種完全沒(méi)有必要的操作中解放出來(lái),一切都將由Excel在客戶(hù)端處理。使用NPOI時(shí)要注意,所有的格式都是通過(guò)CellStyle.DataFormat賦給單元格的,而不是直接賦給單元格。案例一日期格式假設(shè)我們現(xiàn)在需要顯示的日期的格式為2008年5月5日,可以用下面的代碼生成:12345678HSSFSheetsheet=hssfworkbook.CreateSheet("newsheet");HSSFCellcell=sheet.CreateRow(0).CreateCell(0);cell.SetCellValue(newDateTime(2008,5,5));//setdateformatHSSFCellStylecellStyle=hssfworkbook.CreateCellStyle();HSSFDataFormatformat=hssfworkbook.CreateDataFormat();cellStyle.DataFormat=format.GetFormat("yyyy年m月d日");cell.CellStyle=cellStyle;由于這里的“yyyy年m月d日”屬于自定義格式(區(qū)別于Excel內(nèi)嵌的格式),所以必須用hssfworkbook.CreateDataFormat()創(chuàng)建一個(gè)HSSFDataFormat實(shí)例,然后使用format.GetFormat來(lái)獲取相應(yīng)的格式,只要是Excel支持的格式表示方式,這種方式都能夠?qū)崿F(xiàn)。案例二保留2位小數(shù)假設(shè)我們有個(gè)單元格的值為1.2,怎么顯示成1.20呢?在Excel中可以用“0.00”來(lái)表示,所以下面的代碼就能完成:12345678//Createarowandputsomecellsinit.Rowsare0based.HSSFCellcell=sheet.CreateRow(0).CreateCell(0);//setvalueforthecellcell.SetCellValue(1.2);//numberformatwith2digitsafterthedecimalpoint-"1.20"HSSFCellStylecellStyle=hssfworkbook.CreateCellStyle();cellStyle.DataFormat=HSSFDataFormat.GetBuiltinFormat("0.00");cell.CellStyle=cellStyle;這里與上面有所不同,用的是HSSFDataFormat.GetBuiltinFormat()方法,之所以用這個(gè),是因?yàn)?.00是Excel內(nèi)嵌的格式,完整的Excel內(nèi)嵌格式列表大家可以看這個(gè)窗口中的自定義列表:這里就不一一列出了。案例三貨幣格式貨幣格式在金融的項(xiàng)目中經(jīng)常用到,比如說(shuō)人民幣符號(hào)¥,美元符號(hào)$等,這里可以用下面的代碼表示:123456HSSFCellcell2=sheet.CreateRow(1).CreateCell(0);cell2.SetCellValue(20000);HSSFCellStylecellStyle2=hssfworkbook.CreateCellStyle();HSSFDataFormatformat=hssfworkbook.CreateDataFormat();cellStyle2.DataFormat=format.GetFormat("¥#,##0");cell2.CellStyle=cellStyle2;注意,這里還加入了千分位分隔符,所以是#,##,至于為什么這么寫(xiě),你得去問(wèn)微軟,呵呵。案例四百分比百分比在報(bào)表中也很常用,其實(shí)基本上和上面一樣,只是格式表示是0.00%,代碼如下:1cellStyle4.DataFormat=HSSFDataFormat.GetBuiltinFormat("0.00%");由于這里是內(nèi)嵌格式,所以直接用HSSFDataFormat.GetBuiltinFormat即可。案例五中文大寫(xiě)在表示金額時(shí),我們時(shí)常會(huì)用到,我也見(jiàn)過(guò)不少兄弟實(shí)現(xiàn)了數(shù)字轉(zhuǎn)中文大小寫(xiě)的工具類(lèi),以后你可以嘗試讓Excel去處理這一切,代碼和剛才差不多,也是改格式的表示:12HSSFDataFormatformat=hssfworkbook.CreateDataFormat();cellStyle6.DataFormat=format.GetFormat("[DbNum2][$-804]0");由于是自定義格式,所以用了HSSFDataFormat.GetFormat,相信你對(duì)這兩種獲取格式的形式的區(qū)別越來(lái)越熟悉了。案例六科學(xué)計(jì)數(shù)法這東西數(shù)學(xué)課上我們都學(xué)過(guò),雖然用的不多,但是既然Excel支持,這里也提一下:1cellStyle3.DataFormat=HSSFDataFormat.GetBuiltinFormat("0.00E+00");
下面展示下以上這些例子的顯示效果:最后總結(jié)一下HSSFDataFormat.GetFormat和HSSFDataFormat.GetBuiltinFormat的區(qū)別:當(dāng)使用Excel內(nèi)嵌的(或者說(shuō)預(yù)定義)的格式時(shí),直接用HSSFDataFormat.GetBuiltinFormat靜態(tài)方法即可。當(dāng)使用自己定義的格式時(shí),必須先調(diào)用HSSFWorkbook.CreateDataFormat(),因?yàn)檫@時(shí)在底層會(huì)先找有沒(méi)有匹配的內(nèi)嵌FormatRecord,如果沒(méi)有就會(huì)新建一個(gè)FormatRecord,所以必須先調(diào)用這個(gè)方法,然后你就可以用獲得的HSSFDataFormat實(shí)例的GetFormat方法了,當(dāng)然相對(duì)而言這種方式比較麻煩,所以?xún)?nèi)嵌格式還是用HSSFDataFormat.GetBuiltinFormat靜態(tài)方法更加直接一些。不過(guò)自定義的格式也不是天馬行空隨便定義,還是要參照Excel的格式表示來(lái)定義,具體請(qǐng)看相關(guān)的Excel教程。注意:自定義的FormatRecord是嵌入xls文件內(nèi)部的,所以不用擔(dān)心對(duì)方Excel中有沒(méi)有定義過(guò)這種格式,都是能夠正常使用的。相關(guān)范例請(qǐng)參考NPOI1.2正式版中的NumberFormatInXls項(xiàng)目。2.2.2單元格合并合并單元格在制作表格時(shí)很有用,比如說(shuō)表格的標(biāo)題就經(jīng)常是把第一行的單元格合并居中。那么在NPOI中應(yīng)該如何實(shí)現(xiàn)單元格的合并呢?為了實(shí)現(xiàn)這一功能,NPOI引入了新的概念,即Region,因?yàn)楹喜卧?,其?shí)就是設(shè)定一個(gè)區(qū)域。下面說(shuō)一下Region類(lèi)的參數(shù),Region總共有4個(gè)參數(shù),如下所示Region的參數(shù)說(shuō)明FirstRow區(qū)域中第一個(gè)單元格的行號(hào)FirstColumn區(qū)域中第一個(gè)單元格的列號(hào)LastRow區(qū)域中最后一個(gè)單元格的行號(hào)LastColumn區(qū)域中最后一個(gè)單元格的列號(hào)由于單元格的合并都是在表的基礎(chǔ)上建立的,所以我們得先建Sheet:12HSSFWorkbookhssfworkbook=newHSSFWorkbook();HSSFSheetsheet=hssfworkbook.CreateSheet("newsheet");接下來(lái)我們根據(jù)實(shí)際場(chǎng)景來(lái)做一些演示。場(chǎng)景一標(biāo)題行的合并這種場(chǎng)景是最常見(jiàn)的,比如說(shuō)我們要建立一張銷(xiāo)售情況表,英文叫SalesReport我們先設(shè)置居中和字體樣式,這里我們采用20號(hào)字體,代碼如下:123456789HSSFRowrow=sheet.CreateRow(0);HSSFCellcell=row.CreateCell(0);cell.SetCellValue("SalesReport");HSSFCellStylestyle=hssfworkbook.CreateCellStyle();style.Alignment=HSSFCellStyle.ALIGN_CENTER;HSSFFontfont=hssfworkbook.CreateFont();font.FontHeight=20*20;style.SetFont(font);cell.CellStyle=style;要產(chǎn)生圖中的效果,即把A1:F1這6個(gè)單元格合并,然后添加合并區(qū)域:1sheet.AddMergedRegion(newRegion(0,0,0,5));
場(chǎng)景二多行合并看完場(chǎng)景一,你可不要認(rèn)為多行合并就需要一行一行做,其實(shí)也只需要一行代碼,比如說(shuō)我們要把C3:E5合并為一個(gè)單元格,那么就可以用下面的代碼:1sheet.AddMergedRegion(newRegion(2,2,4,4));提示即使你沒(méi)有用CreateRow和CreateCell創(chuàng)建過(guò)行或單元格,也完全可以直接創(chuàng)建區(qū)域然后把這一區(qū)域合并,Excel的區(qū)域合并信息是單獨(dú)存儲(chǔ)的,和RowRecord、ColumnInfoRecord不存在直接關(guān)系。相關(guān)范例請(qǐng)參考NPOI1.2正式版中的MergedCellInXls項(xiàng)目。2.2.3對(duì)齊相關(guān)設(shè)置本節(jié)將圍繞“對(duì)齊”選項(xiàng)卡中的設(shè)置展開(kāi),雖然實(shí)際上你會(huì)發(fā)現(xiàn)該選項(xiàng)卡中的很多設(shè)置和對(duì)齊沒(méi)有什么關(guān)系。首先我們用代碼創(chuàng)建必要的單元格,代碼如下:HSSFWorkbookhssfworkbook=newHSSFWorkbook();HSSFSheetsheet1=hssfworkbook.CreateSheet("Sheet1");HSSFRowrow=sheet1.CreateRow(0);row.CreateCell(0).SetCellValue("Test");這里我們假設(shè)在A0單元格中加入了文本Test。請(qǐng)注意接下來(lái)我們要做的所有操作都是在CellStyle的基礎(chǔ)上完成的,所以我們創(chuàng)建一個(gè)HSSFCellStyle:1HSSFCellStylestyle=hssfworkbook.CreateCellStyle();水平對(duì)齊這里用的是HSSFCellStyle.Alignment,默認(rèn)值自然是常規(guī),即HSSFCellStyle.ALIGN_GENERAL。如果是左側(cè)對(duì)齊就是1style.Alignment=HSSFCellStyle.ALIGN_LEFT;如果是居中對(duì)齊就是1style.Alignment=HSSFCellStyle.ALIGN_CENTER;如果是右側(cè)對(duì)齊就是1style.Alignment=HSSFCellStyle.ALIGN_RIGHT;如果是跨列居中就是1style.Alignment=HSSFCellStyle.ALIGN_CENTER_SELECTION;如果是兩端對(duì)齊就是1style.Alignment=HSSFCellStyle.ALIGN_JUSTIFY;如果是填充就是1style.Alignment=HSSFCellStyle.ALIGN_FILL;注意:以上選項(xiàng)僅當(dāng)有足夠的寬度時(shí)才能產(chǎn)生效果,不設(shè)置寬度恐怕看不出區(qū)別。垂直對(duì)齊這里用的是HSSFCellStyle.VerticalAlignment,默認(rèn)值為居中,即HSSFCellStyle.VERTICAL_CENTER如果是靠上就是1style.VerticalAlignment=HSSFCellStyle.VERTICAL_TOP如果是居中就是1style.VerticalAlignment=HSSFCellStyle.VERTICAL_CENTER如果是靠下就是1style.VerticalAlignment=HSSFCellStyle.VERTICAL_BOTTOM如果是兩端對(duì)齊就是1style.VerticalAlignment=HSSFCellStyle.VERTICAL_JUSTIFY注意:以上選項(xiàng)僅當(dāng)有足夠的高度時(shí)才能產(chǎn)生效果,不設(shè)置高度恐怕看不出區(qū)別。自動(dòng)換行自動(dòng)換行翻譯成英文其實(shí)就是Wrap的意思,所以這里我們應(yīng)該用WrapText屬性,這是一個(gè)布爾屬性1style.WrapText=true;效果如下所示:文本縮進(jìn)這是一個(gè)不太引人注意的選項(xiàng),所以這里給張圖出來(lái),讓大家知道是什么,縮進(jìn)說(shuō)白了就是文本前面的空白,我們同樣可以用屬性來(lái)設(shè)置,這個(gè)屬性叫做Indention。1style.Indention=3;文本旋轉(zhuǎn)文本方向大家一定在Excel中設(shè)置過(guò),上圖中就是調(diào)整界面,主要參數(shù)是度數(shù),那么我們?nèi)绾卧贜POI中設(shè)置呢?1style.Rotation=(short)90;以上代碼是把單元格A1中的文本逆時(shí)針旋轉(zhuǎn)90度,等同于下圖中的設(shè)置:請(qǐng)注意,這里的Rotation取值是從-90到90,而不是0-180度。最后別忘了把樣式變量style賦給HSSFCellStyle.CellStyle,否則就前功盡棄了,呵呵!以上的一些功能,比如文本旋轉(zhuǎn)和自動(dòng)換行,使用傳統(tǒng)的cvs和html法恐怕是無(wú)法實(shí)現(xiàn)的。隨著學(xué)習(xí)的不斷深入,你將越來(lái)越意識(shí)到使用NPOI生成Excel其實(shí)如此簡(jiǎn)單。相關(guān)范例請(qǐng)參考NPOI1.2正式版中的SetAlignmentInXls和RotateTextInXls。2.2.4使用邊框很多表格中都要使用邊框,本節(jié)將為你重點(diǎn)講解NPOI中邊框的設(shè)置和使用。邊框和其他單元格設(shè)置一樣也是在HSSFCellStyle上操作的,HSSFCellStyle有2種和邊框相關(guān)的屬性,分別是:邊框相關(guān)屬性說(shuō)明范例Border+方向邊框類(lèi)型BorderTop,BorderBottom,BorderLeft,BorderRight方向+BorderColor邊框顏色TopBorderColor,BottomBorderColor,LeftBorderColor,RightBorderColor其中邊框類(lèi)型分為以下幾種:邊框范例圖對(duì)應(yīng)的靜態(tài)值HSSFCellStyle.BORDER_DOTTEDHSSFCellStyle.BORDER_HAIRHSSFCellStyle.BORDER_DASH_DOT_DOTHSSFCellStyle.BORDER_DASH_DOTHSSFCellStyle.BORDER_DASHEDHSSFCellStyle.BORDER_THINHSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOTHSSFCellStyle.BORDER_SLANTED_DASH_DOTHSSFCellStyle.BORDER_MEDIUM_DASH_DOTHSSFCellStyle.BORDER_MEDIUM_DASHEDHSSFCellStyle.BORDER_MEDIUMHSSFCellStyle.BORDER_THICKHSSFCellStyle.BORDER_DOUBLE至于顏色那就很多了,全部在HSSFColor下面,如HSSFColor.GREEN,HSSFColor.RED,都是靜態(tài)實(shí)例,可以直接引用。下面我們假設(shè)我們要把一個(gè)單元格的四周邊框都設(shè)置上,可以用下面的代碼:123456789101112HSSFSheetsheet=hssfworkbook.CreateSheet("newsheet");//Createarowandputsomecellsinit.Rowsare0based.HSSFRowrow=sheet.CreateRow(1);//Createacellandputavalueinit.HSSFCellcell=row.CreateCell(1);//Stylethecellwithbordersallaround.HSSFCellStylestyle=hssfworkbook.CreateCellStyle();style.BorderBottom=HSSFCellStyle.BORDER_THIN;style.BorderLeft=HSSFCellStyle.BORDER_THIN;style.BorderRight=HSSFCellStyle.BORDER_THIN;style.BorderTop=HSSFCellStyle.BORDER_THIN;cell.CellStyle=style;這段代碼使用了最普通的細(xì)邊框,使得這個(gè)單元格看上去像塊空心磚頭。注意:這里我們沒(méi)有設(shè)置邊框的顏色,但這不會(huì)影響最終的效果,因?yàn)镋xcel會(huì)用默認(rèn)的黑色給邊框上色。如果要設(shè)置顏色的話,也很簡(jiǎn)單,如下:style.BottomBorderColor=HSSFColor.GREEN.index;以上代碼將底部邊框設(shè)置為綠色,要注意,不是直接把HSSFColor.GREEN賦給XXXXBorderColor屬性,而是把index的值賦給它。2.2.5字體設(shè)置本節(jié)我們將繼續(xù)使用NPOI來(lái)設(shè)置單元格格式,這一節(jié)我們主要講如何設(shè)置“字體”。在設(shè)置字體之前,我們首先要做的就是創(chuàng)建字體對(duì)象,這和創(chuàng)建數(shù)字格式很相似。HSSFFontfont=hssfworkbook.CreateFont();這句話會(huì)在Excel文件內(nèi)部創(chuàng)建相應(yīng)的FontRecord,所以你不用客戶(hù)因?yàn)樽约簷C(jī)器上的Excel沒(méi)有相應(yīng)的字體設(shè)置而導(dǎo)致設(shè)置丟失。字體在設(shè)置完成后,我們就可以把它賦給單元格樣式,代碼如下:HSSFCellStylestyle1=hssfworkbook.CreateCellStyle();style1.SetFont(font);cell1.CellStyle=style1;這里的cell1是HSSFCell的一個(gè)實(shí)例。好了,下面我們就開(kāi)始對(duì)字體進(jìn)行設(shè)置。字體名稱(chēng)這里的字體名稱(chēng)是通過(guò)HSSFFont.FontName進(jìn)行設(shè)置的,至于具體的名稱(chēng),只要是常用字體都可以,比如說(shuō)Arial,Verdana等,當(dāng)然也可以是中文字體名,如宋體、黑體等。不過(guò)設(shè)置字體名稱(chēng)有個(gè)前提,那就是假設(shè)打開(kāi)這個(gè)xls文件的客戶(hù)機(jī)上有這種字體,如果沒(méi)有,Excel將使用默認(rèn)字體。下面就是設(shè)置字體名稱(chēng)為“宋體”的代碼:font.FontName="宋體";字號(hào)與字號(hào)有關(guān)的屬性有兩個(gè),一個(gè)是FontHeight,一個(gè)是FontHeightInPoints。區(qū)別在于,F(xiàn)ontHeight的值是FontHeightInPoints的20倍,通常我們?cè)贓xcel界面中看到的字號(hào),比如說(shuō)12,對(duì)應(yīng)的是FontHeightInPoints的值,而FontHeight要產(chǎn)生12號(hào)字體的大小,值應(yīng)該是240。所以通常建議你用FontHeightInPoint屬性。如果要設(shè)置字號(hào)為12,代碼就是font.FontHeightInPoints=12;字體顏色這里可能會(huì)與CellStyle上的ForegroundColor和BackgroundColor產(chǎn)生混淆,其實(shí)所有的字體顏色都是在HSSFFont的實(shí)例上設(shè)置的,CellStyle的ForegroundColor和BackgroundColor分別指背景填充色和填充圖案的顏色,和文本顏色無(wú)關(guān)。要設(shè)置字體顏色,我們可以用HSSFFont.Color屬性,顏色可以通過(guò)HSSFColor獲得,代碼如下所示:font.Color=HSSFColor.RED.index;這行代碼把文本設(shè)置為紅色。下劃線通常我們所說(shuō)的下劃線都是單線條的,其實(shí)Excel支持好幾種下劃線,如下所示:類(lèi)型對(duì)應(yīng)的值單下劃線HSSFFont.U_SINGLE雙下劃線HSSFFont.U_DOUBLE會(huì)計(jì)用單下劃線HSSFFont.U_SINGLE_ACCOUNTING會(huì)計(jì)用雙下劃線HSSFFont.U_DOUBLE_ACCOUNTING無(wú)下劃線HSSFFont.U_NONE當(dāng)你要設(shè)置下劃線時(shí),可以用HSSFFont.Underline屬性,這是一個(gè)byte類(lèi)型的值,例如font.Underline=HSSFFont.U_SINGLE這行代碼就是設(shè)置單下劃線的代碼。上標(biāo)下標(biāo)設(shè)置這東西可以用HSSFFont.TypeOffset屬性,值有以下幾種:TypeOffset的值說(shuō)明HSSFFont.SS_SUPER上標(biāo)HSSFFont.SS_SUB下標(biāo)HSSFFont.SS_NONE普通,默認(rèn)值所以如果你要上標(biāo)的話,可以用下面的代碼:font.TypeOffset=HSSFFont.SS_SUPER;刪除線設(shè)置這東西可以用HSSFFont.IsStrikeout屬性,當(dāng)為true時(shí),表示有刪除線;為false則表示沒(méi)有刪除線。相關(guān)范例請(qǐng)參考NPOI1.2正式版中的ApplyFontInXls的項(xiàng)目。2.2.6背景和紋理本節(jié)我們將用NPOI來(lái)為單元格添加背景和圖案。在之前的教程中,我們已經(jīng)提到HSSFCellStyle有兩個(gè)背景顏色屬性,一個(gè)叫FillBackgroundColor,另一個(gè)叫FillForegroundColor,但其實(shí)這指的都是背景顏色,那為什么還有ForegroundColor呢?為了能夠幫助大家理解,我們舉一個(gè)實(shí)際的例子,下面這個(gè)圖案是Excel的一個(gè)單元格:線是白色的,背景是紅色的。這里的線其實(shí)就是下面的Excel界面中的圖案:至于線的顏色則是圖案顏色,即白色。所以以上單元格如果要用NPOI來(lái)設(shè)置就可以用以下代碼完成:123456//fillbackgroundHSSFCellStylestyle8=hssfworkbook.CreateCellStyle();style8.FillForegroundColor=NPOI.HSSF.Util.HSSFColor.WHITE.index;style8.FillPattern=HSSFCellStyle.SQUARES;style8.FillBackgroundColor=NPOI.HSSF.Util.HSSFColor.RED.index;sheet1.CreateRow(7).CreateCell(0).CellStyle=style8;現(xiàn)在是不是清楚一些了,這里的FillPattern就圖案樣式,所有的枚舉值都是HSSFCellStyle的常量;FillForegroundColor就是圖案的顏色,而FillBackgroundColor則是背景的顏色,即紅色。下面羅列一下圖案樣式及其對(duì)應(yīng)的值:圖案樣式常量HSSFCellStyle.NO_FILLHSSFCellStyle.ALT_BARSHSSFCellStyle.FINE_DOTSHSSFCellStyle.SPARSE_DOTSHSSFCellStyle.LESS_DOTSHSSFCellStyle.LEAST_DOTSHSSFCellStyle.BRICKSHSSFCellStyle.BIG_SPOTSHSSFCellStyle.THICK_FORWARD_DIAGHSSFCellStyle.THICK_BACKWARD_DIAGHSSFCellStyle.THICK_VERT_BANDSHSSFCellStyle.THICK_HORZ_BANDSHSSFCellStyle.THIN_HORZ_BANDSHSSFCellStyle.THIN_VERT_BANDSHSSFCellStyle.THIN_BACKWARD_DIAGHSSFCellStyle.THIN_FORWARD_DIAGHSSFCellStyle.SQUARESHSSFCellStyle.DIAMONDS通過(guò)這張表,你將很容易找到自己需要的樣式,不用再去一個(gè)一個(gè)猜測(cè)了。相關(guān)范例請(qǐng)參考NPOI1.2正式版中的ColorfullMatrixTable和FillBackgroundInXls。2.2.7設(shè)置寬度和高度在Excel中,單元格的寬度其實(shí)就是列的寬度,因?yàn)镋xcel假設(shè)這一列的單元格的寬度肯定一致。所以要設(shè)置單元格的寬度,我們就得從列的寬度下手,HSSFSheet有個(gè)方法叫SetColumnWidth,共有兩個(gè)參數(shù):一個(gè)是列的索引(從0開(kāi)始),一個(gè)是寬度?,F(xiàn)在假設(shè)你要設(shè)置B列的寬度,就可以用下面的代碼:123HSSFWorkbookhssfworkbook=newHSSFWorkbook();HSSFSheetsheet1=hssfworkbook.CreateSheet("Sheet1");sheet1.SetColumnWidth(1,100*256);這里你會(huì)發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象,SetColumnWidth的第二個(gè)參數(shù)要乘以256,這是怎么回事呢?其實(shí),這個(gè)參數(shù)的單位是1/256個(gè)字符寬度,也就是說(shuō),這里是把B列的寬度設(shè)置為了100個(gè)字符。剛才說(shuō)的是如何設(shè)置,那如何去讀取一個(gè)列的寬度呢?直接用GetColumnWidth方法,這個(gè)方法只有一個(gè)參數(shù),那就是列的索引號(hào)。如下所示:1intcol1width=sheet1.GetColumnWidth(1);說(shuō)完寬度,我們來(lái)說(shuō)高度,在Excel中,每一行的高度也是要求一致的,所以設(shè)置單元格的高度,其實(shí)就是設(shè)置行的高度,所以相關(guān)的屬性也應(yīng)該在HSSFRow上,它就是HSSFRow.Height和HeightInPoints,這兩個(gè)屬性的區(qū)別在于HeightInPoints的單位是點(diǎn),而Height的單位是1/20個(gè)點(diǎn),所以Height的值永遠(yuǎn)是HeightInPoints的20倍。要設(shè)置第一行的高度,可以用如下代碼:1sheet1.CreateRow(0).Height=200*20;或者1sheet1.CreateRow(0).HeightInPoints=200;如果要獲得某一行的行高,可以直接拿HSSFRow.Height屬性的返回值。你可能覺(jué)得一行一行設(shè)置行高或者一列一列設(shè)置列寬很麻煩,那你可以考慮使用HSSFSheet.DefaultColumnWidth、HSSFSheet.DefaultRowHeight和HSSFSheet.DefaultRowHeightInPoints屬性。一旦設(shè)置了這些屬性,如果某一行或者某一列沒(méi)有設(shè)置寬度,就會(huì)使用默認(rèn)寬度或高度。代碼如下:12sheet1.DefaultColumnWidth=100*256;sheet1.DefaultRowHeight=30*20;相關(guān)范例請(qǐng)見(jiàn)NPOI1.2正式版中的SetWidthAndHeightInXls項(xiàng)目2.3使用Excel公式2.0可能有問(wèn)題,需要安裝net3.5SP12.3.1基本計(jì)算從這節(jié)開(kāi)始,我們將開(kāi)始學(xué)習(xí)Excel高級(jí)一點(diǎn)的功能--公式。為某個(gè)單元格指定公式后,單元格中的類(lèi)容將根據(jù)公式計(jì)算得出,如圖:圖中設(shè)置的是一個(gè)基本表達(dá)式”1+2*3”,單元格A1中將顯示此表達(dá)式計(jì)算的結(jié)果”7”,如圖所示。對(duì)應(yīng)的C#生成代碼也很簡(jiǎn)單,如下:HSSFSheet
sheet1
=
hssfworkbook.CreateSheet("Sheet1");
HSSFRow
row1=sheet1.CreateRow(0);
HSSFCell
cel1
=
row1.CreateCell(0);
HSSFCell
cel2
=
row1.CreateCell(1);
HSSFCell
cel3
=
row1.CreateCell(2);
cel1.SetCellFormula("1+2*3");
cel2.SetCellValue(5);同樣,NPOI也支持單元格引用類(lèi)型的公式設(shè)置,如下圖中的C1=A1*B1。對(duì)應(yīng)的公式設(shè)置代碼為:cel3.SetCellFormula("A1*B1");是不是很簡(jiǎn)單呢?但要注意,在利用NPOI寫(xiě)程序時(shí),行和列的計(jì)數(shù)都是從0開(kāi)始計(jì)算的,但在設(shè)置公式時(shí)又是按照Excel的單元格命名規(guī)則來(lái)的。2.3.2SUM函數(shù)這節(jié)我們開(kāi)始學(xué)習(xí)Excel中最常用的函數(shù)—Sum求和函數(shù)。首先,我們先看一上最簡(jiǎn)單的Sum函數(shù):Sum(num1,num2,...)。使用效果如圖圖中的E1=Sum(A1,C1)表示將A1與C1的和填充在E1處,與公式”E1=A1+C1”等效。對(duì)應(yīng)的生成代碼與上一節(jié)中的基本計(jì)算公式類(lèi)似:HSSFSheet
sheet1
=
hssfworkbook.CreateSheet("Sheet1");
HSSFRow
row1
=
sheet1.CreateRow(0);
HSSFCell
cel1
=
row1.CreateCell(0);
HSSFCell
cel2
=
row1.CreateCell(1);
HSSFCell
cel3
=
row1.CreateCell(2);
HSSFCell
celSum1
=
row1.CreateCell(3);
HSSFCell
celSum2
=
row1.CreateCell(4);
HSSFCell
celSum3
=
row1.CreateCell(5);
cel1.SetCellValue(1);
cel2.SetCellValue(2);
cel3.SetCellValue(3);
celSum2.SetCellFormula("sum(A1,C1)");
當(dāng)然,把每一個(gè)單元格作為Sum函數(shù)的參數(shù)很容易理解,但如果要求和的單元格很多,那么公式就會(huì)很長(zhǎng),既不方便閱讀也不方便書(shū)寫(xiě)。所以Excel提供了另外一種多個(gè)單元格求和的寫(xiě)法:如上圖中的“Sum(A1:C1)”表示求從A1到C1所有單元格的和,相當(dāng)于A1+B1+C1。對(duì)應(yīng)的代碼為:celSum1.SetCellFormula("sum(A1:C1)");最后,還有一種求和的方法。就是先定義一個(gè)區(qū)域,如”range1”,然后再設(shè)置Sum(range1),此時(shí)將計(jì)算區(qū)域中所有單元格的和。定義區(qū)域的代碼為:HSSFName
range
=
hssfworkbook.CreateName();
range.Reference
=
"Sheet1!$A1:$C1";
range.NameName
=
"range1";執(zhí)行此代碼后的Excel文件將在的公式菜單下的名稱(chēng)管理器(Excel2007的菜單路徑,2003稍有不同)中看到如下區(qū)域定義:給單元格F1加上公式:celSum3.SetCellFormula("sum(range1)");生成的Excel如下圖所示:2.3.3日期函數(shù)2.3.4字符串相關(guān)函數(shù)2.3.5IF函數(shù)2.3.6CountIf和SumIf函數(shù)2.3.7Lookup函數(shù)2.3.8隨機(jī)數(shù)函數(shù)2.3.9通過(guò)NPOI獲得公式的返回值2.4創(chuàng)建圖形2.4.1畫(huà)線2.4.2畫(huà)矩形2.4.3畫(huà)圓形2.4.4畫(huà)Grid2.4.5插入圖片2.5打印相關(guān)設(shè)置打印設(shè)置主要包括方向設(shè)置、縮放、紙張?jiān)O(shè)置、頁(yè)邊距等。NPOI1.2支持大部分打印屬性,能夠讓你輕松滿(mǎn)足客戶(hù)的打印需要。首先是方向設(shè)置,Excel支持兩種頁(yè)面方向,即縱向和橫向。在NPOI中如何設(shè)置呢?你可以通過(guò)HSSFSheet.PrintSetup.Landscape來(lái)設(shè)置,Landscape是布爾類(lèi)型的,在英語(yǔ)中是橫向的意思。如果Landscape等于true,則表示頁(yè)面方向?yàn)闄M向;否則為縱向。接著是縮放設(shè)置,這里的縮放比例對(duì)應(yīng)于HSSFSheet.PrintSetup.Scale,而頁(yè)寬和頁(yè)高分別對(duì)應(yīng)于HSSFSheet.PrintSetup.FitWidth和HSSFSheet.PrintSetup.FitHeight。要注意的是,這里的PrintSetup.Scale應(yīng)該被設(shè)置為0-100之間的值,而不是小數(shù)。接下來(lái)就是紙張?jiān)O(shè)置了,對(duì)應(yīng)于HSSFSheet.PrintSetup.PaperSize,但這里的PaperSize并不是隨便設(shè)置的,而是由一些固定的值決定的,具體的值與對(duì)應(yīng)的紙張如下表所示:值紙張1USLetter81/2x11in2USLetterSmall81/2x11in3USTabloid11x17in4USLedger17x11in5USLegal81/2x14in6USStatement51/2x81/2in7USExecutive71/4x101/2in8A3297x420mm9A4210x297mm10A4Small210x297mm11A5148x210mm12B4(JIS)250x35413B5(JIS)182x257mm14Folio81/2x13in15Quarto215x275mm1610x14in1711x17in18USNote81/2x11in19USEnvelope#937/8x87/820USEnvelope#1041/8x91/221USEnvelope#1141/2x103/822USEnvelope#124\276x1123USEnvelope#145x111/224Csizesheet25Dsizesheet26Esizesheet27EnvelopeDL110x220mm28EnvelopeC5162x229mm29EnvelopeC3324x458mm30EnvelopeC4229x324mm31EnvelopeC6114x162mm32EnvelopeC65114x229mm33EnvelopeB4250x353mm34EnvelopeB5176x250mm35EnvelopeB6176x125mm36Envelope110x230mm37USEnvelopeMonarch3.875x7.5in3863/4USEnvelope35/8x61/2in39USStdFanfold147/8x11in40GermanStdFanfold81/2x12in41GermanLegalFanfold81/2x13in42B4(ISO)250x353mm43JapanesePostcard100x148mm449x11in4510x11in4615x11in47EnvelopeInvite220x220mm48RESERVED–DONOTUSE49RESERVED–DONOTUSE50USLetterExtra9\275x12in51USLegalExtra9\275x15in52USTabloidExtra11.69x18in53A4Extra9.27x12.69in54LetterTransverse8\275x11in55A4Transverse210x297mm56LetterExtraTransverse9\275x12in57SuperA/SuperA/A4227x356mm58SuperB/SuperB/A3305x487mm59USLetterPlus8.5x12.69in60A4Plus210x330mm61A5Transverse148x210mm62B5(JIS)Transverse182x257mm63A3Extra322x445mm64A5Extra174x235mm65B5(ISO)Extra201x276mm66A2420x594mm67A3Transverse297x420mm68A3ExtraTransverse322x445mm69JapaneseDoublePostcard200x148mm70A6105x148mm71JapaneseEnvelopeKaku#272JapaneseEnvelopeKaku#373JapaneseEnvelopeChou#374JapaneseEnvelopeChou#475LetterRotated11x81/211in76A3Rotated420x297mm77A4Rotated297x210mm78A5Rotated210x148mm79B4(JIS)Rotated364x257mm80B5(JIS)Rotated257x182mm81JapanesePostcardRotated148x100mm82DoubleJapanesePostcardRotated148x200mm83A6Rotated148x105mm84JapaneseEnvelopeKaku#2Rotated85JapaneseEnvelopeKaku#3Rotated86JapaneseEnvelopeChou#3Rotated87JapaneseEnvelopeChou#4Rotated88B6(JIS)128x182mm89B6(JIS)Rotated182x128mm9012x11in91JapaneseEnvelopeYou#492JapaneseEnvelopeYou#4Rotated93PRC16K146x215mm94PRC32K97x151mm95PRC32K(Big)97x151mm96PRCEnvelope#1102x165mm97PRCEnvelope#2102x176mm98PRCEnvelope#3125x176mm99PRCEnvelope#4110x208mm100PRCEnvelope#5110x220mm101PRCEnvelope#6120x230mm102PRCEnvelope#7160x230mm103PRCEnvelope#8120x309mm104PRCEnvelope#9229x324mm105PRCEnvelope#10324x458mm106PRC16KRotated107PRC32KRotated108PRC32K(Big)Rotated109PRCEnvelope#1Rotated165x102mm110PRCEnvelope#2Rotated176x102mm111PRCEnvelope#3Rotated176x125mm112PRCEnvelope#4Rotated208x110mm113PRCEnvelope#5Rotated220x110mm114PRCEnvelope#6Rotated230x120mm115PRCEnvelope#7Rotated230x160mm116PRCEnvelope#8Rotated309x120mm117PRCEnvelope#9Rotated324x229mm118PRCEnvelope#10Rotated458x324mm(此表摘自《ExcelBinaryFileFormat(.xls)StructureSpecification.pdf》)HSSFSheet下面定義了一些xxxx_PAPERSIZE的常量,但都是非常常用的紙張大小,如果滿(mǎn)足不了你的需要,可以根據(jù)上表自己給PaperSize屬性賦值。所以,如果你要設(shè)置紙張大小可以用這樣的代碼:HSSFSheet.PrintSetup.PaperSize=HSSFSheet.A4_PAPERSIZE;或HSSFSheet.PrintSetup.PaperSize=9;(A4210*297mm)再下來(lái)就是打印的起始頁(yè)碼,它對(duì)應(yīng)于HSSFSheet.PrintSetup.PageStart和HSSFSheet.PrintSetup.UsePage,如果UsePage=false,那么就相當(dāng)于“自動(dòng)”,這時(shí)PageStart不起作用;如果UsePage=true,PageStart才會(huì)起作用。所以在設(shè)置PageStart之前,必須先把UsePage設(shè)置為true?!按蛴 睓谥械摹熬W(wǎng)格線”設(shè)置對(duì)應(yīng)于HSSFSheet.IsPrintGridlines,請(qǐng)注意,這里不是HSSFSheet.PrintSetup下面,所以別搞混了。這里之所以不隸屬于PrintSetup是由底層存儲(chǔ)該信息的record決定的,底層是把IsGridsPrinted放在GridsetRecord里面的,而不是PrintSetupRecord里面的,盡管界面上是放在一起的。另外還有一個(gè)HSSFSheet.IsGridsPrinted屬性,這個(gè)屬性對(duì)應(yīng)于底層的gridsetRecord,但這個(gè)record是保留的,從微軟的文檔顯示沒(méi)有任何意義,所以這個(gè)屬性請(qǐng)不要去設(shè)置?!皢紊蛴 眲t對(duì)應(yīng)于HSSFSheet.PrintSetup.NoColors,這是布爾類(lèi)型的,值為true時(shí),表示單色打印?!安莞迤焚|(zhì)”對(duì)應(yīng)于HSSFSheet.PrintSetup.IsDraft,也是布爾類(lèi)型的,值為true時(shí),表示用草稿品質(zhì)打印。這里的打印順序是由HSSFSheet.PrintSetup.LeftToRight決定的,它是布爾類(lèi)型的,當(dāng)為true時(shí),則表示“先行后列”;如果是false,則表示“先列后行”。在NPOI1.2中,“行號(hào)列標(biāo)”、“批注”和“錯(cuò)誤單元格打印為”、“頁(yè)邊距”暫不支持,將在以后的版本中支持。有關(guān)打印的范例可以參考NPOI1.2正式版中的SetPrintSettingsInXls項(xiàng)目。2.6高級(jí)功能2.6.1調(diào)整表單顯示比例在Excel中,可以通過(guò)調(diào)整右下角的滾動(dòng)條來(lái)調(diào)整Sheet的顯示比例。如圖:在NPOI中,也能通過(guò)代碼實(shí)現(xiàn)這樣的功能,并且代碼非常簡(jiǎn)單:HSSFSheet
sheet1
=
hssfworkbook.CreateSheet("Sheet1");
sheet1.CreateRow(0).CreateCell(0).SetCellValue("This
is
a
test.");
//50%
zoom
sheet1.SetZoom(1,2);
我們發(fā)現(xiàn),SetZoom有兩個(gè)參數(shù)。其中第一個(gè)參數(shù)表示縮放比例的分子,第二個(gè)參數(shù)表示縮放比例的分母,所以SetZoom(1,2)就表示縮小到1/2,也就是50%。代碼執(zhí)行后生成的Excel樣式如下:如果將SetZoom的參數(shù)改成(2,1),代碼執(zhí)行后生成的Excel樣式如下,表示擴(kuò)大兩倍:2.6.2設(shè)置密碼有時(shí),我們可能需要某些單元格只讀,如在做模板時(shí),模板中的數(shù)據(jù)是不能隨意讓別人改的。在Excel中,可以通過(guò)“審閱->保護(hù)工作表”來(lái)完成,如下圖:那么,在NPOI中有沒(méi)有辦法通過(guò)編碼的方式達(dá)到這一效果呢?答案是肯定的。HSSFSheet
sheet1
=
hssfworkbook.CreateSheet("Sheet1");
HSSFRow
row1
=
sheet1.CreateRow(0);
HSSFCell
cel1
=
row1.CreateCell(0);
HSSFCell
cel2
=
row1.CreateCell(1);
HSSFCellStyle
unlocked
=
hssfworkbook.CreateCellStyle();
unlocked.IsLocked
=
false;
HSSFCellStyle
locked
=
hssfworkbook.CreateCellStyle();
locked.IsLocked
=
true;
cel1.SetCellValue("沒(méi)被鎖定");
cel1.CellStyle
=
unlocked;
cel2.SetCellValue("被鎖定");
cel2.CellStyle
=
locked;
sheet1.ProtectSheet("password");正如代碼中所看到的,我們通過(guò)設(shè)置CellStype的ISLocked為T(mén)rue,表示此單元格將被鎖定。相當(dāng)于在Excel中執(zhí)行了如下操作:然后通過(guò)ProtectSheet設(shè)置密碼。執(zhí)行結(jié)果如下:沒(méi)被鎖定的列可以任意修改。被鎖定的列不能修改。輸入密碼可以解除鎖定。2.6.3組合行、列Excel2007中有一個(gè)面板是專(zhuān)門(mén)用于設(shè)置組合功能的,叫做“分級(jí)顯示”面板,如下所示:可能我們?cè)谶^(guò)去生成Excel文件的時(shí)候根本不會(huì)用這個(gè)功能,也沒(méi)辦法用,因?yàn)閏vs法和html法沒(méi)辦法控制這些東西。這里簡(jiǎn)單的介紹一下什么叫做組合:組合分為行組合和列組合,所謂行組合,就是讓n行組合成一個(gè)集合,能夠進(jìn)行展開(kāi)和合攏操作,在Excel中顯示如下:圖中左側(cè)就是用于控制行組合折疊的圖標(biāo),圖中上部就是用于控制列組合的,是不是有點(diǎn)像TreeView中的折疊節(jié)點(diǎn)?很多時(shí)候由于數(shù)據(jù)太多,為了讓用戶(hù)對(duì)于大量數(shù)據(jù)一目了然,我們可以使用行列組合來(lái)解決顯示大綱,這和VisualStudio里面的region的概念是類(lèi)似的。細(xì)心的朋友可能已經(jīng)注意到了,我們其實(shí)可以對(duì)一行做多次組合操作,這就是分級(jí)顯示的概念,圖中就把行2-3分為2個(gè)組合,第2行到第4行為一個(gè)組合,第2行到第5行一個(gè)組合,所以是分兩級(jí)。在NPOI中,要實(shí)現(xiàn)分組其實(shí)并不難,你只需要調(diào)用HSSFSheet.GroupRow和HSSFSheet.GroupColumn這兩個(gè)方法就可以了。首先我們來(lái)看HSSFSheet.GroupRow,GroupRow有2個(gè)參數(shù),分別是fro
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年云計(jì)算服務(wù)采購(gòu)合同
- 2024關(guān)于新冠病毒疫苗研發(fā)的技術(shù)共享與保密合同
- 2023年山東大學(xué)第二醫(yī)院護(hù)理人員招聘考試真題
- 2024年專(zhuān)業(yè)離婚調(diào)解服務(wù)協(xié)議
- 2024年城市供水系統(tǒng)建設(shè)特許經(jīng)營(yíng)權(quán)協(xié)議
- 2024年二手車(chē)買(mǎi)賣(mài)合同樣式
- 2024年國(guó)際版權(quán)交易與出版合作協(xié)議
- 2024年企業(yè)社會(huì)責(zé)任履行與可持續(xù)發(fā)展合同
- 2024年工程建筑項(xiàng)目資料全權(quán)委托承包合同
- 2024聲學(xué)技術(shù)研發(fā)與產(chǎn)業(yè)化合同
- 輸電線路運(yùn)維管理制度
- 紅外線治療儀管理規(guī)定操作流程及評(píng)分標(biāo)準(zhǔn)
- 異位妊娠急診服務(wù)流程
- SQL培訓(xùn)PPT-超實(shí)用(共58張)
- 養(yǎng)老綜合體項(xiàng)目建議書(shū)范文
- 天津市中學(xué)生日常行為規(guī)范
- 抗震支架力學(xué)計(jì)算書(shū)
- 小學(xué)作文訓(xùn)練中如何培養(yǎng)學(xué)生的觀察能力
- xx鎮(zhèn)發(fā)展鮮食玉米“一鎮(zhèn)一業(yè)”產(chǎn)業(yè)項(xiàng)目建設(shè)方案
- IEEE1588學(xué)習(xí)筆記
- 鋼管落地卸料平臺(tái)
評(píng)論
0/150
提交評(píng)論