Apache POI处理Excel文档

  1. 前一段时间Java处理Excel文件都是使用JXL这个库,后来发现这个库并不支持xlsx这种高版本的格式,并且不能处理大量的数据,就找到了POI这个库

1:Apache POI 是什么

  1. Apache POI项目的任务是根据Office Open XML标准(OOXML)和MicrosoftOLE 2复合文档格式(OLE2)创建和维护Java API,以处理各种文件格式。简而言之,可以使用Java读取和写入Microsoft Excel文件。此外,您可以使用Java读取和写入Microsoft WordMicrosoft PowerPoint文件

1.1 Apache POI环境

在Pom.xml中引入需要的包,也可以在https://poi.apache.org/download.ht 下载并引入包。

  1. <dependency>
  2. <groupId>org.apache.poi</groupId>
  3. <artifactId>poi</artifactId>
  4. <version>3.16</version>
  5. </dependency>

【20180927】Java   Excel常用SDK Sample - 图1

1.2 创建一个SHEET

创建一个sheet的步骤时首先必须来创建一个工作簿对象(XSSFWorkbook),第二不就是在使用XSSFWorkbook对象创建一个sheet。

  1. //创件一个工作簿
  2. XSSFWorkbook workbook = new XSSFWorkbook();
  3. //创建一个电子表格
  4. XSSFSheet spreadsheet = workbook.createSheet("Sheet Name");复制代码

XSSFWorkbook类:可以对对Excel进行读写,它兼容.xls和.xlsx格式,支持office的2007或者更高版本,
HSSFWorkbook类:可以对对Excel进行读写,它兼容.xls格式,不支持高版本的office
所以一般我们会使用XSSFWorkbook来操作表格,看看如何向单元格里保存数据

  1. public class WriteSheetTest {
  2. private static final String PATH = "WriteSheet.xlsx"; //文件路径
  3. public static void main(String[] args) throws Exception {
  4. FileInputStream fis = new FileInputStream(PATH);
  5. //创建一个工作簿
  6. XSSFWorkbook workbook = new XSSFWorkbook();
  7. //创建一个电子表格
  8. XSSFSheet sheet = workbook.createSheet("mySheet");
  9. //行对象
  10. XSSFRow row ;
  11. for(int r = 0 ;r<3;r++) {
  12. //1.创建一个行对象
  13. row = sheet.createRow(r);
  14. for(int c = 0;c<3;c++) {
  15. //2.创建一个单元格
  16. Cell cell = row.createCell(c);
  17. cell.setCellValue(r+c);
  18. }
  19. }
  20. FileOutputStream fos = new FileOutputStream(PATH);
  21. workbook.write(fos);
  22. workbook.close();
  23. }
  24. }

【20180927】Java   Excel常用SDK Sample - 图2
上面的程序中创建了名字为mySheet的电子表格,写了三行三列的数据,POI中使用XSSFRow对象表示行对象,使用XSSFRow row = sheet.createRow(r);创建一个行对象,参数是行号,Cell表示一个单元格对象,可以使用行对象XSSFRow创建一个单元格格对象,Cell cell = row.createCell(c);参数是列号。

1.3 读取一个SHEET

  1. public class Readsheet
  2. {
  3. static XSSFRow row;
  4. public static void main(String[] args) throws Exception
  5. {
  6. FileInputStream fis = new FileInputStream(
  7. new File("WriteSheet.xlsx"));
  8. //打开需要读取的文件
  9. XSSFWorkbook workbook = new XSSFWorkbook(fis);
  10. //按照SHEET的名称读取一个电子表格
  11. XSSFSheet sheet = workbook.getSheet("mySheet");
  12. // int size = sheet.getLastRowNum();
  13. // System.out.println(size);
  14. // int s= sheet.getPhysicalNumberOfRows();
  15. // System.out.println(s);
  16. //获取一个行的迭代器
  17. Iterator<Row> rowIterator = sheet.rowIterator();
  18. while(rowIterator.hasNext()) {
  19. row = (XSSFRow) rowIterator.next();
  20. Iterator<Cell> cellIterator = row.cellIterator();
  21. while(cellIterator.hasNext()) {
  22. Cell cell = cellIterator.next();
  23. switch(cell.getCellTypeEnum() ) {
  24. case NUMERIC:
  25. double val = cell.getNumericCellValue();
  26. System.out.print(val+"\t\t");
  27. break ;
  28. case STRING:
  29. String str = cell.getStringCellValue();
  30. System.out.print(str+"\t\t");
  31. }
  32. }
  33. System.out.println();
  34. }
  35. fis.close();
  36. }
  37. }

运行结果:

0.0 1.0 2.0
1.0 2.0 3.0
2.0 3.0 4.0
这里需要注意,在读取单元格的值时需要先判断数据类型,不然获取数据会报数据类型错误。

参考资料