POI導出Excel表

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)創建批註

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFPatriarch patr = sheet.createDrawingPatriarch();
  3. HSSFClientAnchor anchor = patr.createAnchor(0, 0, 0, 0, 5, 1, 8,3);//創建批註位置
  4. HSSFComment comment = patr.createCellComment(anchor);//創建批註
  5. comment.setString(new HSSFRichTextString("這是一個批註段落!"));//設置批註內容
  6. comment.setAuthor("李志偉");//設置批註作者
  7. comment.setVisible(true);//設置批註默認顯示
  8. HSSFCell cell = sheet.createRow(2).createCell(1);
  9. cell.setCellValue("測試");
  10. cell.setCellComment(comment);//把批註賦值給單元格

     創建批註位置HSSFPatriarch.createAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2)方法參數說明:

  1. dx1 1個單元格中x軸的偏移量
  2. dy1 1個單元格中y軸的偏移量
  3. dx2 2個單元格中x軸的偏移量
  4. dy2 2個單元格中y軸的偏移量
  5. col1 1個單元格的列號
  6. row1 1個單元格的行號
  7. col2 2個單元格的列號
  8. row2 2個單元格的行號

(5)創建頁眉和頁腳

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFHeader header =sheet.getHeader();//得到頁眉
  3. header.setLeft("頁眉左邊");
  4. header.setRight("頁眉右邊");
  5. header.setCenter("頁眉中間");
  6. HSSFFooter footer =sheet.getFooter();//得到頁腳
  7. footer.setLeft("頁腳左邊");
  8. footer.setRight("頁腳右邊");
  9. footer.setCenter("頁腳中間");

     也可以使用Office自帶的標籤定義,你可以通過HSSFHeader或HSSFFooter訪問到它們,都是靜態屬性,列表如下:

  1. HSSFHeader.tab &表名
  2. HSSFHeader.file &文件名
  3. HSSFHeader.startBold &粗體開始
  4. HSSFHeader.endBold &粗體結束
  5. HSSFHeader.startUnderline &下劃線開始
  6. HSSFHeader.endUnderline &下劃線結束
  7. HSSFHeader.startDoubleUnderline &雙下劃線開始
  8. HSSFHeader.endDoubleUnderline &雙下劃線結束
  9. HSSFHeader.time &時間
  10. HSSFHeader.date &日期
  11. HSSFHeader.numPages &總頁面數
  12. HSSFHeader.page &當前頁號

3.Excel的單元格操作

(1)設置格式

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFRow row=sheet.createRow(0);
  3. //設置日期格式--使用Excel內嵌的格式
  4. HSSFCell cell=row.createCell(0);
  5. cell.setCellValue(new Date());
  6. HSSFCellStyle style=workbook.createCellStyle();
  7. style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
  8. cell.setCellStyle(style);
  9. //設置保留2位小數--使用Excel內嵌的格式
  10. cell=row.createCell(1);
  11. cell.setCellValue(12.3456789);
  12. style=workbook.createCellStyle();
  13. style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
  14. cell.setCellStyle(style);
  15. //設置貨幣格式--使用自定義的格式
  16. cell=row.createCell(2);
  17. cell.setCellValue(12345.6789);
  18. style=workbook.createCellStyle();
  19. style.setDataFormat(workbook.createDataFormat().getFormat("¥#,##0"));
  20. cell.setCellStyle(style);
  21. //設置百分比格式--使用自定義的格式
  22. cell=row.createCell(3);
  23. cell.setCellValue(0.123456789);
  24. style=workbook.createCellStyle();
  25. style.setDataFormat(workbook.createDataFormat().getFormat("0.00%"));
  26. cell.setCellStyle(style);
  27. //設置中文大寫格式--使用自定義的格式
  28. cell=row.createCell(4);
  29. cell.setCellValue(12345);
  30. style=workbook.createCellStyle();
  31. style.setDataFormat(workbook.createDataFormat().getFormat("[DbNum2][$-804]0"));
  32. cell.setCellStyle(style);
  33. //設置科學計數法格式--使用自定義的格式
  34. cell=row.createCell(5);
  35. cell.setCellValue(12345);
  36. style=workbook.createCellStyle();
  37. style.setDataFormat(workbook.createDataFormat().getFormat("0.00E+00"));
  38. cell.setCellStyle(style);

     HSSFDataFormat.getFormat和HSSFDataFormat.getBuiltinFormat的區別: 當使用Excel內嵌的(或者說預定義)的格式時,直接用HSSFDataFormat.getBuiltinFormat靜態方法即可。當使用自己定義的格式時,必須先調用HSSFWorkbook.createDataFormat(),因爲這時在底層會先找有沒有匹配的內嵌FormatRecord,如果沒有就會新建一個FormatRecord,所以必須先調用這個方法,然後你就可以用獲得的HSSFDataFormat實例的getFormat方法了,當然相對而言這種方式比較麻煩,所以內嵌格式還是用HSSFDataFormat.getBuiltinFormat靜態方法更加直接一些。

