Apache POI使用詳解
1、POI結構與常用類
(1)POI介紹
Apache POI是Apache軟件基金會的開源項目,POI提供API給Java程序對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 | 錯誤信息表 |
2、Excel的基本操作
(1)創建Workbook和Sheet
public 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)方法參數說明:
dx1 第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訪問到它們,都是靜態屬性,列表如下:
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 當前頁號
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靜態方法更加直接一些。
(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),參數的說明:
firstRow 區域中第一個單元格的行號
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);
水平對齊相關參數
如果是左側對齊就是 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種和邊框相關的屬性,分別是:
邊框相關屬性 |
說明 |
範例 |
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 |
(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
上標下標選項值:
上標 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);
圖案樣式及其對應的值:
圖案樣式 |
常量 |
|
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)設置寬度和高度
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方法設置默認的列寬或行高。
(8)判斷單元格是否爲日期
判斷單元格是否爲日期類型,使用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
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/286
(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/289
(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時的返回值。
(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條件的對應的項。
(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,$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) ,第一個參數:需要查找的內容,本例中指向 A5 單元格,也就是 75 ;第二個參數:比較對象區域,本例中的成績需要與 $A$1:$A$4 中的各單元格中的值進行比較;第三個參數:查找結果區域,如果匹配到會將此區域中對應的數據返回。如本例中返回$C$1:$C$4 中對應的值。
可能有人會問,字典中沒有 75 對應的成績啊,那麼 Excel 中怎麼匹配的呢?答案是模糊匹配,並且 LOOKUP 函數只支持模糊匹配。 Excel 會在 $A$1:$A$4 中找小於 75 的最大值,也就是 A3 對應的 70 ,然後將對應的 $C$1:$C$4 區域中的 C3 中的值返回,這就是最終結果“良好”的由來。
VLOOKUP(lookup_value,lookup_area,result_col,is_fuzzy ) ,第一個參數:需要查找的內容,這裏是 A5 單元格;第二個參數:需要比較的表,這裏是 $A$1:$C$4 ,注意 VLOOKUP 匹配時只與表中的第一列進行匹配。第三個參數:匹配結果對應的列序號。這裏要對應的是成績列,所以爲 3 。第四個參數:指明是否模糊匹配。例子中的 TRUE 表示模糊匹配,與上例中一樣。匹配到的是第三行。如果將此參數改爲 FALSE ,因爲在表中的第 1 列中找不到 75 ,所以會報“#N/A ”的計算錯誤。
另外,還有與 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函數不會四捨五入,無論小數點後是多少都會被捨去。
(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 = newHSSFFormulaEvaluator(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屬性,有如下一些可選值,對應的效果分別如圖所示:
(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);//設置圖片類型
(4)畫Grid
在POI中,本身沒有畫Grid(網格)的方法。但我們知道Grid其實就是由橫線和豎線構成的,所在我們可以通過畫線的方式來模擬畫Grid。代碼如下:
HSSFSheet 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=newFileInputStream("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<HSSFPictureData> pictures = workbook.getAllPictures();
for(int i=0;i<pictures.size();i++)
{
HSSFPictureData pic=pictures.get(i);
String ext = pic.suggestFileExtension();
if (ext.equals("png"))//判斷文件格式
{
FileOutputStream png=newFileOutputStream("d:\\POI\\Apache.png");
png.write(pic.getData());
png.close();//保存圖片
}
}
6.Excel表操作
(1)設置默認工作表
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);//設置默認工作表
(2)重命名工作表
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");//重命名工作表
(3)調整表單顯示比例
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%顯示比例
(4)顯示/隱藏網格線
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
(5)遍歷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();
}
7.Excel行列操作
(1)組合行、列
HSSFSheet sheet= workbook.createSheet("Test0");// 創建工作表(Sheet)
sheet.groupRow(1, 3);//組合行
sheet.groupRow(2, 4);//組合行
sheet.groupColumn(2, 7);//組合列
這裏簡單的介紹一下什麼叫做組合:組合分爲行組合和列組合,所謂行組合,就是讓n行組合成一個集合,能夠進行展開和合攏操作。
使用POI也可以取消組合,例如:sheet.ungroupColumn(1, 3);//取消列組合
(2)鎖定列
在Excel中,有時可能會出現列數太多或是行數太多的情況,這時可以通過鎖定列來凍結部分列,不隨滾動條滑動,方便查看。
HSSFSheet sheet= workbook.createSheet("Test0");// 創建工作表(Sheet)
sheet.createFreezePane(2, 3, 15, 25);//凍結行列
下面對CreateFreezePane的參數作一下說明:
第一個參數表示要凍結的列數;
第二個參數表示要凍結的行數,這裏只凍結列所以爲0;
第三個參數表示右邊區域可見的首列序號,從1開始計算;
第四個參數表示下邊區域可見的首行序號,也是從1開始計算,這裏是凍結列,所以爲0;
(3)上下移動行
FileInputStream stream = new FileInputStream(filePath);
HSSFWorkbook workbook = new HSSFWorkbook(stream);
HSSFSheet sheet = workbook.getSheet("Test0");
sheet.shiftRows(2, 4, 2);//把第3行到第4行向下移動兩行
HSSFSheet.shiftRows(startRow, endRow, n)參數說明
startRow:需要移動的起始行;
endRow:需要移動的結束行;
n:移動的位置,正數表示向下移動,負數表示向上移動;
8.Excel的其他功能
HSSFSheet sheet= workbook.createSheet("Test0");// 創建工作表(Sheet)
HSSFRow row=sheet.createRow(1);
HSSFCell cell=row.createCell(1);
cell.setCellValue("已鎖定");
HSSFCellStyle locked = workbook.createCellStyle();
locked.setLocked(true);//設置鎖定
cell.setCellStyle(locked);
cell=row.createCell(2);
cell.setCellValue("未鎖定");
HSSFCellStyle unlocked = workbook.createCellStyle();
unlocked.setLocked(false);//設置不鎖定
cell.setCellStyle(unlocked);
sheet.protectSheet("password");//設置保護密碼
HSSFSheet sheet= workbook.createSheet("Test0");// 創建工作表(Sheet)
HSSFRow row=sheet.createRow(0);
HSSFCell cell=row.createCell(0);
cell.setCellValue("日期列");
CellRangeAddressList regions = new CellRangeAddressList(1, 65535,0, 0);//選定一個區域
DVConstraint constraint = DVConstraint.createDateConstraint(
DVConstraint . OperatorType . BETWEEN , "1993-01-01" ,"2014-12-31" , "yyyy-MM-dd" );HSSFDataValidation dataValidate = new HSSFDataValidation(regions,constraint);
dataValidate.createErrorBox("錯誤", "你必須輸入一個時間!");
sheet.addValidationData(dataValidate);
CellRangeAddressList類表示一個區域,構造函數中的四個參數分別表示起始行序號,終止行序號,起始列序號,終止列序號。65535是一個Sheet的最大行數。另外,CreateDateConstraint的第一個參數除了設置成DVConstraint.OperatorType.BETWEEN外,還可以設置成如下一些值,大家可以自己一個個去試看看效果:
驗證的數據類型也有幾種選擇,如下:
(3)生成下拉式菜單
CellRangeAddressList regions = new CellRangeAddressList(0, 65535,0, 0);
DVConstraint constraint =DVConstraint.createExplicitListConstraint(new String[] { "C++","Java", "C#" });
HSSFDataValidation dataValidate = new HSSFDataValidation(regions,constraint);
sheet.addValidationData(dataValidate);
(4)打印基本設置
HSSFSheet sheet= workbook.createSheet("Test0");// 創建工作表(Sheet)
HSSFPrintSetup print = 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)超鏈接
HSSFSheet sheet = workbook.createSheet("Test0");
CreationHelper createHelper = workbook.getCreationHelper();
// 關聯到網站
Hyperlink link =createHelper.createHyperlink(Hyperlink.LINK_URL);
link.setAddress("http://poi.apache.org/");
sheet.createRow(0).createCell(0).setHyperlink(link);
// 關聯到當前目錄的文件
link = createHelper.createHyperlink(Hyperlink.LINK_FILE);
link.setAddress("sample.xls");
sheet.createRow(0).createCell(1).setHyperlink(link);
// e-mail 關聯
link = createHelper.createHyperlink(Hyperlink.LINK_EMAIL);
link.setAddress("mailto:[email protected]?subject=Hyperlinks");
sheet.createRow(0).createCell(2).setHyperlink(link);
//關聯到工作簿中的位置
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只能能夠創建簡單的word文檔,相對而言POI操作時的功能太少。
(2)POI創建Word文檔的簡單示例
XWPFDocument doc = new XWPFDocument();// 創建Word文件
XWPFParagraph p = doc.createParagraph();// 新建一個段落
p.setAlignment(ParagraphAlignment.CENTER);// 設置段落的對齊方式
p.setBorderBottom(Borders.DOUBLE);//設置下邊框
p.setBorderTop(Borders.DOUBLE);//設置上邊框
p.setBorderRight(Borders.DOUBLE);//設置右邊框
p.setBorderLeft(Borders.DOUBLE);//設置左邊框
XWPFRun r = p.createRun();//創建段落文本
r.setText("POI創建的Word段落文本");
r.setBold(true);//設置爲粗體
r.setColor("FF0000");//設置顏色
p = doc.createParagraph();// 新建一個段落
r = p.createRun();
r.setText("POI讀寫Excel功能強大、操作簡單。");
XWPFTable table= doc.createTable(3, 3);//創建一個表格
table.getRow(0).getCell(0).setText("表格1");
table.getRow(1).getCell(1).setText("表格2");
table.getRow(2).getCell(2).setText("表格3");
FileOutputStream out = newFileOutputStream("d:\\POI\\sample.doc");
doc.write(out);
out.close();
(3)POI讀取Word文檔裏的文字
FileInputStream stream = newFileInputStream("d:\\POI\\sample.doc");
XWPFDocument doc = new XWPFDocument(stream);// 創建Word文件
for(XWPFParagraph p : doc.getParagraphs())//遍歷段落
{
System.out.print(p.getParagraphText());
}
for(XWPFTable table : doc.getTables())//遍歷表格
{
for(XWPFTableRow row : table.getRows())
{
for(XWPFTableCell cell : row.getTableCells())
{
System.out.print(cell.getText());
}
}
}
-----------------------------------------------------------------------------------------------------------
實例如下:
package test;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.imageio.ImageIO;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HeaderFooter;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Footer;
import org.apache.poi.ss.usermodel.Header;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFPrintSetup;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExportExcel {
public static void main(String[] args) throws IOException {
exportExcel();
}
public static String exportExcel() throws IOException {
XSSFWorkbook workbook = new XSSFWorkbook(); // 創建Excel文件(Workbook)
XSSFSheet sheet = workbook.createSheet("Sheet1"); // 創建工作表(Sheet)
// 創建Excel
genExcel(workbook,sheet);
// 將生成的Excel文件保存到本地
SimpleDateFormat dateFormat = new SimpleDateFormat("YYYYMMDDhhmmss");
String now = dateFormat.format(new Date());
String basePath="D:/"; // 文件路徑
String name = "Excel測試1" ;
String exportFileName = name+"_"+now+".xlsx"; // 文件名
File filePath = new File(basePath+exportFileName);
FileOutputStream out = new FileOutputStream(filePath); // 文件輸出流
workbook.write(out); // 保存Excel文件
out.close(); // 關閉文件流
String exportName = basePath+exportFileName;
System.out.println("導出2007文件成功!文件導出路徑:--"+exportName);
return exportName;
}
private static void genExcel( XSSFWorkbook workbook, XSSFSheet sheet) throws IOException {
// 創建表單樣式
XSSFCellStyle titleStyle = genTitleStyle(workbook); // 創建標題樣式
CellStyle headerStyle = genHeaderStyle(workbook); // 創建列頭樣式
CellStyle contextStyle = genContextStyle(workbook); // 創建文本樣式
CellStyle signatureStyle = genSignatureStyle(workbook); // 創建簽字區樣式(帶邊框)
CellStyle descripStyle = genDescripStyle(workbook); // 創建說明區樣式(不帶帶邊框)
List<String> header = genHeader(); // 列頭信息
// 單元格合併信息
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, header.size()-1)); // 表頭1
sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, header.size()-1)); // 表頭2
// 圖片信息
pictureToSheet2(workbook,sheet);
// 表頭信息
XSSFRow row = sheet.createRow(0); // 創建行,從0開始
XSSFCell cell = row.createCell(0); // 創建行的單元格,也是從0開始
cell.setCellValue("表頭信息");
cell.setCellStyle(titleStyle);
row = sheet.createRow(1);
row.setHeightInPoints(50);
cell = row.createCell(0);
cell.setCellStyle(titleStyle);
cell.setCellValue("副表頭信息1"); // 副標題信息
row = sheet.createRow(2); // 表頭信息
row.setHeightInPoints(30);
for (int i = 0; i < 10; i++) {
sheet.setColumnWidth(i, 2000);
}
// 表頭信息部分
for (int i = 0; i < header.size(); i++) {
cell = row.createCell(i);
cell.setCellValue(header.get(i));
row.getCell(i).setCellStyle(headerStyle);
}
// 添加中間信息空白格(最多爲7條)
for(int i=2; i < 10; i++) {
row = sheet.createRow(i);
row.setHeightInPoints(30);
for(int j=0; j < header.size(); j++) {
cell = row.createCell(j);
cell.setCellValue("");
row.getCell(j).setCellStyle(contextStyle);
}
}
// 簽字信息
row = sheet.createRow(10);
row.setHeightInPoints(200); // 設置行高
// 合併單元格信息
sheet.addMergedRegion(new CellRangeAddress(10, 19, 0, 4)); // 簽字信息1
sheet.addMergedRegion(new CellRangeAddress(10, 10, 5, 9)); // 簽字信息2
sheet.addMergedRegion(new CellRangeAddress(11, 11, 0, 9)); // 說明信息
sheet.addMergedRegion(new CellRangeAddress(12, 12, 0, 7));
sheet.addMergedRegion(new CellRangeAddress(12, 12, 8, 9));
for(int i=0; i < header.size(); i++) {
cell = row.createCell(i);
if(i == 0) {
cell.setCellValue("申請部門負責人意見(簽字):");
}else if(i == 5) {
cell.setCellValue("總經理意見(簽字):");
}
cell.setCellStyle(signatureStyle);
}
// 說明信息
row = sheet.createRow(11);
row.setHeightInPoints(30);
cell = row.createCell(0);
cell.setCellValue("注:此表填寫時一式兩份,一份申請部門留底備查,一份交財務部門。");
cell.setCellStyle(descripStyle);
row = sheet.createRow(12);
row.setHeightInPoints(30);
for(int i=0; i < header.size(); i++) {
cell = row.createCell(i);
if(i == 0){
cell.setCellValue("表號:HRBC-JL-119");
}else if(i == 8) {
cell.setCellValue("記錄標準用紙");
}
cell.setCellStyle(descripStyle);
}
}
// 設置表單,並生成表單
public XSSFSheet genSheet(XSSFWorkbook workbook, String sheetName){
// 生成表單
XSSFSheet sheet = workbook.createSheet(sheetName);
// 設置表單文本居中
sheet.setHorizontallyCenter(true);
sheet.setFitToPage(false);
// 打印時在底部右邊顯示文本頁信息
Footer footer = sheet.getFooter();
footer.setRight( "Page " + HeaderFooter.numPages()+ " Of "+ HeaderFooter.page());
// 打印時在頭部右邊顯示Excel創建日期信息
Header header = sheet.getHeader();
header.setRight("Create Date " + HeaderFooter.date() + " " + HeaderFooter.time());
// 設置打印方式
XSSFPrintSetup ps = sheet.getPrintSetup();
ps.setLandscape(true); // true:橫向打印,false:豎向打印 ,因爲列數較多,推薦在打印時橫向打印
ps.setPaperSize(XSSFPrintSetup.A4_PAPERSIZE); //打印尺寸大小設置爲A4紙大小
return sheet;
}
private static List<String> genHeader() {
List<String> header = new ArrayList<>();
header.add("序號");
header.add("姓名");
header.add("年齡");
header.add("性別");
header.add("聯繫電話");
header.add("身份證");
header.add("地址");
header.add("員工狀態");
return header;
}
// 生成標題樣式
private static XSSFCellStyle genTitleStyle(XSSFWorkbook workbook) {
XSSFCellStyle titleStyle = workbook.createCellStyle();
titleStyle.setAlignment(HorizontalAlignment.CENTER); // 水平居中
titleStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
XSSFFont titleFont = workbook.createFont();
titleFont.setFontHeightInPoints((short) 25); // 設置字號
titleStyle.setFont(titleFont);
return titleStyle;
}
// 生成列頭樣式
private static CellStyle genHeaderStyle(XSSFWorkbook workbook) {
CellStyle headerStyle = workbook.createCellStyle();
headerStyle.setAlignment(HorizontalAlignment.CENTER);
headerStyle.setVerticalAlignment(VerticalAlignment.CENTER);
headerStyle.setBorderBottom(BorderStyle.THIN);
headerStyle.setBorderLeft(BorderStyle.THIN);
headerStyle.setBorderRight(BorderStyle.THIN);
headerStyle.setBorderTop(BorderStyle.THIN);
headerStyle.setWrapText(true); // 自動換行
XSSFFont headerFont = workbook.createFont();
headerFont.setFontHeightInPoints((short) 15);
headerStyle.setFont(headerFont);
return headerStyle;
}
// 生成單元格樣式
private static CellStyle genContextStyle(XSSFWorkbook workbook) {
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);
cellStyle.setBorderTop(BorderStyle.THIN);
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyle.setWrapText(true); // 自動換行
XSSFFont cellFont = workbook.createFont();
cellFont.setFontHeightInPoints((short) 12);
cellStyle.setFont(cellFont);
return cellStyle;
}
// 生成簽字區樣式(帶邊框)
private static CellStyle genSignatureStyle(XSSFWorkbook workbook) {
CellStyle style = workbook.createCellStyle();
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
style.setBorderTop(BorderStyle.THIN);
style.setAlignment(HorizontalAlignment.LEFT);
style.setVerticalAlignment(VerticalAlignment.TOP);
style.setWrapText(true);
style.setHidden(true);
XSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 15);
style.setFont(font);
return style;
}
// 生成說明區樣式
private static CellStyle genDescripStyle(XSSFWorkbook workbook) {
CellStyle style = workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.LEFT);
style.setVerticalAlignment(VerticalAlignment.CENTER);
XSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 12);
style.setFont(font);
return style;
}
// 生成圖片
private static void pictureToSheet2(XSSFWorkbook workbook,XSSFSheet sheet) throws IOException {
// 先把讀進來的圖片放到一個ByteArrayOutputStream中,以便產生ByteArray
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
BufferedImage bufferImg = ImageIO.read(new File("D:/hua.png"));
ImageIO.write(bufferImg, "jpg", byteArrayOut);
// 畫圖的頂級管理器,一個sheet只能獲取一個(一定要注意這點)
XSSFDrawing patriarch = sheet.createDrawingPatriarch();
// anchor主要用於設置圖片的屬性
XSSFClientAnchor anchor = new XSSFClientAnchor(1022, 254, 1023, 100,(short)1, 0, (short)2, 1);
anchor.setAnchorType(2);
//插入圖片
patriarch.createPicture(anchor, workbook.addPicture(byteArrayOut.toByteArray(), XSSFWorkbook.PICTURE_TYPE_JPEG));
}
}