POI的常规使用
POI使用實例
一 、 簡介
二、 常用包、 類 、 方法介紹
三、 基礎實例
類名 說明HSSFWorkbook Excel的文檔對象HSSFSheet Excel的表單HSSFRow Excel的行HSSFCell Excel的格子單元HSSFFont Excel字體 HSSFDataFormat 格子單元的日期格式HSSFHeader Excel文檔Sheet的頁眉HSSFFooter Excel文檔Sheet的頁腳HSSFCellStyle 格子單元樣式HSSFDateUtil 日期HSSFPrintSetup 打印HSSFErrorConstants 錯誤信息表2.Excel的基本操作(1)創建Workbook和Sheetpublic class Test00 { public static void main(String[] args) throws IOException { String filePath=”d:\users\lizw\桌面\POI\sample.xls”;//文件路徑 HSSFWorkbook workbook = new HSSFWorkbook();//創建Excel文件(Workbook) HSSFSheet sheet = workbook.createSheet();//創建工作表(Sheet) sheet = workbook.createSheet(“Test”);//創建工作表(Sheet) FileOutputStream out = new FileOutputStream(filePath); workbook.write(out);//保存Excel文件 out.close();//關閉文件流 System.out.println(“OK!”); } } (2)創建單元格HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFRow row = sheet.createRow(0);// 創建行,從0開始 HSSFCell cell = row.createCell(0);// 創建行的單元格,也是從0開始 cell.setCellValue(“李志偉”);// 設置單元格內容 row.createCell(1).setCellValue(false);// 設置單元格內容,重載 row.createCell(2).setCellValue(new Date());// 設置單元格內容,重載 row.createCell(3).setCellValue(12.345);// 設置單元格內容,重載(3)創建文檔摘要信息workbook.createInformationProperties();//創建文檔信息 DocumentSummaryInformation dsi= workbook.getDocumentSummaryInformation();//摘要信息 dsi.setCategory(“類別:Excel文件”);//類別 dsi.setManager(“管理者:李志偉”);//管理者 dsi.setCompany(“公司:–”);//公司 SummaryInformation si = workbook.getSummaryInformation();//摘要信息 si.setSubject(“主題:–”);//主題 si.setTitle(“標題:測試文檔”);//標題 si.setAuthor(“作者:李志偉”);//作者 si.setComments(“備注:POI測試文檔”);//備注(4)創建批注HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFPatriarch patr = sheet.createDrawingPatriarch(); HSSFClientAnchor anchor = patr.createAnchor(0, 0, 0, 0, 5, 1, 8, 3);//創建批注位置 HSSFComment comment = patr.createCellComment(anchor);//創建批注 comment.setString(new HSSFRichTextString(“這是一個批注段落!”));//設置批注內容 comment.setAuthor(“李志偉”);//設置批注作者 comment.setVisible(true);//設置批注默認顯示 HSSFCell cell = sheet.createRow(2).createCell(1); cell.setCellValue(“測試”); cell.setCellComment(comment);//把批注賦值給單元格創建批注位置HSSFPatriarch.createAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2)方法參數說明:12dx1 第1個單元格中x軸的偏移量 dy1 第1個單元格中y軸的偏移量 dx2 第2個單元格中x軸的偏移量 dy2 第2個單元格中y軸的偏移量 col1 第1個單元格的列號 row1 第1個單元格的行號 col2 第2個單元格的列號 row2 第2個單元格的行號 (5)創建頁眉和頁腳HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFHeader header =sheet.getHeader();//得到頁眉 header.setLeft(“頁眉左邊”); header.setRight(“頁眉右邊”); header.setCenter(“頁眉中間”); HSSFFooter footer =sheet.getFooter();//得到頁腳 footer.setLeft(“頁腳左邊”); footer.setRight(“頁腳右邊”); footer.setCenter(“頁腳中間”);也可以使用Office自帶的標簽定義,你可以通過HSSFHeader或HSSFFooter訪問到它們,都是靜態屬性,列表如下:12HSSFHeader.tab &A 表名 HSSFHeader.file &F 文件名 HSSFHeader.startBold &B 粗體開始 HSSFHeader.endBold &B 粗體結束 HSSFHeader.startUnderline &U 下劃線開始 HSSFHeader.endUnderline &U 下劃線結束 HSSFHeader.startDoubleUnderline &E 雙下劃線開始 HSSFHeader.endDoubleUnderline &E 雙下劃線結束 HSSFHeader.time &T 時間 HSSFHeader.date &D 日期 HSSFHeader.numPages &N 總頁面數 HSSFHeader.page &P 當前頁號 3.Excel的單元格操作(1)設置格式HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFRow row=sheet.createRow(0); //設置日期格式–使用Excel內嵌的格式 HSSFCell cell=row.createCell(0); cell.setCellValue(new Date()); HSSFCellStyle style=workbook.createCellStyle(); style.setDataFormat(HSSFDataFormat.getBuiltinFormat(“m/d/yy h:mm”)); cell.setCellStyle(style); //設置保留2位小數–使用Excel內嵌的格式 cell=row.createCell(1); cell.setCellValue(12.3456789); style=workbook.createCellStyle(); style.setDataFormat(HSSFDataFormat.getBuiltinFormat(“0.00”)); cell.setCellStyle(style); //設置貨幣格式–使用自定義的格式 cell=row.createCell(2); cell.setCellValue(12345.6789); style=workbook.createCellStyle(); style.setDataFormat(workbook.createDataFormat().getFormat(“¥#,##0”)); cell.setCellStyle(style); //設置百分比格式–使用自定義的格式 cell=row.createCell(3); cell.setCellValue(0.123456789); style=workbook.createCellStyle(); style.setDataFormat(workbook.createDataFormat().getFormat(“0.00%”)); cell.setCellStyle(style); //設置中文大寫格式–使用自定義的格式 cell=row.createCell(4); cell.setCellValue(12345); style=workbook.createCellStyle(); style.setDataFormat(workbook.createDataFormat().getFormat(“[DbNum2][$-804]0”)); cell.setCellStyle(style); //設置科學計數法格式–使用自定義的格式 cell=row.createCell(5); cell.setCellValue(12345); style=workbook.createCellStyle(); style.setDataFormat(workbook.createDataFormat().getFormat(“0.00E+00”)); cell.setCellStyle(style);HSSFDataFormat.getFormat和HSSFDataFormat.getBuiltinFormat的區別: 當使用Excel內嵌的(或者說預定義)的格式時,直接用HSSFDataFormat.getBuiltinFormat靜態方法即可。當使用自己定義的格式時,必須先調用HSSFWorkbook.createDataFormat(),因為這時在底層會先找有沒有匹配的內嵌FormatRecord,如果沒有就會新建一個FormatRecord,所以必須先調用這個方法,然后你就可以用獲得的HSSFDataFormat實例的getFormat方法了,當然相對而言這種方式比較麻煩,所以內嵌格式還是用HSSFDataFormat.getBuiltinFormat靜態方法更加直接一些。12(2)合并單元格HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFRow row=sheet.createRow(0); //合并列 HSSFCell cell=row.createCell(0); cell.setCellValue(“合并列”); CellRangeAddress region=new CellRangeAddress(0, 0, 0, 5); sheet.addMergedRegion(region); //合并行 cell=row.createCell(6); cell.setCellValue(“合并行”); region=new CellRangeAddress(0, 5, 6, 6); sheet.addMergedRegion(region);CellRangeAddress對象其實就是表示一個區域,其構造方法如下:CellRangeAddress(firstRow, lastRow, firstCol, lastCol),參數的說明:12firstRow 區域中第一個單元格的行號 lastRow 區域中最后一個單元格的行號 firstCol 區域中第一個單元格的列號 lastCol 區域中最后一個單元格的列號 提示: 即使你沒有用CreateRow和CreateCell創建過行或單元格,也完全可以直接創建區域然后把這一區域合并,Excel的區域合并信息是單獨存儲的,和RowRecord、ColumnInfoRecord不存在直接關系。(3)單元格對齊HSSFCell cell=row.createCell(0); cell.setCellValue(“單元格對齊”); HSSFCellStyle style=workbook.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中 style.setWrapText(true);//自動換行 style.setIndention((short)5);//縮進 style.setRotation((short)60);//文本旋轉,這里的取值是從-90到90,而不是0-180度。 cell.setCellStyle(style);水平對齊相關參數12如果是左側對齊就是 HSSFCellStyle.ALIGN_FILL; 如果是居中對齊就是 HSSFCellStyle.ALIGN_CENTER; 如果是右側對齊就是 HSSFCellStyle.ALIGN_RIGHT; 如果是跨列舉中就是 HSSFCellStyle.ALIGN_CENTER_SELECTION; 如果是兩端對齊就是 HSSFCellStyle.ALIGN_JUSTIFY; 如果是填充就是 HSSFCellStyle.ALIGN_FILL; 垂直對齊相關參數如果是靠上就是 HSSFCellStyle.VERTICAL_TOP; 如果是居中就是 HSSFCellStyle.VERTICAL_CENTER; 如果是靠下就是 HSSFCellStyle.VERTICAL_BOTTOM; 如果是兩端對齊就是 HSSFCellStyle.VERTICAL_JUSTIFY; (4)使用邊框邊框和其他單元格設置一樣也是調用CellStyle接口,CellStyle有2種和邊框相關的屬性,分別是:12邊框相關屬性說明范例Border+ 方向邊框類型BorderLeft, BorderRight 等方向 +BorderColor邊框顏色TopBorderColor,BottomBorderColor 等HSSFCell cell=row.createCell(1); cell.setCellValue(“設置邊框”); HSSFCellStyle style=workbook.createCellStyle(); style.setBorderTop(HSSFCellStyle.BORDER_DOTTED);//上邊框 style.setBorderBottom(HSSFCellStyle.BORDER_THICK);//下邊框 style.setBorderLeft(HSSFCellStyle.BORDER_DOUBLE);//左邊框 style.setBorderRight(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);//右邊框 style.setTopBorderColor(HSSFColor.RED.index);//上邊框顏色 style.setBottomBorderColor(HSSFColor.BLUE.index);//下邊框顏色 style.setLeftBorderColor(HSSFColor.GREEN.index);//左邊框顏色 style.setRightBorderColor(HSSFColor.PINK.index);//右邊框顏色 cell.setCellStyle(style);其中邊框類型分為以下幾種:12邊框范例圖對應的靜態值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(5)設置字體HSSFCell cell = row.createCell(1); cell.setCellValue(“設置字體”); HSSFCellStyle style = workbook.createCellStyle(); HSSFFont font = workbook.createFont(); font.setFontName(“華文行楷”);//設置字體名稱 font.setFontHeightInPoints((short)28);//設置字號 font.setColor(HSSFColor.RED.index);//設置字體顏色 font.setUnderline(FontFormatting.U_SINGLE);//設置下劃線 font.setTypeOffset(FontFormatting.SS_SUPER);//設置上標下標 font.setStrikeout(true);//設置刪除線 style.setFont(font); cell.setCellStyle(style);下劃線選項值:單下劃線 FontFormatting.U_SINGLE雙下劃線 FontFormatting.U_DOUBLE會計用單下劃線 FontFormatting.U_SINGLE_ACCOUNTING會計用雙下劃線 FontFormatting.U_DOUBLE_ACCOUNTING無下劃線 FontFormatting.U_NONE上標下標選項值:12上標 FontFormatting.SS_SUPER下標 FontFormatting.SS_SUB普通,默認值 FontFormatting.SS_NONE(6)背景和紋理HSSFCellStyle style = workbook.createCellStyle(); style.setFillForegroundColor(HSSFColor.GREEN.index);//設置圖案顏色 style.setFillBackgroundColor(HSSFColor.RED.index);//設置圖案背景色 style.setFillPattern(HSSFCellStyle.SQUARES);//設置圖案樣式 cell.setCellStyle(style);圖案樣式及其對應的值:12圖案樣式常量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(7)設置寬度和高度HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFRow row = sheet.createRow(1); HSSFCell cell = row.createCell(1); cell.setCellValue(“123456789012345678901234567890”); sheet.setColumnWidth(1, 31 * 256);//設置第一列的寬度是31個字符寬度 row.setHeightInPoints(50);//設置行的高度是50個點這里你會發現一個有趣的現象,setColumnWidth的第二個參數要乘以256,這是怎么回事呢?其實,這個參數的單位是1/256個字符寬度,也就是說,這里是把B列的寬度設置為了31個字符。設置行高使用HSSFRow對象的setHeight和setHeightInPoints方法,這兩個方法的區別在于setHeightInPoints的單位是點,而setHeight的單位是1/20個點,所以setHeight的值永遠是setHeightInPoints的20倍。你也可以使用HSSFSheet.setDefaultColumnWidth、HSSFSheet.setDefaultRowHeight和HSSFSheet.setDefaultRowHeightInPoints方法設置默認的列寬或行高。123456(8)判斷單元格是否為日期判斷單元格是否為日期類型,使用DateUtil.isCellDateFormatted(cell)方法,例如:12HSSFCell cell = row.createCell(1); cell.setCellValue(new Date());//設置日期數據 System.out.println(DateUtil.isCellDateFormatted(cell));//輸出:false HSSFCellStyle style =workbook.createCellStyle(); style.setDataFormat(HSSFDataFormat.getBuiltinFormat(“m/d/yy h:mm”)); cell.setCellStyle(style);//設置日期樣式 System.out.println(DateUtil.isCellDateFormatted(cell));//輸出:true 4.使用Excel公式(1)基本計算HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFRow row = sheet.createRow(0); HSSFCell cell = row.createCell(0); cell.setCellFormula(“2+3*4”);//設置公式 cell = row.createCell(1); cell.setCellValue(10); cell = row.createCell(2); cell.setCellFormula(“A1*B1”);//設置公式(2)SUM函數HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFRow row = sheet.createRow(0); row.createCell(0).setCellValue(1); row.createCell(1).setCellValue(2); row.createCell(2).setCellValue(3); row.createCell(3).setCellValue(4); row.createCell(4).setCellValue(5); row = sheet.createRow(1); row.createCell(0).setCellFormula(“sum(A1,C1)”);//等價于”A1+C1” row.createCell(1).setCellFormula(“sum(B1:D1)”);//等價于”B1+C1+D1”(3)日期函數HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFCellStyle style=workbook.createCellStyle(); style.setDataFormat(workbook.createDataFormat().getFormat(“yyyy-mm-dd”)); HSSFRow row = sheet.createRow(0); Calendar date=Calendar.getInstance();//日歷對象 HSSFCell cell=row.createCell(0); date.set(2011,2, 7); cell.setCellValue(date.getTime()); cell.setCellStyle(style);//第一個單元格開始時間設置完成 cell=row.createCell(1); date.set(2014,4, 25); cell.setCellValue(date.getTime()); cell.setCellStyle(style);//第一個單元格結束時間設置完成 cell=row.createCell(3); cell.setCellFormula(“CONCATENATE(DATEDIF(A1,B1,\”y\”),\”年\”)”); cell=row.createCell(4); cell.setCellFormula(“CONCATENATE(DATEDIF(A1,B1,\”m\”),\”月\”)”); cell=row.createCell(5); cell.setCellFormula(“CONCATENATE(DATEDIF(A1,B1,\”d\”),\”日\”)”);以上代碼中的公式說明:DATEDIF(A1,B1,\"y\") :取得 A1 單元格的日期與 B1 單元格的日期的時間間隔。 ( “ y ” : 表示以年為單位 , ” m ”表示以月為單位 ; ” d ”表示以天為單位 ) 。CONCATENATE( str1,str2, … ) :連接字符串。更多 Excel 的日期函數可參考: http://tonyqus.sinaapp.com/archives/28612345(4)字符串相關函數HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFRow row = sheet.createRow(0); row.createCell(0).setCellValue(“abcdefg”); row.createCell(1).setCellValue(“aa bb cc dd ee fF GG”); row.createCell(3).setCellFormula(“UPPER(A1)”); row.createCell(4).setCellFormula(“PROPER(B1)”);以上代碼中的公式說明:UPPER( String ) :將文本轉換成大寫形式。PROPER( String ) :將文字串的首字母及任何非字母字符之后的首字母轉換成大寫。將其余的字母轉換成小寫。更多 Excel 的字符串函數可參考: http://tonyqus.sinaapp.com/archives/28912345(5)IF函數HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFRow row = sheet.createRow(0); row.createCell(0).setCellValue(12); row.createCell(1).setCellValue(23); row.createCell(3).setCellFormula(“IF(A1>B1,\”A1大于B1\”,\”A1小于等于B1\”)”);以上代碼中的公式說明:IF(logical_test,value_if_true,value_if_false)用來用作邏輯判斷。其中Logical_test表示計算結果為 TRUE 或 FALSE 的任意值或表達式 ; value_if_true表示當表達式Logical_test的值為TRUE時的返回值;value_if_false表示當表達式Logical_test的值為FALSE時的返回值。1234(6)CountIf和SumIf函數HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFRow row = sheet.createRow(0); row.createCell(0).setCellValue(57); row.createCell(1).setCellValue(89); row.createCell(2).setCellValue(56); row.createCell(3).setCellValue(67); row.createCell(4).setCellValue(60); row.createCell(5).setCellValue(73); row.createCell(7).setCellFormula(“COUNTIF(A1:F1,\”>=60\”)”); row.createCell(8).setCellFormula(“SUMIF(A1:F1,\”>=60\”,A1:F1)”);以上代碼中的公式說明:COUNTIF(range,criteria):滿足某條件的計數的函數。參數range:需要進行讀數的計數;參數criteria:條件表達式,只有當滿足此條件時才進行計數。SumIF(criteria_range, criteria,sum_range):用于統計某區域內滿足某條件的值的求和。參數criteria_range:條件測試區域,第二個參數Criteria中的條件將與此區域中的值進行比較;參數criteria:條件測試值,滿足條件的對應的sum_range項將進行求和計算;參數sum_range:匯總數據所在區域,求和時會排除掉不滿足Criteria條件的對應的項。123456(7)Lookup函數HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFRow row = sheet.createRow(0); row.createCell(0).setCellValue(0); row.createCell(1).setCellValue(59); row.createCell(2).setCellValue(“不及格”); row = sheet.createRow(1); row.createCell(0).setCellValue(60); row.createCell(1).setCellValue(69); row.createCell(2).setCellValue(“及格”); row = sheet.createRow(2); row.createCell(0).setCellValue(70); row.createCell(1).setCellValue(79); row.createCell(2).setCellValue(“良好”); row = sheet.createRow(3); row.createCell(0).setCellValue(80); row.createCell(1).setCellValue(100); row.createCell(2).setCellValue(“優秀”); row = sheet.createRow(4); row.createCell(0).setCellValue(75); row.createCell(1).setCellFormula(“LOOKUP(A5,A1:A4,C1:C4)”); row.createCell(2).setCellFormula(“VLOOKUP(A5,A1:C4,3,true)”);以上代碼中的公式說明:LOOKUP(lookup_value,lookup_vector,result_vector) ,第一個參數:需要查找的內容,本例中指向 A5 單元格,也就是 75 ;第二個參數:比較對象區域,本例中的成績需要與 $A$1:$A$4 中的各單元格中的值進行比較;第三個參數:查找結果區域,如果匹配到會將此區域中對應的數據返回。如本例中返回 $C$1:$C$4 中對應的值。12可能有人會問,字典中沒有 75 對應的成績啊,那么 Excel 中怎么匹配的呢?答案是模糊匹配,并且 LOOKUP 函數只支持模糊匹配。 Excel 會在 A1:A4 中找小于 75 的最大值,也就是 A3 對應的 70 ,然后將對應的 C1:C4 區域中的 C3 中的值返回,這就是最終結果“良好”的由來。VLOOKUP(lookup_value,lookup_area,result_col,is_fuzzy ) ,第一個參數:需要查找的內容,這里是 A5 單元格;第二個參數:需要比較的表,這里是 $A$1:$C$4 ,注意 VLOOKUP 匹配時只與表中的第一列進行匹配。第三個參數:匹配結果對應的列序號。這里要對應的是成績列,所以為 3 。第四個參數:指明是否模糊匹配。例子中的 TRUE 表示模糊匹配,與上例中一樣。匹配到的是第三行。如果將此參數改為 FALSE ,因為在表中的第 1 列中找不到 75 ,所以會報“ #N/A ”的計算錯誤。12另外,還有與 VLOKUP 類似的 HLOOKUP 。不同的是 VLOOKUP 用于在表格或數值數組的首列查找指定的數值,并由此返回表格或數組當前行中指定列處的數值。而 HLOOKUP 用于在表格或數值數組的首行查找指定的數值,并由此返回表格或數組當前列中指定行處的數值。讀者可以自已去嘗試。(8)隨機數函數HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFRow row = sheet.createRow(0); row.createCell(0).setCellFormula(“RAND()”);//取0-1之間的隨機數 row.createCell(1).setCellFormula(“int(RAND()*100)”);//取0-100之間的隨機整數 row.createCell(2).setCellFormula(“rand()*10+10”);//取10-20之間的隨機實數 row.createCell(3).setCellFormula(“CHAR(INT(RAND()*26)+97)”);//隨機小寫字母 row.createCell(4).setCellFormula(“CHAR(INT(RAND()*26)+65)”);//隨機大寫字母 //隨機大小寫字母 row.createCell(5).setCellFormula(“CHAR(INT(RAND()*26)+if(INT(RAND()*2)=0,97,65))”);以上代碼中的公式說明:上面幾例中除了用到RAND函數以外,還用到了CHAR函數用來將ASCII碼換為字母,INT函數用來取整。值得注意的是INT函數不會四舍五入,無論小數點后是多少都會被舍去。1234(9)獲得公式的返回值HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFRow row = sheet.createRow(0); row.createCell(0).setCellValue(7);//A1 row.createCell(1).setCellValue(8);//B1 HSSFCell cell=row.createCell(2); cell.setCellFormula(“A1*B1+14”); HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(workbook); cell = e.evaluateInCell(cell);//若Excel文件不是POI創建的,則不必調用此方法 System.out.println(“公式計算結果:”+cell.getNumericCellValue());5.使用圖形(1)畫線HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFPatriarch patriarch=sheet.createDrawingPatriarch(); HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short)1, 0,(short)4, 4); HSSFSimpleShape line = patriarch.createSimpleShape(anchor); line.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);//設置圖形類型 line.setLineStyle(HSSFShape.LINESTYLE_SOLID);//設置圖形樣式 line.setLineWidth(6350);//在POI中線的寬度12700表示1pt,所以這里是0.5pt粗的線條。通常,利用POI畫圖主要有以下幾個步驟:1. 創建一個Patriarch(注意,一個sheet中通常只創建一個Patriarch對象);2. 創建一個Anchor,以確定圖形的位置;3. 調用Patriarch創建圖形;4. 設置圖形類型(直線,矩形,圓形等)及樣式(顏色,粗細等)。關于HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2)的參數,有必要在這里說明一下:dx1:起始單元格的x偏移量,如例子中的0表示直線起始位置距B1單元格左側的距離;dy1:起始單元格的y偏移量,如例子中的0表示直線起始位置距B1單元格上側的距離;dx2:終止單元格的x偏移量,如例子中的0表示直線起始位置距E5單元格左側的距離;dy2:終止單元格的y偏移量,如例子中的0表示直線起始位置距E5單元格上側的距離;col1:起始單元格列序號,從0開始計算;row1:起始單元格行序號,從0開始計算,如例子中col1=1,row1=0就表示起始單元格為B1;col2:終止單元格列序號,從0開始計算;row2:終止單元格行序號,從0開始計算,如例子中col2=4,row2=4就表示起始單元格為E5;最后,關于LineStyle屬性,有如下一些可選值,對應的效果分別如圖所示:123456789101112131415161718192021222324252627282930(2)畫矩形HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFPatriarch patriarch=sheet.createDrawingPatriarch(); HSSFClientAnchor anchor = new HSSFClientAnchor(255,122, 255, 122, (short)1, 0,(short)4, 3); HSSFSimpleShape rec = patriarch.createSimpleShape(anchor); rec.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE); rec.setLineStyle(HSSFShape.LINESTYLE_DASHGEL);//設置邊框樣式 rec.setFillColor(255, 0, 0);//設置填充色 rec.setLineWidth(25400);//設置邊框寬度 rec.setLineStyleColor(0, 0, 255);//設置邊框顏色(3)畫圓形更改上例的代碼如下:rec.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);//設置圖片類型1234(4)畫Grid在POI中,本身沒有畫Grid(網格)的方法。但我們知道Grid其實就是由橫線和豎線構成的,所在我們可以通過畫線的方式來模擬畫Grid。代碼如下:12HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) HSSFRow row = sheet.createRow(2); row.createCell(1); row.setHeightInPoints(240); sheet.setColumnWidth(2, 9000); int linesCount = 20; HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); //因為HSSFClientAnchor中dx只能在0-1023之間,dy只能在0-255之間,這里采用比例的方式 double xRatio = 1023.0 / (linesCount * 10); double yRatio = 255.0 / (linesCount * 10); // 畫豎線 int x1 = 0; int y1 = 0; int x2 = 0; int y2 = 200; for (int i = 0; i < linesCount; i++) { HSSFClientAnchor a2 = new HSSFClientAnchor(); a2.setAnchor((short) 2, 2, (int) (x1 * xRatio), (int) (y1 * yRatio), (short) 2, 2, (int) (x2 * xRatio), (int) (y2 * yRatio)); HSSFSimpleShape shape2 = patriarch.createSimpleShape(a2); shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); x1 += 10; x2 += 10; } // 畫橫線 x1 = 0; y1 = 0; x2 = 200; y2 = 0; for (int i = 0; i < linesCount; i++) { HSSFClientAnchor a2 = new HSSFClientAnchor(); a2.setAnchor((short) 2, 2, (int) (x1 * xRatio), (int) (y1 * yRatio), (short) 2, 2, (int) (x2 * xRatio), (int) (y2 * yRatio)); HSSFSimpleShape shape2 = patriarch.createSimpleShape(a2); shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); y1 += 10; y2 += 10; }(5)插入圖片HSSFSheet sheet = workbook.createSheet(“Test”);// 創建工作表(Sheet) FileInputStream stream=new FileInputStream(“d:\POI\Apache.gif”); byte[] bytes=new byte[(int)stream.getChannel().size()]; stream.read(bytes);//讀取圖片到二進制數組 int pictureIdx = workbook.addPicture(bytes, HSSFWorkbook.PICTURE_TYPE_JPEG); HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short)0, 0, (short)5, 5); HSSFPicture pict = patriarch.createPicture(anchor, pictureIdx); //pict.resize();//自動調節圖片大小,圖片位置信息可能丟失(6)從Excel文件提取圖片InputStream inp = new FileInputStream(filePath); HSSFWorkbook workbook = new HSSFWorkbook(inp);//讀取現有的Excel文件 List pictures = workbook.getAllPictures(); for(int i=0;i總結
- 上一篇: SVN基本的理解和使用
- 下一篇: Pycharm2018最新激活方式