(2)合併單元格

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFRow row=sheet.createRow(0);
  3. //合併列
  4. HSSFCell cell=row.createCell(0);
  5. cell.setCellValue("合併列");
  6. CellRangeAddress region=new CellRangeAddress(0, 0, 0, 5);
  7. sheet.addMergedRegion(region);
  8. //合併行
  9. cell=row.createCell(6);
  10. cell.setCellValue("合併行");
  11. region=new CellRangeAddress(0, 5, 6, 6);
  12. sheet.addMergedRegion(region);

     CellRangeAddress對象其實就是表示一個區域,其構造方法如下:CellRangeAddress(firstRow, lastRow, firstCol, lastCol),參數的說明:

  1. firstRow 區域中第一個單元格的行號
  2. lastRow 區域中最後一個單元格的行號
  3. firstCol 區域中第一個單元格的列號
  4. lastCol 區域中最後一個單元格的列號

     提示: 即使你沒有用CreateRow和CreateCell創建過行或單元格,也完全可以直接創建區域然後把這一區域合併,Excel的區域合併信息是單獨存儲的,和RowRecord、ColumnInfoRecord不存在直接關係。

(3)單元格對齊

  1. HSSFCell cell=row.createCell(0);
  2. cell.setCellValue("單元格對齊");
  3. HSSFCellStyle style=workbook.createCellStyle();
  4. style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
  5. style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
  6. style.setWrapText(true);//自動換行
  7. style.setIndention((short)5);//縮進
  8. style.setRotation((short)60);//文本旋轉,這裏的取值是從-90到90,而不是0-180度。
  9. cell.setCellStyle(style);

     水平對齊相關參數

  1. 如果是左側對齊就是 HSSFCellStyle.ALIGN_FILL;
  2. 如果是居中對齊就是 HSSFCellStyle.ALIGN_CENTER;
  3. 如果是右側對齊就是 HSSFCellStyle.ALIGN_RIGHT;
  4. 如果是跨列舉中就是 HSSFCellStyle.ALIGN_CENTER_SELECTION;
  5. 如果是兩端對齊就是 HSSFCellStyle.ALIGN_JUSTIFY;
  6. 如果是填充就是 HSSFCellStyle.ALIGN_FILL;

     垂直對齊相關參數

  1. 如果是靠上就是 HSSFCellStyle.VERTICAL_TOP;
  2. 如果是居中就是 HSSFCellStyle.VERTICAL_CENTER;
  3. 如果是靠下就是 HSSFCellStyle.VERTICAL_BOTTOM;
  4. 如果是兩端對齊就是 HSSFCellStyle.VERTICAL_JUSTIFY;

(4)使用邊框

     邊框和其他單元格設置一樣也是調用CellStyle接口,CellStyle有2種和邊框相關的屬性,分別是:

邊框相關屬性

說明

範例

Border+ 方向

邊框類型

BorderLeft, BorderRight 等

方向 +BorderColor

邊框顏色

