使用首先需要了解他的工作原理
1.POI結構與常用類
(1)創(chuàng)建Workbook和Sheet
(2)創(chuàng)建單元格
(1)POI介紹
Apache POI是Apache軟件基金會的開源項目,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。 .NET的開發(fā)人員則可以利用NPOI (POI for .NET) 來存取 Microsoft Office文檔的功能。
(2)POI結構說明
包名稱說明
HSSF提供讀寫Microsoft Excel XLS格式檔案的功能。(97-03)
XSSF提供讀寫Microsoft Excel OOXML XLSX格式檔案的功能。
HWPF提供讀寫Microsoft Word DOC格式檔案的功能。
HSLF提供讀寫Microsoft PowerPoint格式檔案的功能。
HDGF提供讀Microsoft Visio格式檔案的功能。
HPBF提供讀Microsoft Publisher格式檔案的功能。
HSMF提供讀Microsoft Outlook格式檔案的功能。
(3)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)創(chuàng)建Workbook和Sheet
publicclassTest00
{
publicstaticvoidmain(String[]args)throwsIOException
{
StringfilePath="d:\\users\\lizw\\桌面\\POI\\sample.xls";//文件路徑
HSSFWorkbookworkbook=newHSSFWorkbook();//創(chuàng)建Excel文件(Workbook)
HSSFSheetsheet=workbook.createSheet();//創(chuàng)建工作表(Sheet)
sheet=workbook.createSheet("Test");//創(chuàng)建工作表(Sheet)
FileOutputStreamout=newFileOutputStream(filePath);
workbook.write(out);//保存Excel文件
out.close();//關閉文件流
System.out.println("OK!");
}
}
(2)創(chuàng)建單元格
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFRowrow=sheet.createRow(0);// 創(chuàng)建行,從0開始
HSSFCellcell=row.createCell(0);// 創(chuàng)建行的單元格,也是從0開始
cell.setCellValue("李志偉");// 設置單元格內容
row.createCell(1).setCellValue(false);// 設置單元格內容,重載
row.createCell(2).setCellValue(newDate());// 設置單元格內容,重載
row.createCell(3).setCellValue(12.345);// 設置單元格內容,重載
(3)創(chuàng)建文檔摘要信息
workbook.createInformationProperties();//創(chuàng)建文檔信息
DocumentSummaryInformationdsi=workbook.getDocumentSummaryInformation();//摘要信息
dsi.setCategory("類別:Excel文件");//類別
dsi.setManager("管理者:李志偉");//管理者
dsi.setCompany("公司:--");//公司
SummaryInformationsi=workbook.getSummaryInformation();//摘要信息
si.setSubject("主題:--");//主題
si.setTitle("標題:測試文檔");//標題
si.setAuthor("作者:李志偉");//作者
si.setComments("備注:POI測試文檔");//備注
(4)創(chuàng)建批注
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFPatriarchpatr=sheet.createDrawingPatriarch();
HSSFClientAnchoranchor=patr.createAnchor(0,0,0,0,5,1,8,3);//創(chuàng)建批注位置
HSSFCommentcomment=patr.createCellComment(anchor);//創(chuàng)建批注
comment.setString(newHSSFRichTextString("這是一個批注段落!"));//設置批注內容
comment.setAuthor("李志偉");//設置批注作者
comment.setVisible(true);//設置批注默認顯示
HSSFCellcell=sheet.createRow(2).createCell(1);
cell.setCellValue("測試");
cell.setCellComment(comment);//把批注賦值給單元格
創(chuàng)建批注位置HSSFPatriarch.createAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2)方法參數(shù)說明:
dx1第1個單元格中x軸的偏移量
dy1第1個單元格中y軸的偏移量
dx2第2個單元格中x軸的偏移量
dy2第2個單元格中y軸的偏移量
col1第1個單元格的列號
row1第1個單元格的行號
col2第2個單元格的列號
row2第2個單元格的行號
(5)創(chuàng)建頁眉和頁腳
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFHeaderheader=sheet.getHeader();//得到頁眉
header.setLeft("頁眉左邊");
header.setRight("頁眉右邊");
header.setCenter("頁眉中間");
HSSFFooterfooter=sheet.getFooter();//得到頁腳
footer.setLeft("頁腳左邊");
footer.setRight("頁腳右邊");
footer.setCenter("頁腳中間");
也可以使用Office自帶的標簽定義,你可以通過HSSFHeader或HSSFFooter訪問到它們,都是靜態(tài)屬性,列表如下:
HSSFHeader.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總頁面數(shù)
HSSFHeader.page&P當前頁號
3.Excel的單元格操作
(1)設置格式
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFRowrow=sheet.createRow(0);
//設置日期格式--使用Excel內嵌的格式
HSSFCellcell=row.createCell(0);
cell.setCellValue(newDate());
HSSFCellStylestyle=workbook.createCellStyle();
style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
cell.setCellStyle(style);
//設置保留2位小數(shù)--使用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);
//設置科學計數(shù)法格式--使用自定義的格式
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的區(qū)別:當使用Excel內嵌的(或者說預定義)的格式時,直接用HSSFDataFormat.getBuiltinFormat靜態(tài)方法即可。當使用自己定義的格式時,必須先調用HSSFWorkbook.createDataFormat(),因為這時在底層會先找有沒有匹配的內嵌FormatRecord,如果沒有就會新建一個FormatRecord,所以必須先調用這個方法,然后你就可以用獲得的HSSFDataFormat實例的getFormat方法了,當然相對而言這種方式比較麻煩,所以內嵌格式還是用HSSFDataFormat.getBuiltinFormat靜態(tài)方法更加直接一些。
(2)合并單元格
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFRowrow=sheet.createRow(0);
//合并列
HSSFCellcell=row.createCell(0);
cell.setCellValue("合并列");
CellRangeAddressregion=newCellRangeAddress(0,0,0,5);
sheet.addMergedRegion(region);
//合并行
cell=row.createCell(6);
cell.setCellValue("合并行");
region=newCellRangeAddress(0,5,6,6);
sheet.addMergedRegion(region);
CellRangeAddress對象其實就是表示一個區(qū)域,其構造方法如下:CellRangeAddress(firstRow, lastRow, firstCol, lastCol),參數(shù)的說明:
firstRow區(qū)域中第一個單元格的行號
lastRow區(qū)域中最后一個單元格的行號
firstCol區(qū)域中第一個單元格的列號
lastCol區(qū)域中最后一個單元格的列號
提示:即使你沒有用CreateRow和CreateCell創(chuàng)建過行或單元格,也完全可以直接創(chuàng)建區(qū)域然后把這一區(qū)域合并,Excel的區(qū)域合并信息是單獨存儲的,和RowRecord、ColumnInfoRecord不存在直接關系。
(3)單元格對齊
HSSFCellcell=row.createCell(0);
cell.setCellValue("單元格對齊");
HSSFCellStylestyle=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);
水平對齊相關參數(shù)
如果是左側對齊就是HSSFCellStyle.ALIGN_FILL;
如果是居中對齊就是HSSFCellStyle.ALIGN_CENTER;
如果是右側對齊就是HSSFCellStyle.ALIGN_RIGHT;
如果是跨列舉中就是HSSFCellStyle.ALIGN_CENTER_SELECTION;
如果是兩端對齊就是HSSFCellStyle.ALIGN_JUSTIFY;
如果是填充就是HSSFCellStyle.ALIGN_FILL;
垂直對齊相關參數(shù)
如果是靠上就是HSSFCellStyle.VERTICAL_TOP;
如果是居中就是HSSFCellStyle.VERTICAL_CENTER;
如果是靠下就是HSSFCellStyle.VERTICAL_BOTTOM;
如果是兩端對齊就是HSSFCellStyle.VERTICAL_JUSTIFY;
(4)使用邊框
邊框和其他單元格設置一樣也是調用CellStyle接口,CellStyle有2種和邊框相關的屬性,分別是:
邊框相關屬性
說明
范例
Border+?方向
邊框類型
BorderLeft, BorderRight?等
方向+BorderColor
邊框顏色
TopBorderColor,BottomBorderColor?等
HSSFCellcell=row.createCell(1);
cell.setCellValue("設置邊框");
HSSFCellStylestyle=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);
其中邊框類型分為以下幾種:
邊框范例圖
對應的靜態(tài)值
HSSFCellStyle.BORDER_DOTTED
HSSFCellStyle.BORDER_HAIR
HSSFCellStyle.BORDER_DASH_DOT_DOT
HSSFCellStyle.BORDER_DASH_DOT
HSSFCellStyle.BORDER_DASHED
HSSFCellStyle.BORDER_THIN
HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT
HSSFCellStyle.BORDER_SLANTED_DASH_DOT
HSSFCellStyle.BORDER_MEDIUM_DASH_DOT
HSSFCellStyle.BORDER_MEDIUM_DASHED
HSSFCellStyle.BORDER_MEDIUM
HSSFCellStyle.BORDER_THICK
HSSFCellStyle.BORDER_DOUBLE
(5)設置字體
HSSFCellcell=row.createCell(1);
cell.setCellValue("設置字體");
HSSFCellStylestyle=workbook.createCellStyle();
HSSFFontfont=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
上標下標選項值:
上標 FontFormatting.SS_SUPER
下標 FontFormatting.SS_SUB
普通,默認值 FontFormatting.SS_NONE
(6)背景和紋理
HSSFCellStylestyle=workbook.createCellStyle();
style.setFillForegroundColor(HSSFColor.GREEN.index);//設置圖案顏色
style.setFillBackgroundColor(HSSFColor.RED.index);//設置圖案背景色
style.setFillPattern(HSSFCellStyle.SQUARES);//設置圖案樣式
cell.setCellStyle(style);
圖案樣式及其對應的值:
圖案樣式
常量
HSSFCellStyle.NO_FILL
HSSFCellStyle.ALT_BARS
HSSFCellStyle.FINE_DOTS
HSSFCellStyle.SPARSE_DOTS
HSSFCellStyle.LESS_DOTS
HSSFCellStyle.LEAST_DOTS
HSSFCellStyle.BRICKS
HSSFCellStyle.BIG_SPOTS
HSSFCellStyle.THICK_FORWARD_DIAG
HSSFCellStyle.THICK_BACKWARD_DIAG
HSSFCellStyle.THICK_VERT_BANDS
HSSFCellStyle.THICK_HORZ_BANDS
HSSFCellStyle.THIN_HORZ_BANDS
HSSFCellStyle.THIN_VERT_BANDS
HSSFCellStyle.THIN_BACKWARD_DIAG
HSSFCellStyle.THIN_FORWARD_DIAG
HSSFCellStyle.SQUARES
HSSFCellStyle.DIAMONDS
(7)設置寬度和高度
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFRowrow=sheet.createRow(1);
HSSFCellcell=row.createCell(1);
cell.setCellValue("123456789012345678901234567890");
sheet.setColumnWidth(1,31*256);//設置第一列的寬度是31個字符寬度
row.setHeightInPoints(50);//設置行的高度是50個點
這里你會發(fā)現(xiàn)一個有趣的現(xiàn)象,setColumnWidth的第二個參數(shù)要乘以256,這是怎么回事呢?其實,這個參數(shù)的單位是1/256個字符寬度,也就是說,這里是把B列的寬度設置為了31個字符。
設置行高使用HSSFRow對象的setHeight和setHeightInPoints方法,這兩個方法的區(qū)別在于setHeightInPoints的單位是點,而setHeight的單位是1/20個點,所以setHeight的值永遠是setHeightInPoints的20倍。
你也可以使用HSSFSheet.setDefaultColumnWidth、HSSFSheet.setDefaultRowHeight和HSSFSheet.setDefaultRowHeightInPoints方法設置默認的列寬或行高。
(8)判斷單元格是否為日期
判斷單元格是否為日期類型,使用DateUtil.isCellDateFormatted(cell)方法,例如:
HSSFCellcell=row.createCell(1);
cell.setCellValue(newDate());//設置日期數(shù)據(jù)
System.out.println(DateUtil.isCellDateFormatted(cell));//輸出:false
HSSFCellStylestyle=workbook.createCellStyle();
style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
cell.setCellStyle(style);//設置日期樣式
System.out.println(DateUtil.isCellDateFormatted(cell));//輸出:true
4.使用Excel公式
(1)基本計算
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFRowrow=sheet.createRow(0);
HSSFCellcell=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函數(shù)
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFRowrow=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)日期函數(shù)
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFCellStylestyle=workbook.createCellStyle();
style.setDataFormat(workbook.createDataFormat().getFormat("yyyy-mm-dd"));
HSSFRowrow=sheet.createRow(0);
Calendardate=Calendar.getInstance();//日歷對象
HSSFCellcell=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?的日期函數(shù)可參考:http://tonyqus.sinaapp.com/archives/286
(4)字符串相關函數(shù)
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFRowrow=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?的字符串函數(shù)可參考:http://tonyqus.sinaapp.com/archives/289
(5)IF函數(shù)
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFRowrow=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時的返回值。
(6)CountIf和SumIf函數(shù)
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFRowrow=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):滿足某條件的計數(shù)的函數(shù)。參數(shù)range:需要進行讀數(shù)的計數(shù);參數(shù)criteria:條件表達式,只有當滿足此條件時才進行計數(shù)。
SumIF(criteria_range, criteria,sum_range):用于統(tǒng)計某區(qū)域內滿足某條件的值的求和。參數(shù)criteria_range:條件測試區(qū)域,第二個參數(shù)Criteria中的條件將與此區(qū)域中的值進行比較;參數(shù)criteria:條件測試值,滿足條件的對應的sum_range項將進行求和計算;參數(shù)sum_range:匯總數(shù)據(jù)所在區(qū)域,求和時會排除掉不滿足Criteria條件的對應的項。
(7)Lookup函數(shù)
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFRowrow=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("優(yōu)秀");
row=sheet.createRow(4);
row.createCell(0).setCellValue(75);
row.createCell(1).setCellFormula("LOOKUP(A5,$A$1:$A$4,$C$1:$C$4)");
row.createCell(2).setCellFormula("VLOOKUP(A5,$A$1:$C$4,3,true)");
以上代碼中的公式說明:
LOOKUP(lookup_value,lookup_vector,result_vector)?,第一個參數(shù):需要查找的內容,本例中指向A5?單元格,也就是75?;第二個參數(shù):比較對象區(qū)域,本例中的成績需要與$A$1:$A$4?中的各單元格中的值進行比較;第三個參數(shù):查找結果區(qū)域,如果匹配到會將此區(qū)域中對應的數(shù)據(jù)返回。如本例中返回$C$1:$C$4?中對應的值。
可能有人會問,字典中沒有75?對應的成績啊,那么Excel?中怎么匹配的呢?答案是模糊匹配,并且LOOKUP?函數(shù)只支持模糊匹配。Excel?會在$A$1:$A$4?中找小于75?的最大值,也就是A3?對應的70?,然后將對應的$C$1:$C$4?區(qū)域中的C3?中的值返回,這就是最終結果“良好”的由來。
VLOOKUP(lookup_value,lookup_area,result_col,is_fuzzy )?,第一個參數(shù):需要查找的內容,這里是A5?單元格;第二個參數(shù):需要比較的表,這里是$A$1:$C$4?,注意VLOOKUP?匹配時只與表中的第一列進行匹配。第三個參數(shù):匹配結果對應的列序號。這里要對應的是成績列,所以為3?。第四個參數(shù):指明是否模糊匹配。例子中的TRUE?表示模糊匹配,與上例中一樣。匹配到的是第三行。如果將此參數(shù)改為FALSE?,因為在表中的第1?列中找不到75?,所以會報“#N/A?”的計算錯誤。
另外,還有與VLOKUP?類似的HLOOKUP?。不同的是VLOOKUP?用于在表格或數(shù)值數(shù)組的首列查找指定的數(shù)值,并由此返回表格或數(shù)組當前行中指定列處的數(shù)值。而HLOOKUP?用于在表格或數(shù)值數(shù)組的首行查找指定的數(shù)值,并由此返回表格或數(shù)組當前列中指定行處的數(shù)值。讀者可以自已去嘗試。
(8)隨機數(shù)函數(shù)
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFRowrow=sheet.createRow(0);
row.createCell(0).setCellFormula("RAND()");//取0-1之間的隨機數(shù)
row.createCell(1).setCellFormula("int(RAND()*100)");//取0-100之間的隨機整數(shù)
row.createCell(2).setCellFormula("rand()*10+10");//取10-20之間的隨機實數(shù)
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函數(shù)以外,還用到了CHAR函數(shù)用來將ASCII碼換為字母,INT函數(shù)用來取整。值得注意的是INT函數(shù)不會四舍五入,無論小數(shù)點后是多少都會被舍去。
(9)獲得公式的返回值
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFRowrow=sheet.createRow(0);
row.createCell(0).setCellValue(7);//A1
row.createCell(1).setCellValue(8);//B1
HSSFCellcell=row.createCell(2);
cell.setCellFormula("A1*B1+14");
HSSFFormulaEvaluatore=newHSSFFormulaEvaluator(workbook);
cell=e.evaluateInCell(cell);//若Excel文件不是POI創(chuàng)建的,則不必調用此方法
System.out.println("公式計算結果:"+cell.getNumericCellValue());
5.使用圖形
(1)畫線
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFPatriarchpatriarch=sheet.createDrawingPatriarch();
HSSFClientAnchoranchor=newHSSFClientAnchor(0,0,0,0,(short)1,0,(short)4,4);
HSSFSimpleShapeline=patriarch.createSimpleShape(anchor);
line.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);//設置圖形類型
line.setLineStyle(HSSFShape.LINESTYLE_SOLID);//設置圖形樣式
line.setLineWidth(6350);//在POI中線的寬度12700表示1pt,所以這里是0.5pt粗的線條。
通常,利用POI畫圖主要有以下幾個步驟:
1. 創(chuàng)建一個Patriarch(注意,一個sheet中通常只創(chuàng)建一個Patriarch對象);
2. 創(chuàng)建一個Anchor,以確定圖形的位置;
3. 調用Patriarch創(chuàng)建圖形;
4. 設置圖形類型(直線,矩形,圓形等)及樣式(顏色,粗細等)。
關于HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2)的參數(shù),有必要在這里說明一下:
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屬性,有如下一些可選值,對應的效果分別如圖所示:
(2)畫矩形
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFPatriarchpatriarch=sheet.createDrawingPatriarch();
HSSFClientAnchoranchor=newHSSFClientAnchor(255,122,255,122,(short)1,0,(short)4,3);
HSSFSimpleShaperec=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);//設置圖片類型
(4)畫Grid
在POI中,本身沒有畫Grid(網格)的方法。但我們知道Grid其實就是由橫線和豎線構成的,所在我們可以通過畫線的方式來模擬畫Grid。代碼如下:
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
HSSFRowrow=sheet.createRow(2);
row.createCell(1);
row.setHeightInPoints(240);
sheet.setColumnWidth(2,9000);
intlinesCount=20;
HSSFPatriarchpatriarch=sheet.createDrawingPatriarch();
//因為HSSFClientAnchor中dx只能在0-1023之間,dy只能在0-255之間,這里采用比例的方式
doublexRatio=1023.0/(linesCount*10);
doubleyRatio=255.0/(linesCount*10);
// 畫豎線
intx1=0;
inty1=0;
intx2=0;
inty2=200;
for(inti=0;i
{
HSSFClientAnchora2=newHSSFClientAnchor();
a2.setAnchor((short)2,2,(int)(x1*xRatio),
(int)(y1*yRatio),(short)2,2,(int)(x2*xRatio),
(int)(y2*yRatio));
HSSFSimpleShapeshape2=patriarch.createSimpleShape(a2);
shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
x1+=10;
x2+=10;
}
// 畫橫線
x1=0;
y1=0;
x2=200;
y2=0;
for(inti=0;i
{
HSSFClientAnchora2=newHSSFClientAnchor();
a2.setAnchor((short)2,2,(int)(x1*xRatio),
(int)(y1*yRatio),(short)2,2,(int)(x2*xRatio),
(int)(y2*yRatio));
HSSFSimpleShapeshape2=patriarch.createSimpleShape(a2);
shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
y1+=10;
y2+=10;
}
(5)插入圖片
HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)
FileInputStreamstream=newFileInputStream("d:\\POI\\Apache.gif");
byte[]bytes=newbyte[(int)stream.getChannel().size()];
stream.read(bytes);//讀取圖片到二進制數(shù)組
intpictureIdx=workbook.addPicture(bytes,HSSFWorkbook.PICTURE_TYPE_JPEG);
HSSFPatriarchpatriarch=sheet.createDrawingPatriarch();
HSSFClientAnchoranchor=newHSSFClientAnchor(0,0,0,0,(short)0,0,(short)5,5);
HSSFPicturepict=patriarch.createPicture(anchor,pictureIdx);
//pict.resize();//自動調節(jié)圖片大小,圖片位置信息可能丟失
(6)從Excel文件提取圖片
InputStreaminp=newFileInputStream(filePath);
HSSFWorkbookworkbook=newHSSFWorkbook(inp);//讀取現(xiàn)有的Excel文件
Listpictures=workbook.getAllPictures();
for(inti=0;i
{
HSSFPictureDatapic=pictures.get(i);
Stringext=pic.suggestFileExtension();
if(ext.equals("png"))//判斷文件格式
{
FileOutputStreampng=newFileOutputStream("d:\\POI\\Apache.png");
png.write(pic.getData());
png.close();//保存圖片
}
}
6.Excel表操作
(1)設置默認工作表
HSSFWorkbookworkbook=newHSSFWorkbook();// 創(chuàng)建Excel文件(Workbook)
workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)
workbook.createSheet("Test1");// 創(chuàng)建工作表(Sheet)
workbook.createSheet("Test2");// 創(chuàng)建工作表(Sheet)
workbook.createSheet("Test3");// 創(chuàng)建工作表(Sheet)
workbook.setActiveSheet(2);//設置默認工作表
(2)重命名工作表
HSSFWorkbookworkbook=newHSSFWorkbook();// 創(chuàng)建Excel文件(Workbook)
workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)
workbook.createSheet("Test1");// 創(chuàng)建工作表(Sheet)
workbook.createSheet("Test2");// 創(chuàng)建工作表(Sheet)
workbook.createSheet("Test3");// 創(chuàng)建工作表(Sheet)
workbook.setSheetName(2,"1234");//重命名工作表
(3)調整表單顯示比例
HSSFWorkbookworkbook=newHSSFWorkbook();// 創(chuàng)建Excel文件(Workbook)
HSSFSheetsheet1=workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)
HSSFSheetsheet2=workbook.createSheet("Test1");// 創(chuàng)建工作表(Sheet)
HSSFSheetsheet3=workbook.createSheet("Test2");// 創(chuàng)建工作表(Sheet)
sheet1.setZoom(1,2);//50%顯示比例
sheet2.setZoom(2,1);//200%顯示比例
sheet3.setZoom(1,10);//10%顯示比例
(4)顯示/隱藏網格線
HSSFWorkbookworkbook=newHSSFWorkbook();// 創(chuàng)建Excel文件(Workbook)
HSSFSheetsheet1=workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)
HSSFSheetsheet2=workbook.createSheet("Test1");// 創(chuàng)建工作表(Sheet)
sheet1.setDisplayGridlines(false);//隱藏Excel網格線,默認值為true
sheet2.setGridsPrinted(true);//打印時顯示網格線,默認值為false
(5)遍歷Sheet
StringfilePath="d:\\users\\lizw\\桌面\\POI\\sample.xls";
FileInputStreamstream=newFileInputStream(filePath);
HSSFWorkbookworkbook=newHSSFWorkbook(stream);//讀取現(xiàn)有的Excel
HSSFSheetsheet=workbook.getSheet("Test0");//得到指定名稱的Sheet
for(Rowrow:sheet)
{
for(Cellcell:row)
{
System.out.print(cell+"\t");
}
System.out.println();
}
7.Excel行列操作
(1)組合行、列
HSSFSheetsheet=workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)
sheet.groupRow(1,3);//組合行
sheet.groupRow(2,4);//組合行
sheet.groupColumn(2,7);//組合列
這里簡單的介紹一下什么叫做組合:組合分為行組合和列組合,所謂行組合,就是讓n行組合成一個集合,能夠進行展開和合攏操作。
使用POI也可以取消組合,例如:sheet.ungroupColumn(1, 3);//取消列組合
(2)鎖定列
在Excel中,有時可能會出現(xiàn)列數(shù)太多或是行數(shù)太多的情況,這時可以通過鎖定列來凍結部分列,不隨滾動條滑動,方便查看。
HSSFSheetsheet=workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)
sheet.createFreezePane(2,3,15,25);//凍結行列
下面對CreateFreezePane的參數(shù)作一下說明:
第一個參數(shù)表示要凍結的列數(shù);
第二個參數(shù)表示要凍結的行數(shù),這里只凍結列所以為0;
第三個參數(shù)表示右邊區(qū)域可見的首列序號,從1開始計算;
第四個參數(shù)表示下邊區(qū)域可見的首行序號,也是從1開始計算,這里是凍結列,所以為0;
(3)上下移動行
FileInputStreamstream=newFileInputStream(filePath);
HSSFWorkbookworkbook=newHSSFWorkbook(stream);
HSSFSheetsheet=workbook.getSheet("Test0");
sheet.shiftRows(2,4,2);//把第3行到第4行向下移動兩行
HSSFSheet.shiftRows(startRow, endRow, n)參數(shù)說明
startRow:需要移動的起始行;
endRow:需要移動的結束行;
n:移動的位置,正數(shù)表示向下移動,負數(shù)表示向上移動;
8.Excel的其他功能
(1)設置密碼
HSSFSheetsheet=workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)
HSSFRowrow=sheet.createRow(1);
HSSFCellcell=row.createCell(1);
cell.setCellValue("已鎖定");
HSSFCellStylelocked=workbook.createCellStyle();
locked.setLocked(true);//設置鎖定
cell.setCellStyle(locked);
cell=row.createCell(2);
cell.setCellValue("未鎖定");
HSSFCellStyleunlocked=workbook.createCellStyle();
unlocked.setLocked(false);//設置不鎖定
cell.setCellStyle(unlocked);
sheet.protectSheet("password");//設置保護密碼
(2)數(shù)據(jù)有效性
HSSFSheetsheet=workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)
HSSFRowrow=sheet.createRow(0);
HSSFCellcell=row.createCell(0);
cell.setCellValue("日期列");
CellRangeAddressListregions=newCellRangeAddressList(1,65535,0,0);//選定一個區(qū)域
DVConstraintconstraint=DVConstraint.createDateConstraint(DVConstraint?.?OperatorType?.?BETWEEN?,?"1993-01-01"?,"2014-12-31"?,?"yyyy-MM-dd"?);
HSSFDataValidationdataValidate=newHSSFDataValidation(regions,constraint);
dataValidate.createErrorBox("錯誤","你必須輸入一個時間!");
sheet.addValidationData(dataValidate);
CellRangeAddressList類表示一個區(qū)域,構造函數(shù)中的四個參數(shù)分別表示起始行序號,終止行序號,起始列序號,終止列序號。65535是一個Sheet的最大行數(shù)。另外,CreateDateConstraint的第一個參數(shù)除了設置成DVConstraint.OperatorType.BETWEEN外,還可以設置成如下一些值,大家可以自己一個個去試看看效果:
驗證的數(shù)據(jù)類型也有幾種選擇,如下:
(3)生成下拉式菜單
CellRangeAddressListregions=newCellRangeAddressList(0,65535,0,0);
DVConstraintconstraint=DVConstraint.createExplicitListConstraint(newString[]{"C++","Java","C#"});
HSSFDataValidationdataValidate=newHSSFDataValidation(regions,constraint);
sheet.addValidationData(dataValidate);
(4)打印基本設置
HSSFSheetsheet=workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)
HSSFPrintSetupprint=sheet.getPrintSetup();//得到打印對象
print.setLandscape(false);//true,則表示頁面方向為橫向;否則為縱向
print.setScale((short)80);//縮放比例80%(設置為0-100之間的值)
print.setFitWidth((short)2);//設置頁寬
print.setFitHeight((short)4);//設置頁高
print.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);//紙張設置
print.setUsePage(true);//設置打印起始頁碼不使用"自動"
print.setPageStart((short)6);//設置打印起始頁碼
sheet.setPrintGridlines(true);//設置打印網格線
print.setNoColor(true);//值為true時,表示單色打印
print.setDraft(true);//值為true時,表示用草稿品質打印
print.setLeftToRight(true);//true表示“先行后列”;false表示“先列后行”
print.setNotes(true);//設置打印批注
sheet.setAutobreaks(false);//Sheet頁自適應頁面大小
更詳細的打印設置請參考:http://tonyqus.sinaapp.com/archives/271
(5)超鏈接
HSSFSheetsheet=workbook.createSheet("Test0");
CreationHelpercreateHelper=workbook.getCreationHelper();
// 關聯(lián)到網站
Hyperlinklink=createHelper.createHyperlink(Hyperlink.LINK_URL);
link.setAddress("http://poi.apache.org/");
sheet.createRow(0).createCell(0).setHyperlink(link);
// 關聯(lián)到當前目錄的文件
link=createHelper.createHyperlink(Hyperlink.LINK_FILE);
link.setAddress("sample.xls");
sheet.createRow(0).createCell(1).setHyperlink(link);
// e-mail 關聯(lián)
link=createHelper.createHyperlink(Hyperlink.LINK_EMAIL);
link.setAddress("mailto:poi@apache.org?subject=Hyperlinks");
sheet.createRow(0).createCell(2).setHyperlink(link);
//關聯(lián)到工作簿中的位置
link=createHelper.createHyperlink(Hyperlink.LINK_DOCUMENT);
link.setAddress("'Test0'!C3");//Sheet名為Test0的C3位置
sheet.createRow(0).createCell(3).setHyperlink(link);
9.POI對Word的基本操作
(1)POI操作Word簡介
POI讀寫Excel功能強大、操作簡單。但是POI操作時,一般只用它讀取word文檔,POI只能能夠創(chuàng)建簡單的word文檔,相對而言POI操作時的功能太少。
(2)POI創(chuàng)建Word文檔的簡單示例
XWPFDocumentdoc=newXWPFDocument();// 創(chuàng)建Word文件
XWPFParagraphp=doc.createParagraph();// 新建一個段落
p.setAlignment(ParagraphAlignment.CENTER);// 設置段落的對齊方式
p.setBorderBottom(Borders.DOUBLE);//設置下邊框
p.setBorderTop(Borders.DOUBLE);//設置上邊框
p.setBorderRight(Borders.DOUBLE);//設置右邊框
p.setBorderLeft(Borders.DOUBLE);//設置左邊框
XWPFRunr=p.createRun();//創(chuàng)建段落文本
r.setText("POI創(chuàng)建的Word段落文本");
r.setBold(true);//設置為粗體
r.setColor("FF0000");//設置顏色
p=doc.createParagraph();// 新建一個段落
r=p.createRun();
r.setText("POI讀寫Excel功能強大、操作簡單。");
XWPFTabletable=doc.createTable(3,3);//創(chuàng)建一個表格
table.getRow(0).getCell(0).setText("表格1");
table.getRow(1).getCell(1).setText("表格2");
table.getRow(2).getCell(2).setText("表格3");
FileOutputStreamout=newFileOutputStream("d:\\POI\\sample.doc");
doc.write(out);
out.close();
(3)POI讀取Word文檔里的文字
FileInputStreamstream=newFileInputStream("d:\\POI\\sample.doc");
XWPFDocumentdoc=newXWPFDocument(stream);// 創(chuàng)建Word文件
for(XWPFParagraphp:doc.getParagraphs())//遍歷段落
{
System.out.print(p.getParagraphText());
}
for(XWPFTabletable:doc.getTables())//遍歷表格
{
for(XWPFTableRowrow:table.getRows())
{
for(XWPFTableCellcell:row.getTableCells())
{
System.out.print(cell.getText());
}
}
}