Java >> Java tutorial >  >> Java

Sådan læser du Excel-fil i Java ved hjælp af Apache POI

I dette indlæg vil vi se, hvordan du kan læse Excel-ark i Java ved hjælp af Apache POI-bibliotek.

  • Se Hvordan man skriver Excel-fil i Java ved hjælp af Apache POI for at se, hvordan man skriver til excel-ark ved hjælp af Java-programmet.

Apache POI er et open source-bibliotek, hvormed du kan læse og skrive Excel-filer fra dit Java-program.

Indholdsfortegnelse
  1. Maven-afhængigheder
  2. Apache POI-klasser til at arbejde med Excel-regneark
  3. Læsning af excel-fil i Java ved hjælp af Apache POI-eksempel

Maven Dependencies

Du skal inkludere følgende maven-afhængigheder for Apache POI i din pom.xml-fil.

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>4.0.0</version>
</dependency>  

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

Her kræves den første afhængighed for at arbejde med ældre Excel-format med .xls-udvidelse.

Anden afhængighed er påkrævet for at arbejde med det OOXML-baserede filformat med filtypenavnet .xlsx.

Disse afhængigheder tilføjer følgende jars-

poi-4.0.0.jar
commons-codec-1.10.jar
commons-collections4-4.2.jar

poi-ooxml-4.0.0.jar
poi-ooxml-schemas-4.0.0.jar
xmlbeans-3.0.1.jar
commons-compress-1.18.jar
curvesapi-1.04.jar

Apache POI-klasser til at arbejde med Excel-regneark

Inden vi kommer ind på eksempel for at læse excel-regneark i Java ved hjælp af Apache POI, lad os først få en idé om de klasser, der bruges i koden.

Med i Apache POI er der to implementeringer til to typer regneark-

  • HSSF - Det er POI-projektets rene Java-implementering af filformatet Excel '97(-2007) (.xls).
  • XSSF - Det er POI-projektets rene Java-implementering af Excel 2007 OOXML (.xlsx) filformat.

Bemærk, at der er et komponentmodul, der forsøger at levere en fælles Java API på højt niveau til både OLE2- og OOXML-dokumentformater, som er SS til Excel-projektmapper. Så det er bedre at bruge SS-pakken så meget som muligt, så en implementering problemfrit kan erstattes af en anden.

Følgende grænseflader fra SS-modellen vil blive brugt i eksemplet til at læse excel-fil i Java ved hjælp af Apache POI-

  • org.apache.poi.ss.usermodel.Workbook - Højt niveau repræsentation af en Excel projektmappe. Dette er det første objekt, de fleste brugere vil konstruere, uanset om de læser eller skriver en projektmappe. Implementeringsklasser for henholdsvis HSSF og XSSF er HSSFWorkbook og XSSFWorkbook.
  • org.apache.poi.ss.usermodel.Sheet - Højt niveau repræsentation af et Excel regneark. Implementeringsklasser for henholdsvis HSSF og XSSF er HSSFSheet og XSSFSheet.
  • org.apache.poi.ss.usermodel.Row - Højt niveau repræsentation af en række i et regneark. Implementeringsklasser for henholdsvis HSSF og XSSF er HSSFRow og XSSFRow.
  • org.apache.poi.ss.usermodel.Cell - Højt niveau repræsentation af en celle i en række af et regneark. Celler kan være numeriske, formelbaserede eller strengbaserede (tekst). Implementeringsklasser for henholdsvis HSSF og XSSF er HSSFCell og XSSFCell.

Udover disse grænseflader er der en klasse WorkbookFactory, der bruges til at oprette den passende projektmappe.

WorkbookFactory - Fabrik til oprettelse af den passende type projektmappe (det være sig HSSFWorkbook eller XSSFWorkbook), ved automatisk registrering fra det medfølgende input.

Læsning af excel-fil i Java ved hjælp af Apache POI-eksempel

I eksemplet læses det følgende excel-regneark, som har to ark - Brugere og bøger.

For det første ark efter at have læst hver række i excel-arket oprettes et objekt af typen User og tilføjes til en ArrayList. For det andet ark vises celleværdier på konsollen.