TopBorderColor,BottomBorderColor 等

  1. HSSFCell cell=row.createCell(1);
  2. cell.setCellValue("設置邊框");
  3. HSSFCellStyle style=workbook.createCellStyle();
  4. style.setBorderTop(HSSFCellStyle.BORDER_DOTTED);//上邊框
  5. style.setBorderBottom(HSSFCellStyle.BORDER_THICK);//下邊框
  6. style.setBorderLeft(HSSFCellStyle.BORDER_DOUBLE);//左邊框
  7. style.setBorderRight(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);//右邊框
  8. style.setTopBorderColor(HSSFColor.RED.index);//上邊框顏色
  9. style.setBottomBorderColor(HSSFColor.BLUE.index);//下邊框顏色
  10. style.setLeftBorderColor(HSSFColor.GREEN.index);//左邊框顏色
  11. style.setRightBorderColor(HSSFColor.PINK.index);//右邊框顏色
  12. 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)設置字體

  1. HSSFCell cell = row.createCell(1);
  2. cell.setCellValue("設置字體");
  3. HSSFCellStyle style = workbook.createCellStyle();
  4. HSSFFont font = workbook.createFont();
  5. font.setFontName("華文行楷");//設置字體名稱
  6. font.setFontHeightInPoints((short)28);//設置字號
  7. font.setColor(HSSFColor.RED.index);//設置字體顏色
  8. font.setUnderline(FontFormatting.U_SINGLE);//設置下劃線
  9. font.setTypeOffset(FontFormatting.SS_SUPER);//設置上標下標
  10. font.setStrikeout(true);//設置刪除線
  11. style.setFont(font);
  12. 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)背景和紋理

  1. HSSFCellStyle style = workbook.createCellStyle();
  2. style.setFillForegroundColor(HSSFColor.GREEN.index);//設置圖案顏色
  3. style.setFillBackgroundColor(HSSFColor.RED.index);//設置圖案背景色
  4. style.setFillPattern(HSSFCellStyle.SQUARES);//設置圖案樣式
  5. 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)設置寬度和高度

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFRow row = sheet.createRow(1);
  3. HSSFCell cell = row.createCell(1);
  4. cell.setCellValue("123456789012345678901234567890");
  5. sheet.setColumnWidth(1, 31 * 256);//設置第一列的寬度是31個字符寬度
  6. 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)方法,例如:

  1. HSSFCell cell = row.createCell(1);
  2. cell.setCellValue(new Date());//設置日期數據
  3. System.out.println(DateUtil.isCellDateFormatted(cell));//輸出:false
  4. HSSFCellStyle style =workbook.createCellStyle();
  5. style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
  6. cell.setCellStyle(style);//設置日期樣式
  7. System.out.println(DateUtil.isCellDateFormatted(cell));//輸出:true

4.使用Excel公式

(1)基本計算

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFRow row = sheet.createRow(0);
  3. HSSFCell cell = row.createCell(0);
  4. cell.setCellFormula("2+3*4");//設置公式
  5. cell = row.createCell(1);
  6. cell.setCellValue(10);
  7. cell = row.createCell(2);
  8. cell.setCellFormula("A1*B1");//設置公式

(2)SUM函數

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFRow row = sheet.createRow(0);
  3. row.createCell(0).setCellValue(1);
  4. row.createCell(1).setCellValue(2);
  5. row.createCell(2).setCellValue(3);
  6. row.createCell(3).setCellValue(4);
  7. row.createCell(4).setCellValue(5);
  8. row = sheet.createRow(1);
  9. row.createCell(0).setCellFormula("sum(A1,C1)");//等價於"A1+C1"
  10. row.createCell(1).setCellFormula("sum(B1:D1)");//等價於"B1+C1+D1"

(3)日期函數

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFCellStyle style=workbook.createCellStyle();
  3. style.setDataFormat(workbook.createDataFormat().getFormat("yyyy-mm-dd"));
  4. HSSFRow row = sheet.createRow(0);
  5. Calendar date=Calendar.getInstance();//日曆對象
  6. HSSFCell cell=row.createCell(0);
  7. date.set(2011,2, 7);
  8. cell.setCellValue(date.getTime());
  9. cell.setCellStyle(style);//第一個單元格開始時間設置完成
  10. cell=row.createCell(1);
  11. date.set(2014,4, 25);
  12. cell.setCellValue(date.getTime());
  13. cell.setCellStyle(style);//第一個單元格結束時間設置完成
  14. cell=row.createCell(3);
  15. cell.setCellFormula("CONCATENATE(DATEDIF(A1,B1,\"y\"),\"年\")");
  16. cell=row.createCell(4);
  17. cell.setCellFormula("CONCATENATE(DATEDIF(A1,B1,\"m\"),\"月\")");
  18. cell=row.createCell(5);
  19. 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)字符串相關函數

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFRow row = sheet.createRow(0);
  3. row.createCell(0).setCellValue("abcdefg");
  4. row.createCell(1).setCellValue("aa bb cc dd ee fF GG");
  5. row.createCell(3).setCellFormula("UPPER(A1)");
  6. row.createCell(4).setCellFormula("PROPER(B1)");

    

