天天看點

POI如何使用已有Excel作為模闆二三事

關于POI

POI是Apache的一個開源項目,起初的目标是允許使用者使用java代碼來對Excel進行操作,發展到今天POI本身支援的範圍已經逐漸擴充到對Microsoft Office主要産品,包括:Excel\Word\PPT\Visio的全面支援,目前穩定版本為3.7,開發版本為3.8。

應用場景

本文僅對項目中遇到的,使用已有Excel作為模闆的場景來進行描述。

代碼示例

public void demo(){          try {             // 先讀取模闆              POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(                      "c://demo_template.xls"));              // 基于模闆建立workbook              HSSFWorkbook workbook = new HSSFWorkbook(fs);             // 如果模闆存在多頁的話可以分别取到              HSSFSheet sheet_1st = workbook.getSheetAt(0);              HSSFSheet sheet_2nd = workbook.getSheetAt(1);              // 第一頁,第一行              HSSFRow row = sheet_1st.getRow(0);              // 取第一個單元格              HSSFCell cell = row.getCell(0);              // 擷取單元格字元串值              String cellValue = cell.getStringCellValue();              // 設定單元格的值              cell.setCellValue("demo");              // 設定單元格的樣式              HSSFCellStyle cellStyle  =  workbook.createCellStyle();             cell.setCellStyle(cellStyle);              // 使用公式設定文檔内超連結              cell.setCellFormula(    "HYPERLINK(\"#内容!A1\", \"demo\")");              // 使用HSSFHyperlink對象設定URL超連結              HSSFHyperlink link = new HSSFHyperlin(HSSFHyperlink.LINK_URL);              cell.setHyperlink(link);              String path = "c://demo.xls";              // 輸出Excel              FileOutputStream stream  =   new  FileOutputStream(path);              workbook.write(stream);              stream.flush();              stream.close();         } catch (FileNotFoundException e) {              e.printStackTrace();          } catch (IOException e) {          }      }

特别注意

          1. POI讀取空行空格問題

 POI對空行或空格是不做處理的,如果Excel模闆中第一行和第三行有資料的話,下面的代碼: HSSFRow row = sheet_1st.getRow(1); 取到的是第三行。如果想對第二行進行操作時,需要先建立一行: HSSFRow row_2nd = sheet_2nd.createRow(1); 同樣,單元格的規則也是一樣,通過 row.getCell(index)方法未必是想要的單元格,在使用Excel模闆時要特别注意。
2. CellStyle優化 同樣的CellStyle在workbook中的存在緩存的,具有同樣格式的單元格隻要複用一份CellStyle即可,不要對每個單元格都重新建立CellStyle執行個體。

本文轉自william_xu 51CTO部落格,原文連結:http://blog.51cto.com/williamx/735377,如需轉載請自行聯系原作者