版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
0NPOI1.2教程/npoi-1-2-1%E6%95%99%E7%A8%8B1認識NPOI本章將介紹NPOI的一些基本信息,包括以下幾個部分什么是NPOI版權(quán)說明相關(guān)資源團隊介紹未來展望各Assembly的作用1.1什么是NPOINPOI,顧名思義,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java寫成的庫,能夠幫助開發(fā)者在沒有安裝微軟Office的情況下讀寫Office97-2003的文件,支持的文件格式包括xls,doc,ppt等。在本文發(fā)布時,POI的最新版本是3.5beta6。NPOI1.x是基于POI3.x版本開發(fā)的,與poi3.2對應(yīng)的版本是NPOI1.2,目前最新發(fā)布的版本是1.2.1,在該版本中僅支持讀寫Excel文件和Drawing格式,其他文件格式將在以后的版本中得到支持。1.2版權(quán)說明NPOI采用的是Apache2.0許可證(poi也是采用這個許可證),這意味著它可以被用于任何商業(yè)或非商業(yè)項目,你不用擔(dān)心因為使用它而必須開放你自己的源代碼,所以它對于很多從事業(yè)務(wù)系統(tǒng)開發(fā)的公司來說絕對是很不錯的選擇。當(dāng)然作為一個開源許可證,肯定也是有一些義務(wù)的,例如如果你在系統(tǒng)中使用NPOI,你必須保留NPOI中的所有聲明信息。對于源代碼的任何修改,必須做出明確的標(biāo)識。完整的apache2.0許可證請見/man/Apache-2/license.html1.3相關(guān)資源官方網(wǎng)站:/POIFSBrowser1.2下載地址:/Release/ProjectReleases.aspx?ReleaseId=243051.4團隊介紹TonyQu來自于中國上海,是這個項目的發(fā)起人和開發(fā)人員,時區(qū)是GMT+8,2008年9月開始了NPOI的開發(fā),負責(zé)NPOI所有底層庫的開發(fā)、測試和bug修復(fù)。個人blog地址為/HüseyinTüfek?ilerli來自于土耳其的伊斯坦布爾,也是這個項目的開發(fā)人員,時區(qū)是GMT+2,2008年11月參與了NPOI的開發(fā),主要負責(zé)POIFSBrowser1.0的開發(fā)工作。個人blog地址為/aTao.Xiang,來自中國,2009年8月開始參與該項目,主要參與了NPOI1.2中文版的撰寫工作和推廣工作個人blog地址為/atao/1.5回顧與展望目前POI版本中的HWPF(用于Word的讀寫庫)還不是很穩(wěn)定,并非正式發(fā)布版本,且負責(zé)HWPF的關(guān)鍵開發(fā)人員已經(jīng)離開,所以NPOI可能考慮自己重新開發(fā)HWPF。另外,目前微軟正在開發(fā)OpenXMLFormatSDK,NPOI可能會放棄對ooxml的支持,當(dāng)然這取決于用戶的需求和OpenXMLFormatSDK的穩(wěn)定性和速度。從目前而言,NPOI有幾大優(yōu)勢第一,完全基于.NET2.0,而非.NET3.0/3.5。第二,讀寫速度快(有個國外的兄弟回復(fù)說,他原來用ExcelPackage生成用了4-5個小時,現(xiàn)在只需要4-5分鐘)第三,穩(wěn)定性好(相對于用OfficeOIA而言,畢竟那東西是基于Automation做的,在Server上跑個Automation的東西,想想都覺得可怕),跑過了將近1000個測試用例(來自于POI的testcase目錄)第四,API簡單易用,當(dāng)然這得感謝POI的設(shè)計師們第五,完美支持Excel2003格式(據(jù)說myxls無法正確讀取xls模板,但NPOI可以),以后也許是所有Office2003格式希望NPOI把這些優(yōu)勢繼續(xù)發(fā)揚下去,這樣NPOI才會更有競爭力。1.6NPOI1.2中各Assembly的作用NPOI目前有好幾個assembly,每個的作用各有不同,開發(fā)人員可以按需加載相應(yīng)的assembly。在這里大概羅列一下:NPOI.Util基礎(chǔ)輔助庫NPOI.POIFSOLE2格式讀寫庫NPOI.DDFMicrosoftDrawing格式讀寫庫NPOI.SSExcel公式計算庫NPOI.HPSFOLE2的SummaryInformation和DocumentSummaryInformation屬性讀寫庫NPOI.HSSFExcelBIFF格式讀寫庫2.使用NPOI生成xls文件2.1創(chuàng)建基本內(nèi)容2.1.1創(chuàng)建Workbook和Sheet創(chuàng)建Workbook說白了就是創(chuàng)建一個Excel文件,當(dāng)然在NPOI中更準(zhǔn)確的表示是在內(nèi)存中創(chuàng)建一個Workbook對象流。本節(jié)作為第2章的開篇章節(jié),將做較為詳細的講解,以幫助NPOI的學(xué)習(xí)者更好的理解NPOI的組成和使用。NPOI.HSSF是專門負責(zé)ExcelBIFF格式的命名空間,供開發(fā)者使用的對象主要位于NPOI.HSSF.UserModel和NPOI.HSSF.Util命名空間下,下面我們要講到的Workbook的創(chuàng)建用的就是NPOI.HSSF.UserModel.HSSFWorkbook類,這個類負責(zé)創(chuàng)建.xls文檔。在開始創(chuàng)建Workbook之前,我們先要在項目中引用一些必要的NPOIassembly,如下所示:NPOI.dllNPOI.POIFS.dllNPOI.HSSF.dllNPOI.Util.dll要創(chuàng)建一個新的xls文件其實很簡單,只要我們初始化一個新的HSSFWorkbook實例就行了,如下所示:123usingNPOI.HSSF.UserModel;...HSSFWorkbookhssfworkbook=newHSSFWorkbook();是不是很方便啊,沒有任何參數(shù)或設(shè)置,但這么創(chuàng)建有一些限制,這樣創(chuàng)建出來的Workbook在Excel中打開是會報錯的,因為Excel規(guī)定一個Workbook必須至少帶1個Sheet,這也是為什么在Excel界面中,新建一個Workbook默認都會新建3個Sheet。所以必須加入下面的創(chuàng)建Sheet的代碼才能保證生成的文件正常:1HSSFSheetsheet=hssfworkbook.CreateSheet("newsheet");如果要創(chuàng)建標(biāo)準(zhǔn)的Excel文件,即擁有3個Sheet,可以用下面的代碼:123hssfworkbook.CreateSheet("Sheet1");hssfworkbook.CreateSheet("Sheet2");hssfworkbook.CreateSheet("Sheet3");最后就是把這個HSSFWorkbook實例寫入文件了,代碼也很簡單,如下所示:123FileStreamfile=newFileStream("test.xls",FileMode.Create);hssfworkbook.Write(file);file.Close();這里假設(shè)文件名是test.xls,,在創(chuàng)建完FileStream之后,直接調(diào)用HSSFWorkbook類的Write方法就可以了。最后你可以打開test.xls文件確認一下,是不是有3個空的Sheet。相關(guān)范例請見NPOI1.2正式版中的CreateEmptyExcelFile項目。2.1.2創(chuàng)建DocumentSummaryInformation和SummaryInformation前一節(jié)中我們講解了如何創(chuàng)建一個新的Workbook,但在此過程中大家也許會發(fā)現(xiàn)一個細節(jié),這些文件沒有包括DocummentSummaryInformation和SummaryInformation頭。如果你還不是很清楚我在說什么,可以看POIFSBrowser打開test.xls文件后的截圖:你會發(fā)現(xiàn)只有Workbook目錄,其他什么都沒有,但事實上一個正常的xls文件,比如說Excel生成的xls文件是類似下面的結(jié)構(gòu):是不是多出來DocumentSummaryInformation和SummaryInformation兩個頭?很多人可能對DocumentSummaryInformation和SummaryInformation很陌生,可能第一次聽說這玩意,沒事,這很正常,因為普通用戶很少會去使用這些東西,但它們其實比想象中有用。請看上圖中的信息,如作者、標(biāo)題、標(biāo)記、備注、主題等信息,其實這些信息都是存儲在DocummentSummaryInformation和SummaryInformation里面的,這么一說我想大家應(yīng)該明白了吧,這些信息是為了快速提取文件信息準(zhǔn)備。在WindowsXP中,也有對應(yīng)的查看和修改界面,只是沒有Vista這么方便,如下所示:這恐怕也是很多人對于這些信息漠不關(guān)心的原因吧,因為沒有人愿意通過右擊文件->屬性這樣復(fù)雜的操作去查看一些摘要信息。提示DocummentSummaryInformation和SummaryInformation并不是Office文件的專利,只要是OLE2格式,都可以擁有這兩個頭信息,主要目的就是為了在沒有完整讀取文件數(shù)據(jù)的情況下獲得文件的摘要信息,同時也可用作桌面搜素的依據(jù)。要了解DocummentSummaryInformation的全部屬性請見/en-us/library/aa380374(VS.85).aspx;要了解SummaryInformation的全部屬性請見/en-us/library/aa369794(VS.85).aspx。好了,說到這里,我想大家對于接下來我們要創(chuàng)建的內(nèi)容有了初步的認識,下面我們就馬上動手創(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";因為是范例,這里僅各設(shè)置了一個屬性,其他都沒有設(shè)置。現(xiàn)在我們把創(chuàng)建好的對象賦給Workbook,這樣才能保證這些信息被寫入文件。hssfworkbook.DocumentSummaryInformation=dsi;hssfworkbook.SummaryInformation=si;最后和2.1.1節(jié)一樣,我們把Workbook通過FileStream寫入文件。相關(guān)范例請見NPOI1.2正式版中的CreatePOIFSFileWithProperties2.1.3創(chuàng)建單元格用過Excel的人都知道,單元格是Excel最有意義的東西,我們做任何操作恐怕都要和單元格打交道。在Excel中我們要添加一個單元格只需要點擊任何一個單元格,然后輸入內(nèi)容就是了,但是Excel底層其實沒有這么簡單,不同的單元格是有不同的類型的,比如說數(shù)值單元格是用NumberRecord表示,文本單元格是用LabelSSTRecord表示,空單元格是用BlankRecord表示。這也就意味著,在設(shè)置單元格時,你必須告訴NPOI你需要創(chuàng)建哪種類型的單元格。要創(chuàng)建單元格首先要創(chuàng)建單元格所在的行,比如,下面的代碼創(chuàng)建了第0行:12ISheetsheet1=hssfworkbook.CreateSheet("Sheet1");IRowrow1=sheet1.CreateRow(0);行建好了,就可以建單元格了,比如創(chuàng)建A1位置的單元格:1row1.CreateCell(0).SetCellValue(1);這里要說明一下,SetCellValue有好幾種重載,你可以設(shè)置單元格為bool、double、DateTime、string和HSSFRichTextString類型。其中對于string類型的重載調(diào)用的就是HSSFRichTextString類型的重載,所以是一樣的,HSSFRichTextString可用于有字體或者Unicode的文本。如果你覺得每一行要聲明一個HSSFRow很麻煩,可以用下面的方式:1sheet1.CreateRow(0).CreateCell(0).SetCellValue("ThisisaSample");這么用有個前提,那就是第0行還沒創(chuàng)建過,否則得這么用:1sheet1.GetRow(0).CreateCell(0).SetCellValue("ThisisaSample");注意:這里的行在Excel里是從1開始的,但是NPOI內(nèi)部是從0開始的;列在Excel里面是用字母表示的,而NPOI中也是用從0開始的數(shù)字表示的,所以要注意轉(zhuǎn)換。如果你要獲得某一個已經(jīng)創(chuàng)建的單元格對象,可以用下面的代碼:1sheet1.GetRow(row_index).GetCell(column_index);本節(jié)僅講解最基本的單元格創(chuàng)建,有關(guān)單元格格式設(shè)置、樣式等高級話題請見:2.2節(jié)單元格相關(guān)操作。2.1.4創(chuàng)建批注很多人不怎么用Excel中的批注,所以我特地截了張圖,讓大家知道本節(jié)我們要創(chuàng)建的到底是什么東西。在過去,我們恐怕沒有辦法實現(xiàn)這一功能,因為無論是cvs法、html法、oledb法都沒有提供這樣的接口,當(dāng)然OfficePIA法可以做到,但是性能實在太差,而且穩(wěn)定性不好,經(jīng)常莫名其妙crash(這是某某兄弟給我的反饋,我引用了下,呵呵)。在以后的教程中,你將看到更多在過去無法通過傳統(tǒng)方法實現(xiàn)的東西,好戲才剛剛開始。批注主要有三個屬性需要設(shè)置,一個是批注的位置和大小、一個是批注的文本、還有一個是批注的作者。批注的位置和大小,在Excel中是與單元格密切相關(guān)的,NPOI中通過HSSFClientAnchor的實例來表示,它的構(gòu)造函數(shù)比較復(fù)雜,有8個參數(shù),它們分別是參數(shù)說明dx1第1個單元格中x軸的偏移量dy1第1個單元格中y軸的偏移量dx2第2個單元格中x軸的偏移量dy2第2個單元格中y軸的偏移量col1第1個單元格的列號row1第1個單元格的行號col2第2個單元格的列號row2第2個單元格的行號例如,如果我們打算讓注釋顯示在B3和E5之間,就應(yīng)該這么寫:HSSFPatriarchpatr=sheet.CreateDrawingPatriarch();HSSFCommentcomment1=patr.CreateComment(newHSSFClientAnchor(0,0,0,0,1,2,4,4));下面我們設(shè)置這個批注的內(nèi)容和作者,這個比較簡單:comment1.String=newHSSFRichTextString("HelloWorld");comment1.Author="NPOITeam";最后一步就是把批注賦給某個單元格:HSSFCellcell=sheet.CreateRow(1).CreateCell(1);cell.CellComment=comment1;對于批注,你有兩種選擇,一種是隱藏(默認),一種是顯示(即表單一打開就顯示該批注),可以通過comment1.Visible屬性來控制??戳松厦孢@張圖大家就應(yīng)該明白了,這里有2個批注,下面那個是顯示的,上面那個是隱藏的。相關(guān)范例請見NPOI1.2正式版中的SetCellCommentInXls。2.1.5創(chuàng)建頁眉和頁腳很多人并不知道Excel的頁眉和頁腳功能,因為在界面上是顯示不了頁眉和頁腳的,必須在打印頁面中才能看到,這也直接導(dǎo)致了其設(shè)置界面也顯得更隱秘,你必須進入頁面設(shè)置–>頁眉和頁腳才能設(shè)置。以下是Office2007中的設(shè)置界面。當(dāng)你按“自定義頁眉”或“自定義頁腳”時,你會看到以下界面,Excel把頁眉、頁腳分成了左中右三部分,這一點絕非單純體現(xiàn)在界面上,在底層的存儲中也是如此。如果你設(shè)置的是“左”的內(nèi)容,底層的存儲字符串就會在開頭加上&L,如果是“右”的內(nèi)容則會加上&R,所以HeaderRecord中的字符串看上去是這樣的:"&C&LFooterA&R”,這個字符串的意思是僅設(shè)置了“左”的內(nèi)容,內(nèi)容是FooterA??戳诉@些我想你應(yīng)該對頁眉和頁腳有所了解了,回過頭來說NPOI,NPOI中主要是靠HSSFSheet.Header和HSSFSheet.Footer來設(shè)置的,這兩個屬性分別是HSSFHeader和HSSFFooter類型的。參考代碼如下:12345678HSSFSheets1=hssfworkbook.CreateSheet("Sheet1");s1.CreateRow(0).CreateCell(1).SetCellValue(123);
//setheadertexts1.Header.Center="Thisisatestsheet";//setfootertexts1.Footer.Left="CopyrightNPOITeam";s1.Footer.Right="createdbyTonyQu(瞿杰)";以上代碼中我添加了頁眉的Center內(nèi)容,F(xiàn)ooter的Left和Right內(nèi)容,在打印預(yù)覽中看到的效果大概是這樣的:頁眉頁腳至于一些Excel特殊字符,比如說頁碼可以用&P,當(dāng)前日期可以用&D,其他的東西你就自己研究吧。本范例完整代碼請見NPOI.Examples中的CreateHeaderFooterInXls項目。2.2單元格操作2.2.1設(shè)置格式在Excel中我們經(jīng)常要設(shè)置格式,比如說日期格式(yyyymmdd)、小數(shù)點格式(1.20)、貨幣格式($2000)、百分比格式(99.99%)等等,這些東西在過去我們恐怕只能在服務(wù)器端生成好,不但增加了服務(wù)器端的代碼量,還造成了不必要的字符串替換操作,如今NPOI將讓服務(wù)器從這種完全沒有必要的操作中解放出來,一切都將由Excel在客戶端處理。使用NPOI時要注意,所有的格式都是通過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)建一個HSSFDataFormat實例,然后使用format.GetFormat來獲取相應(yīng)的格式,只要是Excel支持的格式表示方式,這種方式都能夠?qū)崿F(xiàn)。案例二保留2位小數(shù)假設(shè)我們有個單元格的值為1.2,怎么顯示成1.20呢?在Excel中可以用“0.00”來表示,所以下面的代碼就能完成: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()方法,之所以用這個,是因為0.00是Excel內(nèi)嵌的格式,完整的Excel內(nèi)嵌格式列表大家可以看這個窗口中的自定義列表:這里就不一一列出了。案例三貨幣格式貨幣格式在金融的項目中經(jīng)常用到,比如說人民幣符號¥,美元符號$等,這里可以用下面的代碼表示:123456HSSFCellcell2=sheet.CreateRow(1).CreateCell(0);cell2.SetCellValue(20000);HSSFCellStylecellStyle2=hssfworkbook.CreateCellStyle();HSSFDataFormatformat=hssfworkbook.CreateDataFormat();cellStyle2.DataFormat=format.GetFormat("¥#,##0");cell2.CellStyle=cellStyle2;注意,這里還加入了千分位分隔符,所以是#,##,至于為什么這么寫,你得去問微軟,呵呵。案例四百分比百分比在報表中也很常用,其實基本上和上面一樣,只是格式表示是0.00%,代碼如下:1cellStyle4.DataFormat=HSSFDataFormat.GetBuiltinFormat("0.00%");由于這里是內(nèi)嵌格式,所以直接用HSSFDataFormat.GetBuiltinFormat即可。案例五中文大寫在表示金額時,我們時常會用到,我也見過不少兄弟實現(xiàn)了數(shù)字轉(zhuǎn)中文大小寫的工具類,以后你可以嘗試讓Excel去處理這一切,代碼和剛才差不多,也是改格式的表示:12HSSFDataFormatformat=hssfworkbook.CreateDataFormat();cellStyle6.DataFormat=format.GetFormat("[DbNum2][$-804]0");由于是自定義格式,所以用了HSSFDataFormat.GetFormat,相信你對這兩種獲取格式的形式的區(qū)別越來越熟悉了。案例六科學(xué)計數(shù)法這東西數(shù)學(xué)課上我們都學(xué)過,雖然用的不多,但是既然Excel支持,這里也提一下:1cellStyle3.DataFormat=HSSFDataFormat.GetBuiltinFormat("0.00E+00");
下面展示下以上這些例子的顯示效果:最后總結(jié)一下HSSFDataFormat.GetFormat和HSSFDataFormat.GetBuiltinFormat的區(qū)別:當(dāng)使用Excel內(nèi)嵌的(或者說預(yù)定義)的格式時,直接用HSSFDataFormat.GetBuiltinFormat靜態(tài)方法即可。當(dāng)使用自己定義的格式時,必須先調(diào)用HSSFWorkbook.CreateDataFormat(),因為這時在底層會先找有沒有匹配的內(nèi)嵌FormatRecord,如果沒有就會新建一個FormatRecord,所以必須先調(diào)用這個方法,然后你就可以用獲得的HSSFDataFormat實例的GetFormat方法了,當(dāng)然相對而言這種方式比較麻煩,所以內(nèi)嵌格式還是用HSSFDataFormat.GetBuiltinFormat靜態(tài)方法更加直接一些。不過自定義的格式也不是天馬行空隨便定義,還是要參照Excel的格式表示來定義,具體請看相關(guān)的Excel教程。注意:自定義的FormatRecord是嵌入xls文件內(nèi)部的,所以不用擔(dān)心對方Excel中有沒有定義過這種格式,都是能夠正常使用的。相關(guān)范例請參考NPOI1.2正式版中的NumberFormatInXls項目。2.2.2單元格合并合并單元格在制作表格時很有用,比如說表格的標(biāo)題就經(jīng)常是把第一行的單元格合并居中。那么在NPOI中應(yīng)該如何實現(xiàn)單元格的合并呢?為了實現(xiàn)這一功能,NPOI引入了新的概念,即Region,因為合并單元格,其實就是設(shè)定一個區(qū)域。下面說一下Region類的參數(shù),Region總共有4個參數(shù),如下所示Region的參數(shù)說明FirstRow區(qū)域中第一個單元格的行號FirstColumn區(qū)域中第一個單元格的列號LastRow區(qū)域中最后一個單元格的行號LastColumn區(qū)域中最后一個單元格的列號由于單元格的合并都是在表的基礎(chǔ)上建立的,所以我們得先建Sheet:12HSSFWorkbookhssfworkbook=newHSSFWorkbook();HSSFSheetsheet=hssfworkbook.CreateSheet("newsheet");接下來我們根據(jù)實際場景來做一些演示。場景一標(biāo)題行的合并這種場景是最常見的,比如說我們要建立一張銷售情況表,英文叫SalesReport我們先設(shè)置居中和字體樣式,這里我們采用20號字體,代碼如下: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個單元格合并,然后添加合并區(qū)域:1sheet.AddMergedRegion(newRegion(0,0,0,5));
場景二多行合并看完場景一,你可不要認為多行合并就需要一行一行做,其實也只需要一行代碼,比如說我們要把C3:E5合并為一個單元格,那么就可以用下面的代碼:1sheet.AddMergedRegion(newRegion(2,2,4,4));提示即使你沒有用CreateRow和CreateCell創(chuàng)建過行或單元格,也完全可以直接創(chuàng)建區(qū)域然后把這一區(qū)域合并,Excel的區(qū)域合并信息是單獨存儲的,和RowRecord、ColumnInfoRecord不存在直接關(guān)系。相關(guān)范例請參考NPOI1.2正式版中的MergedCellInXls項目。2.2.3對齊相關(guān)設(shè)置本節(jié)將圍繞“對齊”選項卡中的設(shè)置展開,雖然實際上你會發(fā)現(xiàn)該選項卡中的很多設(shè)置和對齊沒有什么關(guān)系。首先我們用代碼創(chuàng)建必要的單元格,代碼如下:HSSFWorkbookhssfworkbook=newHSSFWorkbook();HSSFSheetsheet1=hssfworkbook.CreateSheet("Sheet1");HSSFRowrow=sheet1.CreateRow(0);row.CreateCell(0).SetCellValue("Test");這里我們假設(shè)在A0單元格中加入了文本Test。請注意接下來我們要做的所有操作都是在CellStyle的基礎(chǔ)上完成的,所以我們創(chuàng)建一個HSSFCellStyle:1HSSFCellStylestyle=hssfworkbook.CreateCellStyle();水平對齊這里用的是HSSFCellStyle.Alignment,默認值自然是常規(guī),即HSSFCellStyle.ALIGN_GENERAL。如果是左側(cè)對齊就是1style.Alignment=HSSFCellStyle.ALIGN_LEFT;如果是居中對齊就是1style.Alignment=HSSFCellStyle.ALIGN_CENTER;如果是右側(cè)對齊就是1style.Alignment=HSSFCellStyle.ALIGN_RIGHT;如果是跨列居中就是1style.Alignment=HSSFCellStyle.ALIGN_CENTER_SELECTION;如果是兩端對齊就是1style.Alignment=HSSFCellStyle.ALIGN_JUSTIFY;如果是填充就是1style.Alignment=HSSFCellStyle.ALIGN_FILL;注意:以上選項僅當(dāng)有足夠的寬度時才能產(chǎn)生效果,不設(shè)置寬度恐怕看不出區(qū)別。垂直對齊這里用的是HSSFCellStyle.VerticalAlignment,默認值為居中,即HSSFCellStyle.VERTICAL_CENTER如果是靠上就是1style.VerticalAlignment=HSSFCellStyle.VERTICAL_TOP如果是居中就是1style.VerticalAlignment=HSSFCellStyle.VERTICAL_CENTER如果是靠下就是1style.VerticalAlignment=HSSFCellStyle.VERTICAL_BOTTOM如果是兩端對齊就是1style.VerticalAlignment=HSSFCellStyle.VERTICAL_JUSTIFY注意:以上選項僅當(dāng)有足夠的高度時才能產(chǎn)生效果,不設(shè)置高度恐怕看不出區(qū)別。自動換行自動換行翻譯成英文其實就是Wrap的意思,所以這里我們應(yīng)該用WrapText屬性,這是一個布爾屬性1style.WrapText=true;效果如下所示:文本縮進這是一個不太引人注意的選項,所以這里給張圖出來,讓大家知道是什么,縮進說白了就是文本前面的空白,我們同樣可以用屬性來設(shè)置,這個屬性叫做Indention。1style.Indention=3;文本旋轉(zhuǎn)文本方向大家一定在Excel中設(shè)置過,上圖中就是調(diào)整界面,主要參數(shù)是度數(shù),那么我們?nèi)绾卧贜POI中設(shè)置呢?1style.Rotation=(short)90;以上代碼是把單元格A1中的文本逆時針旋轉(zhuǎn)90度,等同于下圖中的設(shè)置:請注意,這里的Rotation取值是從-90到90,而不是0-180度。最后別忘了把樣式變量style賦給HSSFCellStyle.CellStyle,否則就前功盡棄了,呵呵!以上的一些功能,比如文本旋轉(zhuǎn)和自動換行,使用傳統(tǒng)的cvs和html法恐怕是無法實現(xiàn)的。隨著學(xué)習(xí)的不斷深入,你將越來越意識到使用NPOI生成Excel其實如此簡單。相關(guān)范例請參考NPOI1.2正式版中的SetAlignmentInXls和RotateTextInXls。2.2.4使用邊框很多表格中都要使用邊框,本節(jié)將為你重點講解NPOI中邊框的設(shè)置和使用。邊框和其他單元格設(shè)置一樣也是在HSSFCellStyle上操作的,HSSFCellStyle有2種和邊框相關(guān)的屬性,分別是:邊框相關(guān)屬性說明范例Border+方向邊框類型BorderTop,BorderBottom,BorderLeft,BorderRight方向+BorderColor邊框顏色TopBorderColor,BottomBorderColor,LeftBorderColor,RightBorderColor其中邊框類型分為以下幾種:邊框范例圖對應(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è)置上,可以用下面的代碼: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;這段代碼使用了最普通的細邊框,使得這個單元格看上去像塊空心磚頭。注意:這里我們沒有設(shè)置邊框的顏色,但這不會影響最終的效果,因為Excel會用默認的黑色給邊框上色。如果要設(shè)置顏色的話,也很簡單,如下:style.BottomBorderColor=HSSFColor.GREEN.index;以上代碼將底部邊框設(shè)置為綠色,要注意,不是直接把HSSFColor.GREEN賦給XXXXBorderColor屬性,而是把index的值賦給它。2.2.5字體設(shè)置本節(jié)我們將繼續(xù)使用NPOI來設(shè)置單元格格式,這一節(jié)我們主要講如何設(shè)置“字體”。在設(shè)置字體之前,我們首先要做的就是創(chuàng)建字體對象,這和創(chuàng)建數(shù)字格式很相似。HSSFFontfont=hssfworkbook.CreateFont();這句話會在Excel文件內(nèi)部創(chuàng)建相應(yīng)的FontRecord,所以你不用客戶因為自己機器上的Excel沒有相應(yīng)的字體設(shè)置而導(dǎo)致設(shè)置丟失。字體在設(shè)置完成后,我們就可以把它賦給單元格樣式,代碼如下:HSSFCellStylestyle1=hssfworkbook.CreateCellStyle();style1.SetFont(font);cell1.CellStyle=style1;這里的cell1是HSSFCell的一個實例。好了,下面我們就開始對字體進行設(shè)置。字體名稱這里的字體名稱是通過HSSFFont.FontName進行設(shè)置的,至于具體的名稱,只要是常用字體都可以,比如說Arial,Verdana等,當(dāng)然也可以是中文字體名,如宋體、黑體等。不過設(shè)置字體名稱有個前提,那就是假設(shè)打開這個xls文件的客戶機上有這種字體,如果沒有,Excel將使用默認字體。下面就是設(shè)置字體名稱為“宋體”的代碼:font.FontName="宋體";字號與字號有關(guān)的屬性有兩個,一個是FontHeight,一個是FontHeightInPoints。區(qū)別在于,F(xiàn)ontHeight的值是FontHeightInPoints的20倍,通常我們在Excel界面中看到的字號,比如說12,對應(yīng)的是FontHeightInPoints的值,而FontHeight要產(chǎn)生12號字體的大小,值應(yīng)該是240。所以通常建議你用FontHeightInPoint屬性。如果要設(shè)置字號為12,代碼就是font.FontHeightInPoints=12;字體顏色這里可能會與CellStyle上的ForegroundColor和BackgroundColor產(chǎn)生混淆,其實所有的字體顏色都是在HSSFFont的實例上設(shè)置的,CellStyle的ForegroundColor和BackgroundColor分別指背景填充色和填充圖案的顏色,和文本顏色無關(guān)。要設(shè)置字體顏色,我們可以用HSSFFont.Color屬性,顏色可以通過HSSFColor獲得,代碼如下所示:font.Color=HSSFColor.RED.index;這行代碼把文本設(shè)置為紅色。下劃線通常我們所說的下劃線都是單線條的,其實Excel支持好幾種下劃線,如下所示:類型對應(yīng)的值單下劃線HSSFFont.U_SINGLE雙下劃線HSSFFont.U_DOUBLE會計用單下劃線HSSFFont.U_SINGLE_ACCOUNTING會計用雙下劃線HSSFFont.U_DOUBLE_ACCOUNTING無下劃線HSSFFont.U_NONE當(dāng)你要設(shè)置下劃線時,可以用HSSFFont.Underline屬性,這是一個byte類型的值,例如font.Underline=HSSFFont.U_SINGLE這行代碼就是設(shè)置單下劃線的代碼。上標(biāo)下標(biāo)設(shè)置這東西可以用HSSFFont.TypeOffset屬性,值有以下幾種:TypeOffset的值說明HSSFFont.SS_SUPER上標(biāo)HSSFFont.SS_SUB下標(biāo)HSSFFont.SS_NONE普通,默認值所以如果你要上標(biāo)的話,可以用下面的代碼:font.TypeOffset=HSSFFont.SS_SUPER;刪除線設(shè)置這東西可以用HSSFFont.IsStrikeout屬性,當(dāng)為true時,表示有刪除線;為false則表示沒有刪除線。相關(guān)范例請參考NPOI1.2正式版中的ApplyFontInXls的項目。2.2.6背景和紋理本節(jié)我們將用NPOI來為單元格添加背景和圖案。在之前的教程中,我們已經(jīng)提到HSSFCellStyle有兩個背景顏色屬性,一個叫FillBackgroundColor,另一個叫FillForegroundColor,但其實這指的都是背景顏色,那為什么還有ForegroundColor呢?為了能夠幫助大家理解,我們舉一個實際的例子,下面這個圖案是Excel的一個單元格:線是白色的,背景是紅色的。這里的線其實就是下面的Excel界面中的圖案:至于線的顏色則是圖案顏色,即白色。所以以上單元格如果要用NPOI來設(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則是背景的顏色,即紅色。下面羅列一下圖案樣式及其對應(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ān)范例請參考NPOI1.2正式版中的ColorfullMatrixTable和FillBackgroundInXls。2.2.7設(shè)置寬度和高度在Excel中,單元格的寬度其實就是列的寬度,因為Excel假設(shè)這一列的單元格的寬度肯定一致。所以要設(shè)置單元格的寬度,我們就得從列的寬度下手,HSSFSheet有個方法叫SetColumnWidth,共有兩個參數(shù):一個是列的索引(從0開始),一個是寬度?,F(xiàn)在假設(shè)你要設(shè)置B列的寬度,就可以用下面的代碼:123HSSFWorkbookhssfworkbook=newHSSFWorkbook();HSSFSheetsheet1=hssfworkbook.CreateSheet("Sheet1");sheet1.SetColumnWidth(1,100*256);這里你會發(fā)現(xiàn)一個有趣的現(xiàn)象,SetColumnWidth的第二個參數(shù)要乘以256,這是怎么回事呢?其實,這個參數(shù)的單位是1/256個字符寬度,也就是說,這里是把B列的寬度設(shè)置為了100個字符。剛才說的是如何設(shè)置,那如何去讀取一個列的寬度呢?直接用GetColumnWidth方法,這個方法只有一個參數(shù),那就是列的索引號。如下所示:1intcol1width=sheet1.GetColumnWidth(1);說完寬度,我們來說高度,在Excel中,每一行的高度也是要求一致的,所以設(shè)置單元格的高度,其實就是設(shè)置行的高度,所以相關(guān)的屬性也應(yīng)該在HSSFRow上,它就是HSSFRow.Height和HeightInPoints,這兩個屬性的區(qū)別在于HeightInPoints的單位是點,而Height的單位是1/20個點,所以Height的值永遠是HeightInPoints的20倍。要設(shè)置第一行的高度,可以用如下代碼:1sheet1.CreateRow(0).Height=200*20;或者1sheet1.CreateRow(0).HeightInPoints=200;如果要獲得某一行的行高,可以直接拿HSSFRow.Height屬性的返回值。你可能覺得一行一行設(shè)置行高或者一列一列設(shè)置列寬很麻煩,那你可以考慮使用HSSFSheet.DefaultColumnWidth、HSSFSheet.DefaultRowHeight和HSSFSheet.DefaultRowHeightInPoints屬性。一旦設(shè)置了這些屬性,如果某一行或者某一列沒有設(shè)置寬度,就會使用默認寬度或高度。代碼如下:12sheet1.DefaultColumnWidth=100*256;sheet1.DefaultRowHeight=30*20;相關(guān)范例請見NPOI1.2正式版中的SetWidthAndHeightInXls項目2.3使用Excel公式2.0可能有問題,需要安裝net3.5SP12.3.1基本計算從這節(jié)開始,我們將開始學(xué)習(xí)Excel高級一點的功能--公式。為某個單元格指定公式后,單元格中的類容將根據(jù)公式計算得出,如圖:圖中設(shè)置的是一個基本表達式”1+2*3”,單元格A1中將顯示此表達式計算的結(jié)果”7”,如圖所示。對應(yīng)的C#生成代碼也很簡單,如下: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也支持單元格引用類型的公式設(shè)置,如下圖中的C1=A1*B1。對應(yīng)的公式設(shè)置代碼為:cel3.SetCellFormula("A1*B1");是不是很簡單呢?但要注意,在利用NPOI寫程序時,行和列的計數(shù)都是從0開始計算的,但在設(shè)置公式時又是按照Excel的單元格命名規(guī)則來的。2.3.2SUM函數(shù)這節(jié)我們開始學(xué)習(xí)Excel中最常用的函數(shù)—Sum求和函數(shù)。首先,我們先看一上最簡單的Sum函數(shù):Sum(num1,num2,...)。使用效果如圖圖中的E1=Sum(A1,C1)表示將A1與C1的和填充在E1處,與公式”E1=A1+C1”等效。對應(yīng)的生成代碼與上一節(jié)中的基本計算公式類似: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)然,把每一個單元格作為Sum函數(shù)的參數(shù)很容易理解,但如果要求和的單元格很多,那么公式就會很長,既不方便閱讀也不方便書寫。所以Excel提供了另外一種多個單元格求和的寫法:如上圖中的“Sum(A1:C1)”表示求從A1到C1所有單元格的和,相當(dāng)于A1+B1+C1。對應(yīng)的代碼為:celSum1.SetCellFormula("sum(A1:C1)");最后,還有一種求和的方法。就是先定義一個區(qū)域,如”range1”,然后再設(shè)置Sum(range1),此時將計算區(qū)域中所有單元格的和。定義區(qū)域的代碼為:HSSFName
range
=
hssfworkbook.CreateName();
range.Reference
=
"Sheet1!$A1:$C1";
range.NameName
=
"range1";執(zhí)行此代碼后的Excel文件將在的公式菜單下的名稱管理器(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隨機數(shù)函數(shù)2.3.9通過NPOI獲得公式的返回值2.4創(chuàng)建圖形2.4.1畫線2.4.2畫矩形2.4.3畫圓形2.4.4畫Grid2.4.5插入圖片2.5打印相關(guān)設(shè)置打印設(shè)置主要包括方向設(shè)置、縮放、紙張設(shè)置、頁邊距等。NPOI1.2支持大部分打印屬性,能夠讓你輕松滿足客戶的打印需要。首先是方向設(shè)置,Excel支持兩種頁面方向,即縱向和橫向。在NPOI中如何設(shè)置呢?你可以通過HSSFSheet.PrintSetup.Landscape來設(shè)置,Landscape是布爾類型的,在英語中是橫向的意思。如果Landscape等于true,則表示頁面方向為橫向;否則為縱向。接著是縮放設(shè)置,這里的縮放比例對應(yīng)于HSSFSheet.PrintSetup.Scale,而頁寬和頁高分別對應(yīng)于HSSFSheet.PrintSetup.FitWidth和HSSFSheet.PrintSetup.FitHeight。要注意的是,這里的PrintSetup.Scale應(yīng)該被設(shè)置為0-100之間的值,而不是小數(shù)。接下來就是紙張設(shè)置了,對應(yīng)于HSSFSheet.PrintSetup.PaperSize,但這里的PaperSize并不是隨便設(shè)置的,而是由一些固定的值決定的,具體的值與對應(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的常量,但都是非常常用的紙張大小,如果滿足不了你的需要,可以根據(jù)上表自己給PaperSize屬性賦值。所以,如果你要設(shè)置紙張大小可以用這樣的代碼:HSSFSheet.PrintSetup.PaperSize=HSSFSheet.A4_PAPERSIZE;或HSSFSheet.PrintSetup.PaperSize=9;(A4210*297mm)再下來就是打印的起始頁碼,它對應(yīng)于HSSFSheet.PrintSetup.PageStart和HSSFSheet.PrintSetup.UsePage,如果UsePage=false,那么就相當(dāng)于“自動”,這時PageStart不起作用;如果UsePage=true,PageStart才會起作用。所以在設(shè)置PageStart之前,必須先把UsePage設(shè)置為true。“打印”欄中的“網(wǎng)格線”設(shè)置對應(yīng)于HSSFSheet.IsPrintGridlines,請注意,這里不是HSSFSheet.PrintSetup下面,所以別搞混了。這里之所以不隸屬于PrintSetup是由底層存儲該信息的record決定的,底層是把IsGridsPrinted放在GridsetRecord里面的,而不是PrintSetupRecord里面的,盡管界面上是放在一起的。另外還有一個HSSFSheet.IsGridsPrinted屬性,這個屬性對應(yīng)于底層的gridsetRecord,但這個record是保留的,從微軟的文檔顯示沒有任何意義,所以這個屬性請不要去設(shè)置。“單色打印”則對應(yīng)于HSSFSheet.PrintSetup.NoColors,這是布爾類型的,值為true時,表示單色打印?!安莞迤焚|(zhì)”對應(yīng)于HSSFSheet.PrintSetup.IsDraft,也是布爾類型的,值為true時,表示用草稿品質(zhì)打印。這里的打印順序是由HSSFSheet.PrintSetup.LeftToRight決定的,它是布爾類型的,當(dāng)為true時,則表示“先行后列”;如果是false,則表示“先列后行”。在NPOI1.2中,“行號列標(biāo)”、“批注”和“錯誤單元格打印為”、“頁邊距”暫不支持,將在以后的版本中支持。有關(guān)打印的范例可以參考NPOI1.2正式版中的SetPrintSettingsInXls項目。2.6高級功能2.6.1調(diào)整表單顯示比例在Excel中,可以通過調(diào)整右下角的滾動條來調(diào)整Sheet的顯示比例。如圖:在NPOI中,也能通過代碼實現(xià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有兩個參數(shù)。其中第一個參數(shù)表示縮放比例的分子,第二個參數(shù)表示縮放比例的分母,所以SetZoom(1,2)就表示縮小到1/2,也就是50%。代碼執(zhí)行后生成的Excel樣式如下:如果將SetZoom的參數(shù)改成(2,1),代碼執(zhí)行后生成的Excel樣式如下,表示擴大兩倍:2.6.2設(shè)置密碼有時,我們可能需要某些單元格只讀,如在做模板時,模板中的數(shù)據(jù)是不能隨意讓別人改的。在Excel中,可以通過“審閱->保護工作表”來完成,如下圖:那么,在NPOI中有沒有辦法通過編碼的方式達到這一效果呢?答案是肯定的。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("沒被鎖定");
cel1.CellStyle
=
unlocked;
cel2.SetCellValue("被鎖定");
cel2.CellStyle
=
locked;
sheet1.ProtectSheet("password");正如代碼中所看到的,我們通過設(shè)置CellStype的ISLocked為True,表示此單元格將被鎖定。相當(dāng)于在Excel中執(zhí)行了如下操作:然后通過ProtectSheet設(shè)置密碼。執(zhí)行結(jié)果如下:沒被鎖定的列可以任意修改。被鎖定的列不能修改。輸入密碼可以解除鎖定。2.6.3組合行、列Excel2007中有一個面板是專門用于設(shè)置組合功能的,叫做“分級顯示”面板,如下所示:可能我們在過去生成Excel文件的時候根本不會用這個功能,也沒辦法用,因為cvs法和html法沒辦法控制這些東西。這里簡單的介紹一下什么叫做組合:組合分為行組合和列組合,所謂行組合,就是讓n行組合成一個集合,能夠進行展開和合攏操作,在Excel中顯示如下:圖中左側(cè)就是用于控制行組合折疊的圖標(biāo),圖中上部就是用于控制列組合的,是不是有點像TreeView中的折疊節(jié)點?很多時候由于數(shù)據(jù)太多,為了讓用戶對于大量數(shù)據(jù)一目了然,我們可以使用行列組合來解決顯示大綱,這和VisualStudio里面的region的概念是類似的。細心的朋友可能已經(jīng)注意到了,我們其實可以對一行做多次組合操作,這就是分級顯示的概念,圖中就把行2-3分為2個組合,第2行到第4行為一個組合,第2行到第5行一個組合,所以是分兩級。在NPOI中,要實現(xiàn)分組其實并不難,你只需要調(diào)用HSSFSheet.GroupRow和HSSFSheet.GroupColumn這兩個方法就可以了。首先我們來看HSSFSheet.GroupRow,GroupRow有2個參數(shù),分別是fro
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年新高考高中新教材文言文基礎(chǔ)考點梳理 古代文化常識-衣食住行及度量衡 專項練習(xí)(附答案解析)
- 二零二五年水產(chǎn)品買賣合同范本2篇
- 軋機課程設(shè)計總結(jié)
- 2024年心理咨詢師題庫附完整答案【奪冠】
- 2024年股權(quán)轉(zhuǎn)讓補充協(xié)議版
- 2025年物流公司危險品貨物運輸安全協(xié)議3篇
- 課程設(shè)計英文翻譯版
- 2025年度智能停車場管理系統(tǒng)建設(shè)與運營協(xié)議3篇
- 二零二五版苗木種植項目資金支持與技術(shù)服務(wù)協(xié)議4篇
- 2025年石油化工專用儲油罐銷售合同4篇
- 人教版(2024)七年級英語上冊++單詞默寫-艾賓浩斯記憶法-上
- Python快速編程入門(第2版)完整全套教學(xué)課件
- 污水處理設(shè)施設(shè)備升級改造項目資金申請報告-超長期特別國債投資專項
- 簡易勞務(wù)承包合同范本
- 檢驗員績效考核
- 農(nóng)藥合成研發(fā)項目流程
- 機電安裝工程安全管理
- 2024年上海市第二十七屆初中物理競賽初賽試題及答案
- 信息技術(shù)部年終述職報告總結(jié)
- 理光投影機pj k360功能介紹
- 八年級數(shù)學(xué)下冊《第十九章 一次函數(shù)》單元檢測卷帶答案-人教版
評論
0/150
提交評論