4.Apache POI使用詳解
一.POI結構與常用類
1.POI介紹
Apache POI是Apache軟件基金會的開源項目,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。 .NET的開發人員則可以利用NPOI (POI for .NET) 來存取 Microsoft Office文檔的功能
2.POI結構說明
包名稱 說明
HSSF 提供讀寫Microsoft Excel XLS格式檔案的功能。
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 錯誤信息
二.簡單的實例代碼
package com.my.utils; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; public class UsePoiCreateExcle { public static void main(String[] args) { // TODO Auto-generated method stub String path = "D:\\java\\test\\test.xls"; // create workbook Workbook workbook = new HSSFWorkbook(); // create sheet Sheet sheet1 = workbook.createSheet("teacher"); Sheet sheet2 = workbook.createSheet("student"); // 設置為當前頁面 workbook.setActiveSheet(0); // 創建行 Row row = sheet1.createRow(0); // 創建表格 Cell cell1 = row.createCell(0); Cell cell2 = row.createCell(1); Cell cell3 = row.createCell(2); CellStyle style = workbook.createCellStyle(); // 對齊方式 style.setAlignment(CellStyle.ALIGN_CENTER); // 先設置樣式再設置顏色 style.setBorderBottom(CellStyle.BORDER_THICK); style.setBottomBorderColor(HSSFColor.RED.index); //先設置填充樣式再設置顏色 style.setFillPattern(CellStyle.ALT_BARS); style.setFillForegroundColor(HSSFColor.GREEN.index); cell1.setCellValue("序號"); cell1.setCellStyle(style); cell2.setCellValue("姓名"); cell3.setCellValue("年齡"); System.out.println("============="); try { FileOutputStream out = new FileOutputStream(path); workbook.write(out); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
三.具體樣式詳解
1.創建文檔摘要信息
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測試文檔");//備註
2.創建批註
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)方法參數說明:
dx1 第1個單元格中x軸的偏移量
dy1 第1個單元格中y軸的偏移量
dx2 第2個單元格中x軸的偏移量
dy2 第2個單元格中y軸的偏移量
col1 第1個單元格的列號
row1 第1個單元格的行號
col2 第2個單元格的列號
row2 第2個單元格的行號
3.創建頁眉和頁腳
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訪問到它們,都是靜態屬性,列表如下:
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 總頁面數 HSSFHeader.page &P 當前頁號
4.設置數據格式
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靜態方法更加直接一些。
5.合並單元格
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),參數的說明:
firstRow 區域中第一個單元格的行號
lastRow 區域中最後一個單元格的行號
firstCol 區域中第一個單元格的列號
lastCol 區域中最後一個單元格的列號
6.單元格對齊
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);
水平對齊相關參數
如果是左側對齊就是 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;
7.使用邊框
邊框和其他單元格設置一樣也是調用CellStyle接口,CellStyle有2種和邊框相關的屬性,分別是:
邊框相關屬性 |
說明 |
範例 |
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);其中邊框類型分為以下幾種:
邊框範例圖 |
對應的靜態值 |
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 |
8.設置字體
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
上標下標選項值:
上標 FontFormatting.SS_SUPER
下標 FontFormatting.SS_SUB
普通,默認值 FontFormatting.SS_NONE
9.背景和紋理
SSFCellStyle style = workbook.createCellStyle(); style.setFillForegroundColor(HSSFColor.GREEN.index);//設置圖案顏色 style.setFillBackgroundColor(HSSFColor.RED.index);//設置圖案背景色 style.setFillPattern(HSSFCellStyle.SQUARES);//設置圖案樣式 cell.setCellStyle(style);
10.設置寬度和高度
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方法設置默認的列寬或行高。
11.判斷單元格是否為日期
//判斷單元格是否為日期類型,使用DateUtil.isCellDateFormatted(cell)方法,例如: HSSFCell 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
12.設置默認工作表
HSSFWorkbook workbook = new HSSFWorkbook();// 創建Excel文件(Workbook) workbook.createSheet("Test0");// 創建工作表(Sheet) workbook.createSheet("Test1");// 創建工作表(Sheet) workbook.createSheet("Test2");// 創建工作表(Sheet) workbook.createSheet("Test3");// 創建工作表(Sheet) workbook.setActiveSheet(2);//設置默認工作表
13.重命名
HSSFWorkbook workbook = new HSSFWorkbook();// 創建Excel文件(Workbook) workbook.createSheet("Test0");// 創建工作表(Sheet) workbook.createSheet("Test1");// 創建工作表(Sheet) workbook.createSheet("Test2");// 創建工作表(Sheet) workbook.createSheet("Test3");// 創建工作表(Sheet) workbook.setSheetName(2, "1234");//重命名工作表
14.調整表單顯示比例
HSSFWorkbook workbook = new HSSFWorkbook();// 創建Excel文件(Workbook) HSSFSheet sheet1= workbook.createSheet("Test0");// 創建工作表(Sheet) HSSFSheet sheet2=workbook.createSheet("Test1");// 創建工作表(Sheet) HSSFSheet sheet3=workbook.createSheet("Test2");// 創建工作表(Sheet) sheet1.setZoom(1,2);//50%顯示比例 sheet2.setZoom(2,1);//200%顯示比例 sheet3.setZoom(1,10);//10%顯示比例
15.顯示/隱藏網格線
HSSFWorkbook workbook = new HSSFWorkbook();// 創建Excel文件(Workbook) HSSFSheet sheet1= workbook.createSheet("Test0");// 創建工作表(Sheet) HSSFSheet sheet2=workbook.createSheet("Test1");// 創建工作表(Sheet) sheet1.setDisplayGridlines(false);//隱藏Excel網格線,默認值為true sheet2.setGridsPrinted(true);//打印時顯示網格線,默認值為false
16.遍歷Sheet
String filePath = "d:\\users\\lizw\\桌面\\POI\\sample.xls"; FileInputStream stream = new FileInputStream(filePath); HSSFWorkbook workbook = new HSSFWorkbook(stream);//讀取現有的Excel HSSFSheet sheet= workbook.getSheet("Test0");//得到指定名稱的Sheet for (Row row : sheet) { for (Cell cell : row) { System.out.print(cell + "\t"); } System.out.println(); }
其他詳見:http://www.cnblogs.com/LiZhiW/p/4313789.html
4.Apache POI使用詳解