前段时间,看在其他的网站上给出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文档中写入不同格式的数据,以及边框、图片、合并单元格、隐藏与显示行等操作。