以上代碼中的公式說明:

     UPPER( String ) :將文本轉換成大寫形式。

 

          PROPER( String ) :將文字串的首字母及任何非字母字符之後的首字母轉換成大寫。將其餘的字母轉換成小寫。

          更多 Excel 的字符串函數可參考:http://tonyqus.sinaapp.com/archives/289

(5)IF函數

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFRow row = sheet.createRow(0);
  3. row.createCell(0).setCellValue(12);
  4. row.createCell(1).setCellValue(23);
  5. 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函數

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFRow row = sheet.createRow(0);
  3. row.createCell(0).setCellValue(57);
  4. row.createCell(1).setCellValue(89);
  5. row.createCell(2).setCellValue(56);
  6. row.createCell(3).setCellValue(67);
  7. row.createCell(4).setCellValue(60);
  8. row.createCell(5).setCellValue(73);
  9. row.createCell(7).setCellFormula("COUNTIF(A1:F1,\">=60\")");
  10. 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函數

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFRow row = sheet.createRow(0);
  3. row.createCell(0).setCellValue(0);
  4. row.createCell(1).setCellValue(59);
  5. row.createCell(2).setCellValue("不及格");
  6. row = sheet.createRow(1);
  7. row.createCell(0).setCellValue(60);
  8. row.createCell(1).setCellValue(69);
  9. row.createCell(2).setCellValue("及格");
  10. row = sheet.createRow(2);
  11. row.createCell(0).setCellValue(70);
  12. row.createCell(1).setCellValue(79);
  13. row.createCell(2).setCellValue("良好");
  14. row = sheet.createRow(3);
  15. row.createCell(0).setCellValue(80);
  16. row.createCell(1).setCellValue(100);
  17. row.createCell(2).setCellValue("優秀");
  18. row = sheet.createRow(4);
  19. row.createCell(0).setCellValue(75);
  20. row.createCell(1).setCellFormula("LOOKUP(A5,$A$1:$A$4,$C$1:$C$4)");
  21. 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)隨機數函數

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFRow row = sheet.createRow(0);
  3. row.createCell(0).setCellFormula("RAND()");//取0-1之間的隨機數
  4. row.createCell(1).setCellFormula("int(RAND()*100)");//取0-100之間的隨機整數
  5. row.createCell(2).setCellFormula("rand()*10+10");//取10-20之間的隨機實數
  6. row.createCell(3).setCellFormula("CHAR(INT(RAND()*26)+97)");//隨機小寫字母
  7. row.createCell(4).setCellFormula("CHAR(INT(RAND()*26)+65)");//隨機大寫字母
  8. //隨機大小寫字母
  9. row.createCell(5).setCellFormula("CHAR(INT(RAND()*26)+if(INT(RAND()*2)=0,97,65))");

     以上代碼中的公式說明:

          上面幾例中除了用到RAND函數以外,還用到了CHAR函數用來將ASCII碼換爲字母,INT函數用來取整。值得注意的是INT函數不會四捨五入,無論小數點後是多少都會被捨去。

(9)獲得公式的返回值

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFRow row = sheet.createRow(0);
  3. row.createCell(0).setCellValue(7);//A1
  4. row.createCell(1).setCellValue(8);//B1
  5. HSSFCell cell=row.createCell(2);
  6. cell.setCellFormula("A1*B1+14");
  7. HSSFFormulaEvaluator e = newHSSFFormulaEvaluator(workbook);
  8. cell = e.evaluateInCell(cell);//若Excel文件不是POI創建的,則不必調用此方法
  9. System.out.println("公式計算結果:"+cell.getNumericCellValue());

