1. 程式人生 > >4.Apache POI使用詳解

4.Apache POI使用詳解

sele 中文大寫 文本 vertical HA model 例如 ndb mode

一.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使用詳解