Modelklasse (User.java), hvis objekter oprettes ved at læse hver række i excel-arket.

public class User {

  private String firstName;
  private String lastName;
  private String email;
  private Date DOB;

  public User() {
   
  }
  public User(String firstName, String lastName, String email, Date DOB) {
   this.firstName = firstName;
   this.lastName = lastName;
   this.email = email;
   this.DOB = 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 getEmail() {
   return email;
  }
  public void setEmail(String email) {
   this.email = email;
  }
  public Date getDOB() {
   return DOB;
  }
  public void setDOB(Date dOB) {
   DOB = dOB;
  }
}
Klasse til læsning af excel-fil i Java.
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.EncryptedDocumentException;
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;
import org.netjs.Model.User;

public class ReadExcel {
  private static final String PATH_TO_EXCEL="resources\\user.xlsx";
  public static void main(String[] args) {
    new ReadExcel().readExcel(PATH_TO_EXCEL);
  }
    
  private void readExcel(String pathToExcel) {
    try {
      Workbook workbook = WorkbookFactory.create(new FileInputStream(pathToExcel));
      // If you have only one sheet you can get it by index of the sheet 
      //Sheet sheet = workbook.getSheetAt(0);
      Iterator<Sheet> sheetItr = workbook.sheetIterator();
      while(sheetItr.hasNext()) {
        Sheet sheet = sheetItr.next();
        // For Users sheet create List of objects
        if(sheet.getSheetName().equals("Users")) {
            readExcelSheet(sheet);
        }else {
          // For other sheet just print the cell values
          printExcelSheet(sheet);
        }
      }                   
    } catch (EncryptedDocumentException | IOException | ParseException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
    
  private void readExcelSheet(Sheet sheet) throws ParseException{
    System.out.println("Starting to read sheet- " + sheet.getSheetName());
    Iterator<Row> rowItr = sheet.iterator();
    List<User> userList = new ArrayList<>();
    // Iterate each row in the sheet
    while(rowItr.hasNext()) {
      User user = new User();
      Row row = rowItr.next();
      // First row is header so skip it
      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:
            user.setFirstName((String)getValueFromCell(cell));
            break;
          case 1:
            user.setLastName((String)getValueFromCell(cell));
            break;
          case 2:
            user.setEmail((String)getValueFromCell(cell));
            break;
          case 3:
            user.setDOB((Date)getValueFromCell(cell));
            break;
        }
      }
      userList.add(user);
    }
    for(User user : userList) {
      System.out.println(user.getFirstName() + " " + user.getLastName() + " " + user.getEmail() + " " +  user.getDOB());
    }        
  }
    
  // This method is used to print cell values
  private void printExcelSheet(Sheet sheet) throws ParseException{
    System.out.println("Starting to read sheet- " + sheet.getSheetName());
    Iterator<Row> rowItr = sheet.iterator();
    while(rowItr.hasNext()) {
      Row row = rowItr.next();
      if(row.getRowNum() == 0) {
          continue;
      }
      Iterator<Cell> cellItr = row.cellIterator();
      while(cellItr.hasNext()) {                
        Cell cell = cellItr.next();
        System.out.println("Cell Type- " + cell.getCellType().toString() + " Value- " + getValueFromCell(cell));
      }        
    }
  }
    
  // 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 "";                                
    }
  }
}

Output

Starting to read sheet- Users
Jack Reacher [email protected] Sat Jul 12 00:00:00 IST 1975
Remington Steele [email protected] Thu Apr 28 00:00:00 IST 2016
Jonathan Raven [email protected] Thu Jan 06 00:00:00 IST 1966
Starting to read sheet- Books
Cell Type- STRING Value- Five Little Pigs
Cell Type- NUMERIC Value- 12.56
Cell Type- STRING Value- And Then There Were None
Cell Type- NUMERIC Value- 15.89
Cell Type- STRING Value- Dumb Witness
Cell Type- NUMERIC Value- 22.0
Cell Type- STRING Value- Curtain
Cell Type- NUMERIC Value- 18.99

Det er alt for dette emne Sådan læser du Excel-fil i Java ved hjælp af Apache POI . Hvis du er i tvivl eller har forslag til at komme med, så smid en kommentar. Tak!


Java tag