前段時間,看在其他的網站上給出Excel文檔的導入與導出操作,感覺很酷的樣子,所以就學習了一下如何使用POI進行Excel的操作,現在對之前的學習過程進行一個總結。
一、現在普遍使用的Excel文檔有xls以及xlsx這兩種Excel文檔,其中xls格式的Excel文檔又分為5.0/95工作簿以及97-2003工作簿這兩種。需要注意的是,由於5.0/95工作簿的版本太低,現在的POI文檔不再支持這種類型的Excel文檔的讀取工作,當試圖讀取這種類型的Excel文檔的時候,POI會拋出一個異常(OldExcelFormatException)。我現在使用的POI是3.14版本。
二、Workbook的創建
1、由於Excel中存在xls以及xlsx這兩種格式,所以創建方式也有所不同。其中對於xls格式的文檔,需要使用HSSFWorkbook來創建工作簿對象,而對於xlsx格式的Excel文檔,則需要使用XSSFWrokbook來創建工作簿。有一點需要注意的是,HSSFWorkbook與XSSFWorkbook這兩個類其實都是Workbook接口的一個實現類。好了,下面就是創建工作簿對象的代碼:
//創建一個不存在的excel文件 private static Workbook createWorkbookIfNotExist(String fileName) throws Exception { Workbook wb = null; if(fileName.endsWith(".xls")) { wb = new HSSFWorkbook(); } else if(fileName.endsWith(".xlsx")) { wb = new XSSFWorkbook(); } else { throw new Exception("文件類型錯誤!"); } try{ OutputStream output = new FileOutputStream(fileName); wb.write(output); }catch(FileNotFoundException e) { System.out.println("文件創建失敗,失敗原因為:" + e.getMessage()); throw new FileNotFoundException(); } System.out.println(fileName + "文件創建成功!"); return wb; } //創建一個新的或者已存在的Excel文檔的Workbook public static Workbook createWorkbook(String fileName) throws Exception { InputStream input = null; Workbook wb = null; try{ input = new FileInputStream(fileName); wb = WorkbookFactory.create(input); } catch(FileNotFoundException e) { System.out.println("要打開的文件不存在,正試圖創建該文件,請稍后……!"); wb = createWorkbookIfNotExist(fileName); } catch(OldExcelFormatException e) { System.out.println("文件打開失敗,原因:要打開的Excel文件版本過低!"); throw new OldExcelFormatException("文件版本過低"); } finally { if(input != null) { input.close(); } } return wb; }
2、創建Sheet的時候,同樣的也存在HSSFSheet以及XSSHSheet這兩種類型。同樣的HSSFSheet以及XSSFSheet這兩個類也是Sheet接口的實現類。如果直接使用實現類進行創建Sheet的話,那么,對於不同的格式,需要使用不同的實現方式,盡管實現的方式都一致。由於Java的多態關系,在這里,我使用Sheet接口進行處理。代碼:
//創建sheet public static Sheet createSheet(Workbook wb , String sheetName) { Sheet sheet = wb.getSheet(sheetName); if(sheet == null) { System.out.println("表單" + sheetName + "不存在,試圖創建該sheet,請稍后……"); sheet = wb.createSheet(sheetName); System.out.println("名為" + sheetName +"的sheet創建成功!"); } return sheet; }
3、對於Row的創建,也是一樣,也是使用Row這個接口進行實現。代碼:
//創建行row public static Row createRow(Sheet sheet , int rowNum) { Row row = sheet.getRow(rowNum); if(row == null) { System.out.println("行號為:" + rowNum + "的行不存在,正試圖創建該行,請稍后……"); row = sheet.createRow(rowNum); System.out.println("行號為:" + rowNum + "的行創建成功!"); } return row; }
4、對於Cell也是一樣,同樣使用Cell接口進行編程。代碼:
//創建單元格cell public static Cell createCell(Row row , int cellNum) { Cell cell = row.getCell(cellNum); if(cell == null) { System.out.println("該單元格不存在,正在試圖創建該單元格,請稍后……"); cell = row.createCell(cellNum); System.out.println("該單元格創建成功!"); } return cell; }
以上幾個操作就是Workbook、Sheet、Row以及Cell的創建工作。另外,當對Excel文檔操作完成之后,需要使用Workbook的write方法保存一下,然后上述的改動才會保存在你創建的Excel文檔中。代碼:
wb03.write(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\03styleExcel.xls")); wb07.write(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\07styleExcel.xlsx"));
其中wb03就是使用上述方法創建的xls格式的Excel文檔,wb07則是xlsx格式的文檔。
好了,這篇博文到這里就結束了。如果文章中有什么錯誤或不足的地方,希望各位大俠多多指點。后面的博文,會陸續介紹如何往Excel文檔中寫入不同格式的數據,以及邊框、圖片、合並單元格、隱藏與顯示行等操作。