5.使用圖形

(1)畫線

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFPatriarch patriarch=sheet.createDrawingPatriarch();
  3. HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0,(short)1, 0,(short)4, 4);
  4. HSSFSimpleShape line = patriarch.createSimpleShape(anchor);
  5. line.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);//設置圖形類型
  6. line.setLineStyle(HSSFShape.LINESTYLE_SOLID);//設置圖形樣式
  7. 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)畫矩形

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFPatriarch patriarch=sheet.createDrawingPatriarch();
  3. HSSFClientAnchor anchor = new HSSFClientAnchor(255,122,255, 122, (short)1, 0,(short)4, 3);
  4. HSSFSimpleShape rec = patriarch.createSimpleShape(anchor);
  5. rec.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);
  6. rec.setLineStyle(HSSFShape.LINESTYLE_DASHGEL);//設置邊框樣式
  7. rec.setFillColor(255, 0, 0);//設置填充色
  8. rec.setLineWidth(25400);//設置邊框寬度
  9. rec.setLineStyleColor(0, 0, 255);//設置邊框顏色

(3)畫圓形

     更改上例的代碼如下:

         rec.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);//設置圖片類型

(4)畫Grid

     在POI中,本身沒有畫Grid(網格)的方法。但我們知道Grid其實就是由橫線和豎線構成的,所在我們可以通過畫線的方式來模擬畫Grid。代碼如下:

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. HSSFRow row = sheet.createRow(2);
  3. row.createCell(1);
  4. row.setHeightInPoints(240);
  5. sheet.setColumnWidth(2, 9000);
  6. int linesCount = 20;
  7. HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
  8. //因爲HSSFClientAnchor中dx只能在0-1023之間,dy只能在0-255之間,這裏採用比例的方式
  9. double xRatio = 1023.0 / (linesCount * 10);
  10. double yRatio = 255.0 / (linesCount * 10);
  11. // 畫豎線
  12. int x1 = 0;
  13. int y1 = 0;
  14. int x2 = 0;
  15. int y2 = 200;
  16. for (int i = 0; i < linesCount; i++)
  17. {
  18.  HSSFClientAnchor a2 = new HSSFClientAnchor();
  19. a2.setAnchor((short) 2, 2, (int) (x1 * xRatio),
  20.  (int) (y1 * yRatio), (short) 2, 2, (int) (x2 * xRatio),
  21.  (int) (y2 * yRatio));
  22.  HSSFSimpleShape shape2 = patriarch.createSimpleShape(a2);
  23. shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
  24. x1 += 10;
  25. x2 += 10;
  26. }
  27. // 畫橫線
  28. x1 = 0;
  29. y1 = 0;
  30. x2 = 200;
  31. y2 = 0;
  32. for (int i = 0; i < linesCount; i++)
  33. {
  34.  HSSFClientAnchor a2 = new HSSFClientAnchor();
  35. a2.setAnchor((short) 2, 2, (int) (x1 * xRatio),
  36.  (int) (y1 * yRatio), (short) 2, 2, (int) (x2 * xRatio),
  37.  (int) (y2 * yRatio));
  38.  HSSFSimpleShape shape2 = patriarch.createSimpleShape(a2);
  39. shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
  40. y1 += 10;
  41. y2 += 10;
  42. }

 

(5)插入圖片

  1. HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
  2. FileInputStream stream=newFileInputStream("d:\\POI\\Apache.gif");
  3. byte[] bytes=new byte[(int)stream.getChannel().size()];
  4. stream.read(bytes);//讀取圖片到二進制數組
  5. int pictureIdx = workbook.addPicture(bytes,HSSFWorkbook.PICTURE_TYPE_JPEG);
  6. HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
  7. HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0,(short)0, 0, (short)5, 5);
  8. HSSFPicture pict = patriarch.createPicture(anchor,pictureIdx);
  9. //pict.resize();//自動調節圖片大小,圖片位置信息可能丟失

