POI使用詳解 POI使用詳解

POI使用詳解

 

Apache POI使用詳解

1.POI結構與經常使用類

(1)POI介紹html

     Apache POI是Apache軟件基金會的開源項目,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。 .NET的開發人員則能夠利用NPOI (POI for .NET) 來存取 Microsoft Office文檔的功能。apache

(2)POI結構說明數組

 

包名稱說明app

HSSF提供讀寫Microsoft Excel XLS格式檔案的功能。ide

XSSF提供讀寫Microsoft Excel OOXML XLSX格式檔案的功能。函數

HWPF提供讀寫Microsoft Word DOC格式檔案的功能。post

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

  1. public class Test00
  2. {
  3.  public static void main(String[] args) throws IOException
  4.  {
  5.  String filePath="d:\\users\\lizw\\桌面\\POI\\sample.xls";//文件路徑
  6.  HSSFWorkbook workbook = new HSSFWorkbook();//建立Excel文件(Workbook)
  7.  HSSFSheet sheet = workbook.createSheet();//建立工做表(Sheet)
  8. sheet = workbook.createSheet("Test");//建立工做表(Sheet)
  9.  FileOutputStream out = new FileOutputStream(filePath);
  10. workbook.write(out);//保存Excel文件
  11. out.close();//關閉文件流
  12.  System.out.println("OK!");
  13.  }
  14. }

(2)建立單元格

  1. HSSFSheet sheet = workbook.createSheet("Test");// 建立工做表(Sheet)
  2. HSSFRow row = sheet.createRow(0);// 建立行,從0開始
  3. HSSFCell cell = row.createCell(0);// 建立行的單元格,也是從0開始
  4. cell.setCellValue("李志偉");// 設置單元格內容
  5. row.createCell(1).setCellValue(false);// 設置單元格內容,重載
  6. row.createCell(2).setCellValue(new Date());// 設置單元格內容,重載
  7. row.createCell(3).setCellValue(12.345);// 設置單元格內容,重載

(3)建立文檔摘要信息

  1. workbook.createInformationProperties();//建立文檔信息
  2. DocumentSummaryInformation dsi=workbook.getDocumentSummaryInformation();//摘要信息
  3. dsi.setCategory("類別:Excel文件");//類別
  4. dsi.setManager("管理者:李志偉");//管理者
  5. dsi.setCompany("公司:--");//公司
  6. SummaryInformation si = workbook.getSummaryInformation();//摘要信息
  7. si.setSubject("主題:--");//主題
  8. si.setTitle("標題:測試文檔");//標題
  9. si.setAuthor("做者:李志偉");//做者
  10. 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:poi@apache.org?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. }
相關文章
相關標籤/搜索