使用Apache POI读取Java中的Excel文件

时间:2020-01-09 10:35:36  来源:igfitidea点击:

在本文中,我们将介绍如何使用Apache POI库读取Java中的Excel文件。如果我们必须用Java写入Excel文件,则可以检查此帖子使用Apache POI写入Java中的Excel文件

Apache POI

Apache POI是用于Microsoft文档的Java API。使用Apache POI,我们可以使用Java读写MS Excel文件。此外,我们可以使用Java读写MS Word和MS PowerPoint文件。

Apache POI支持读取OLE2文件和Office Open XML标准(OOXML)文件。

  • OLE2文件包括大多数Microsoft Office文件,例如XLS,DOC和PPT以及基于MFC序列化API的文件格式。

  • Office OpenXML Format是在Microsoft Office 2007和2008中发现的基于新标准的XML文件格式。其中包括XLSX,DOCX和PPTX。

这意味着Apache POI支持读取具有.xls格式的excel文件以及具有.xlsx格式的excel文件。

Apache POI的Maven依赖关系

要使用Apache POI读取excel文件,我们需要添加以下依赖项。

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>4.0.1</version>
</dependency>

这种依赖性增加了以下罐子

poi-ooxml-4.0.1.jar
poi-4.0.1.jar
poi-ooxml-schemas-4.0.1.jar
curvesapi-1.05.jar
commons-compress-1.18.jar
commons-math3-3.6.1.jar
commons-collections4-4.2.jar
xmlbeans-3.0.2.jar

在这里请注意poi-4.0.1.jar具有用于处理旧Excel格式(.xls)的类
poi-ooxml-4.0.1.jar具有使用较新的excel格式(.xlsx)的类。 Apache POI 4.0.1需要Java 8或者更高版本。

用于读取Excel文件的Apache POI类

这是有关使用Apache POI在Java中读取excel文件的类的入门。

Apache POI库为两种Excel电子表格格式提供了两种实现

  • HSSF –这是用于早期excel格式(.xls)的纯Java实现。此实现中的类通常具有HSSF前缀,例如HSSFWorkBook,HSSFSheet。

  • XSSF –它是xslx文件格式(OOXML)的纯Java实现。此实现中的类通常具有XSSF前缀,例如XSSFWorkBook,XSSFSheet。

SS –这是一个在HSSF和XSSF之上构建的程序包,它使用通用API为两种格式提供通用支持。我们应该尝试使用此程序包中的类以获得更好的兼容性。

使用excel文件时,通常的进度是

有与此进度相对应的界面

  • org.apache.poi.ss.usermodel.Workbook – Excel工作簿的高级表示形式。这是大多数用户正在阅读或者编写工作簿时构造的第一个对象。它也是创建新图纸的顶层对象。

  • org.apache.poi.ss.usermodel.Sheet-Excel工作表的高级表示。工作表是工作簿中的中心结构。

  • org.apache.poi.ss.usermodel.Row-电子表格行的高级表示。

  • org.apache.poi.ss.usermodel.Cell –电子表格行中单元格的高级表示形式。单元格可以是数字的,基于公式的或者基于字符串的(文本)。

为了创建工作簿,使用了WorkbookFactory类。

  • org.apache.poi.ss.usermodel.WorkbookFactory –用于通过从提供的输入中自动检测来创建适当种类的工作簿(HSSFWorkbook或者XSSFWorkbook)的工厂。

使用Apache POI示例读取Java中的Excel文件

在这个读取excel文件的Java示例中,我们将阅读以下包含员工信息的表(Employee.xslx),并使用该数据创建Employee对象。

员工阶层

public class Employee {
	private String firstName;
	private String lastName;
	private String department;
	private Date dob;
	public String getFirstName() {
		return firstName;
	}
	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}
	public String getLastName() {
		return lastName;
	}
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
	public String getDepartment() {
		return department;
	}
	public void setDepartment(String department) {
		this.department = department;
	}
	public Date getDob() {
		return dob;
	}
	public void setDob(Date dob) {
		this.dob = dob;
	}	
}

跟随类从excel文件中读取数据并创建对象。

import java.io.FileInputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class ReadExcel {
  private static final String EXCEL_FILE_PATH="F:\theitroad\Java\Java Programs\Java IO\Employee.xlsx";
  public static void main(String[] args) {
    ReadExcel readExcel = new ReadExcel();
    readExcel.readExcelFile(EXCEL_FILE_PATH);
  }
  private void readExcelFile(String excelFilePath) {
    try {
      // get excel workbook
      Workbook workbook = WorkbookFactory.create(new FileInputStream(excelFilePath));
      // get excel sheet
      Sheet sheet = workbook.getSheetAt(0);
      //If you have more than one sheet in a workbook then you 
      // can iterate through sheets 
      /*Iterator<Sheet> sheetIterator = workbook.sheetIterator();
      while(sheetIterator.hasNext()) {
        Sheet sheet = sheetIterator.next();*/
        readSheet(sheet);             
      } catch (IOException | ParseException e) {
        e.printStackTrace();
      }
  }
    
  private void readSheet(Sheet sheet) throws ParseException{
    Iterator<Row> rowItr = sheet.iterator();
    List<Employee> empList = new ArrayList<>();
    // Iterate through rows
    while(rowItr.hasNext()) {
      Employee emp = new Employee();
      Row row = rowItr.next();
      // skip header (First row)
      if(row.getRowNum() == 0) {
          continue;
      }
      Iterator<Cell> cellItr = row.cellIterator();
      // Iterate each cell in a row
      while(cellItr.hasNext()) {                
        Cell cell = cellItr.next();
        int index = cell.getColumnIndex();
        switch(index) {
          case 0:
            emp.setFirstName((String)getValueFromCell(cell));
            break;
          case 1:
            emp.setLastName((String)getValueFromCell(cell));
              break;
          case 2:
            emp.setDepartment((String)getValueFromCell(cell));
              break;
          case 3:
            emp.setDob((Date)getValueFromCell(cell));
              break;
        }
      }
      empList.add(emp);
    }
    for(Employee emp : empList) {
      System.out.println("Employee information- " + emp.toString());
    }    
  }
	
  // Utility method to get cell value based on cell type
  private Object getValueFromCell(Cell cell) {
    switch(cell.getCellType()) {
      case STRING:
          return cell.getStringCellValue();
      case BOOLEAN:
          return cell.getBooleanCellValue();
      case NUMERIC:
        if(DateUtil.isCellDateFormatted(cell)) {
          return cell.getDateCellValue();
        }
        return cell.getNumericCellValue();
      case FORMULA:
        return cell.getCellFormula();
      case BLANK:
        return "";
      default:
        return "";                                
    }
  }
}

输出:

Employee information- John Emerson Technology Mon Nov 12 00:00:00 IST 1990
Employee information- Shelly Mcarthy HR Sat May 07 00:00:00 IST 1960
Employee information- Tom Cevor Finance Mon Feb 03 00:00:00 IST 1992

代码中使用的Excel文件只有一个工作表,可以使用以下方法进行检索:–工作表sheet = workbook.getSheetAt(0);
如果工作簿中有多个工作表,那么我们也可以遍历这些工作表

Iterator<Sheet> sheetIterator = workbook.sheetIterator();
while(sheetIterator.hasNext()) {
  Sheet sheet = sheetIterator.next();
  // get data from sheet
}