(6)從Excel文件提取圖片

  1. InputStream inp = new FileInputStream(filePath);
  2. HSSFWorkbook workbook = new HSSFWorkbook(inp);//讀取現有的Excel文件
  3. List<HSSFPictureData> pictures = workbook.getAllPictures();
  4. for(int i=0;i<pictures.size();i++)
  5. {
  6.  HSSFPictureData pic=pictures.get(i);
  7.  String ext = pic.suggestFileExtension();
  8.  if (ext.equals("png"))//判斷文件格式
  9.  {
  10.  FileOutputStream png=newFileOutputStream("d:\\POI\\Apache.png");
  11. png.write(pic.getData());
  12. png.close();//保存圖片
  13.  }
  14. }

6.Excel表操作

(1)設置默認工作表

  1. HSSFWorkbook workbook = new HSSFWorkbook();// 創建Excel文件(Workbook)
  2. workbook.createSheet("Test0");// 創建工作表(Sheet)
  3. workbook.createSheet("Test1");// 創建工作表(Sheet)
  4. workbook.createSheet("Test2");// 創建工作表(Sheet)
  5. workbook.createSheet("Test3");// 創建工作表(Sheet)
  6. workbook.setActiveSheet(2);//設置默認工作表

(2)重命名工作表

  1. HSSFWorkbook workbook = new HSSFWorkbook();// 創建Excel文件(Workbook)
  2. workbook.createSheet("Test0");// 創建工作表(Sheet)
  3. workbook.createSheet("Test1");// 創建工作表(Sheet)
  4. workbook.createSheet("Test2");// 創建工作表(Sheet)
  5. workbook.createSheet("Test3");// 創建工作表(Sheet)
  6. workbook.setSheetName(2, "1234");//重命名工作表

(3)調整表單顯示比例

  1. HSSFWorkbook workbook = new HSSFWorkbook();// 創建Excel文件(Workbook)
  2. HSSFSheet sheet1= workbook.createSheet("Test0");// 創建工作表(Sheet)
  3. HSSFSheet sheet2=workbook.createSheet("Test1");// 創建工作表(Sheet)
  4. HSSFSheet sheet3=workbook.createSheet("Test2");// 創建工作表(Sheet)
  5. sheet1.setZoom(1,2);//50%顯示比例
  6. sheet2.setZoom(2,1);//200%顯示比例
  7. sheet3.setZoom(1,10);//10%顯示比例

(4)顯示/隱藏網格線

  1. HSSFWorkbook workbook = new HSSFWorkbook();// 創建Excel文件(Workbook)
  2. HSSFSheet sheet1= workbook.createSheet("Test0");// 創建工作表(Sheet)
  3. HSSFSheet sheet2=workbook.createSheet("Test1");// 創建工作表(Sheet)
  4. sheet1.setDisplayGridlines(false);//隱藏Excel網格線,默認值爲true
  5. sheet2.setGridsPrinted(true);//打印時顯示網格線,默認值爲false

(5)遍歷Sheet

  1. String filePath = "d:\\users\\lizw\\桌面\\POI\\sample.xls";
  2. FileInputStream stream = new FileInputStream(filePath);
  3. HSSFWorkbook workbook = new HSSFWorkbook(stream);//讀取現有的Excel
  4. HSSFSheet sheet= workbook.getSheet("Test0");//得到指定名稱的Sheet
  5. for (Row row : sheet)
  6. {
  7.  for (Cell cell : row)
  8.  {
  9.  System.out.print(cell + "\t");
  10.  }
  11.  System.out.println();
  12. }

7.Excel行列操作

(1)組合行、列

  1. HSSFSheet sheet= workbook.createSheet("Test0");// 創建工作表(Sheet)
  2. sheet.groupRow(1, 3);//組合行
  3. sheet.groupRow(2, 4);//組合行
  4. sheet.groupColumn(2, 7);//組合列

     這裏簡單的介紹一下什麼叫做組合:組合分爲行組合和列組合,所謂行組合,就是讓n行組合成一個集合,能夠進行展開和合攏操作。

     使用POI也可以取消組合,例如:sheet.ungroupColumn(1, 3);//取消列組合

(2)鎖定列

     在Excel中,有時可能會出現列數太多或是行數太多的情況,這時可以通過鎖定列來凍結部分列,不隨滾動條滑動,方便查看。

  1. HSSFSheet sheet= workbook.createSheet("Test0");// 創建工作表(Sheet)
  2. sheet.createFreezePane(2, 3, 15, 25);//凍結行列

     下面對CreateFreezePane的參數作一下說明:

          第一個參數表示要凍結的列數;

          第二個參數表示要凍結的行數,這裏只凍結列所以爲0;

          第三個參數表示右邊區域可見的首列序號,從1開始計算;

          第四個參數表示下邊區域可見的首行序號,也是從1開始計算,這裏是凍結列,所以爲0;

(3)上下移動行

  1. FileInputStream stream = new FileInputStream(filePath);
  2. HSSFWorkbook workbook = new HSSFWorkbook(stream);
  3. HSSFSheet sheet = workbook.getSheet("Test0");
  4. sheet.shiftRows(2, 4, 2);//把第3行到第4行向下移動兩行

     HSSFSheet.shiftRows(startRow, endRow, n)參數說明

          startRow:需要移動的起始行;

          endRow:需要移動的結束行;

          n:移動的位置,正數表示向下移動,負數表示向上移動;

 

8.Excel的其他功能

(1)設置密碼
  1. HSSFSheet sheet= workbook.createSheet("Test0");// 創建工作表(Sheet)
  2. HSSFRow row=sheet.createRow(1);
  3. HSSFCell cell=row.createCell(1);
  4. cell.setCellValue("已鎖定");
  5. HSSFCellStyle locked = workbook.createCellStyle();
  6. locked.setLocked(true);//設置鎖定
  7. cell.setCellStyle(locked);
  8. cell=row.createCell(2);
  9. cell.setCellValue("未鎖定");
  10. HSSFCellStyle unlocked = workbook.createCellStyle();
  11. unlocked.setLocked(false);//設置不鎖定
  12. cell.setCellStyle(unlocked);
  13. sheet.protectSheet("password");//設置保護密碼
(2)數據有效性
  1. HSSFSheet sheet= workbook.createSheet("Test0");// 創建工作表(Sheet)
  2. HSSFRow row=sheet.createRow(0);
  3. HSSFCell cell=row.createCell(0);
  4. cell.setCellValue("日期列");
  5. CellRangeAddressList regions = new CellRangeAddressList(1, 65535,0, 0);//選定一個區域
  6. DVConstraint constraint = DVConstraint.createDateConstraint(DVConstraint . OperatorType . BETWEEN , "1993-01-01" ,"2014-12-31" , "yyyy-MM-dd" );
  7. HSSFDataValidation dataValidate = new HSSFDataValidation(regions,constraint);
  8. dataValidate.createErrorBox("錯誤", "你必須輸入一個時間!");
  9. sheet.addValidationData(dataValidate);

CellRangeAddressList類表示一個區域,構造函數中的四個參數分別表示起始行序號,終止行序號,起始列序號,終止列序號。65535是一個Sheet的最大行數。另外,CreateDateConstraint的第一個參數除了設置成DVConstraint.OperatorType.BETWEEN外,還可以設置成如下一些值,大家可以自己一個個去試看看效果:

驗證的數據類型也有幾種選擇,如下:

(3)生成下拉式菜單

  1. CellRangeAddressList regions = new CellRangeAddressList(0, 65535,0, 0);
  2. DVConstraint constraint =DVConstraint.createExplicitListConstraint(new String[] { "C++","Java", "C#" });
  3. HSSFDataValidation dataValidate = new HSSFDataValidation(regions,constraint);
  4. sheet.addValidationData(dataValidate);

(4)打印基本設置

  1. HSSFSheet sheet= workbook.createSheet("Test0");// 創建工作表(Sheet)
  2. HSSFPrintSetup print = sheet.getPrintSetup();//得到打印對象
  3. print.setLandscape(false);//true,則表示頁面方向爲橫向;否則爲縱向
  4. print.setScale((short)80);//縮放比例80%(設置爲0-100之間的值)
  5. print.setFitWidth((short)2);//設置頁寬
  6. print.setFitHeight((short)4);//設置頁高
  7. print.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);//紙張設置
  8. print.setUsePage(true);//設置打印起始頁碼不使用"自動"
  9. print.setPageStart((short)6);//設置打印起始頁碼
  10. sheet.setPrintGridlines(true);//設置打印網格線
  11. print.setNoColor(true);//值爲true時,表示單色打印
  12. print.setDraft(true);//值爲true時,表示用草稿品質打印
  13. print.setLeftToRight(true);//true表示“先行後列”;false表示“先列後行”
  14. print.setNotes(true);//設置打印批註
  15. sheet.setAutobreaks(false);//Sheet頁自適應頁面大小

更詳細的打印設置請參考: http://tonyqus.sinaapp.com/archives/271

(5)超鏈接

  1. HSSFSheet sheet = workbook.createSheet("Test0");
  2. CreationHelper createHelper = workbook.getCreationHelper();
  3. // 關聯到網站
  4. Hyperlink link =createHelper.createHyperlink(Hyperlink.LINK_URL);
  5. link.setAddress("http://poi.apache.org/");
  6. sheet.createRow(0).createCell(0).setHyperlink(link);
  7. // 關聯到當前目錄的文件
  8. link = createHelper.createHyperlink(Hyperlink.LINK_FILE);
  9. link.setAddress("sample.xls");
  10. sheet.createRow(0).createCell(1).setHyperlink(link);
  11. // e-mail 關聯
  12. link = createHelper.createHyperlink(Hyperlink.LINK_EMAIL);
  13. link.setAddress("mailto:[email protected]?subject=Hyperlinks");
  14. sheet.createRow(0).createCell(2).setHyperlink(link);
  15. //關聯到工作簿中的位置
  16. link = createHelper.createHyperlink(Hyperlink.LINK_DOCUMENT);
  17. link.setAddress("'Test0'!C3");//Sheet名爲Test0的C3位置
  18. sheet.createRow(0).createCell(3).setHyperlink(link);

9.POI對Word的基本操作

(1)POI操作Word簡介

POI讀寫Excel功能強大、操作簡單。但是POI操作時,一般只用它讀取word文檔,POI只能能夠創建簡單的word文檔,相對而言POI操作時的功能太少。

(2)POI創建Word文檔的簡單示例

  1. XWPFDocument doc = new XWPFDocument();// 創建Word文件
  2. XWPFParagraph p = doc.createParagraph();// 新建一個段落
  3. p.setAlignment(ParagraphAlignment.CENTER);// 設置段落的對齊方式
  4. p.setBorderBottom(Borders.DOUBLE);//設置下邊框
  5. p.setBorderTop(Borders.DOUBLE);//設置上邊框
  6. p.setBorderRight(Borders.DOUBLE);//設置右邊框
  7. p.setBorderLeft(Borders.DOUBLE);//設置左邊框
  8. XWPFRun r = p.createRun();//創建段落文本
  9. r.setText("POI創建的Word段落文本");
  10. r.setBold(true);//設置爲粗體
  11. r.setColor("FF0000");//設置顏色
  12. = doc.createParagraph();// 新建一個段落
  13. = p.createRun();
  14. r.setText("POI讀寫Excel功能強大、操作簡單。");
  15. XWPFTable table= doc.createTable(3, 3);//創建一個表格
  16. table.getRow(0).getCell(0).setText("表格1");
  17. table.getRow(1).getCell(1).setText("表格2");
  18. table.getRow(2).getCell(2).setText("表格3");
  19. FileOutputStream out = newFileOutputStream("d:\\POI\\sample.doc");
  20. doc.write(out);
  21. out.close();

(3)POI讀取Word文檔裏的文字

  1. FileInputStream stream = newFileInputStream("d:\\POI\\sample.doc");
  2. XWPFDocument doc = new XWPFDocument(stream);// 創建Word文件
  3. for(XWPFParagraph p : doc.getParagraphs())//遍歷段落
  4. {
  5.  System.out.print(p.getParagraphText());
  6. }
  7. for(XWPFTable table : doc.getTables())//遍歷表格
  8. {
  9.  for(XWPFTableRow row : table.getRows())
  10.  {
  11.  for(XWPFTableCell cell : row.getTableCells())
  12.  {
  13.  System.out.print(cell.getText());
  14.  }
  15.  }
  16. }

 

-----------------------------------------------------------------------------------------------------------

實例如下:

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));
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章