Java中如何使用Apache Poi读取Excel文件

时间:2020-02-23 14:34:22  来源:igfitidea点击:

在本教程中,我们将看到Java中如何使用Apache Poi示例读取Excel。

关于Apache Poi项目:

Apache Poi项目的使命是根据Office打开XML标准(OOXML)和Microsoft的OLE 2复合文档格式(OLE2)来创建和维护Java API以便操纵各种文件格式。
简而言之,我们可以使用Java读取和写入MS Excel文件。

关于Apache Poi的一些基础知识:

在Java中读取/写作Excel时,我们遇到了两个前缀

HSSF:用于处理文件Excel 2003或者更早版本(.xls)。
HSSF前缀的一些类是HSSFWorkbook,HSSFSheet,HSSFrow和HSSFCell。

XSSF:用于处理文件Excel 2007或者更高版本(.xlsx)。
具有XSSF前缀的一些类是XSSFWorkbook,XSSFSheet,XSSFrow和XSSFCell。

以下是我们需要了解的程序。

  • 工作簿:这是代表Excel工作簿的高级等级。
  • 表:这是表示Excel表的高级等级。
  • 行:这是表示Excel行的高级类。它有与行有关的方法。
  • 单元:这是表示单个Excel单元的高级等级。它具有与单元格相关的方法,例如:getDatatype()。

依赖性:

如果我们使用的是maven,则需要在pom.xml中添加以下依赖项。

org.apache.poi
   poi
   3.13
  
  
   org.apache.poi
   poi-ooxml
   3.13

如果我们不使用Maven,则需要在ClassPath中添加以下JAR。

  • poi-3.13.jar.
  • Commons-codec-1.9.jar
  • poi-ooxml-3.13.jar
  • Poi-oOxML-Schemas-3.13.jar
  • XMLBeans-2.6.0.jar.
  • stax-api-1.0.1.jar

使用POI读取Excel文件:

Java程序:

我们将读取Countrations.xlsx。
它的内容是:

创建ReadWriiteexcelMain.java如下

package org.igi.theitroad;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;
 
import org.apache.poi.ss.usermodel.Cell;
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.xssf.usermodel.XSSFWorkbook;
public class ReadExcelMain {
 
 public static void main(String[] args) throws IOException {
  readFileUsingPOI();
 }
 
 public static void readFileUsingPOI() throws IOException 
 {
  ClassLoader classLoader = ReadWriteExcelMain.class.getClassLoader();
  String excelFilePath = "Countries.xlsx";
  FileInputStream inputStream = new FileInputStream(new File(classLoader.getResource(excelFilePath).getFile()));
 
  Workbook workbook = new XSSFWorkbook(inputStream);
  Sheet sheet = workbook.getSheetAt(0);
 
  Iterator iterator = sheet.iterator();
 
  while (iterator.hasNext()) {
   Row nextRow = iterator.next();
   Iterator cellIterator = nextRow.cellIterator();
 
   while (cellIterator.hasNext()) {
    Cell cell = cellIterator.next();
 
    switch (cell.getCellType()) {
    case Cell.CELL_TYPE_STRING:
     System.out.print(cell.getStringCellValue());
     break;
    case Cell.CELL_TYPE_NUMERIC:
     System.out.print(cell.getNumericCellValue());
     break;
    case Cell.CELL_TYPE_BOOLEAN:
     System.out.print(cell.getBooleanCellValue());
     break;
    }
    System.out.print(" | ");
   }
   System.out.println();
  }
 
  workbook.close();
  inputStream.close();
 }
 
 
}

运行上面的程序时,我们将获取以下输出:

Country | Capital | Population | 
Netherlands | Delhi | 10000.0 | 
France | Paris | 40000.0 | 
Germany | Berlin | 20000.0 | 
England | London | 30000.0 |

让我们使用面向对象方法。

我们将阅读每行并创建国家对象。
显然我们将跳过标题行。
在package com.igi.theitroad.model中创建一个名为country.java的类.model

package com.igi.theitroad.model;
 
public class Country {
 
 String name;
 String capital;
 double population;
 
 //getter and setter methods
 
 public String getName() {
  return name;
 }
 
 public void setName(String name) {
  this.name = name;
 }
 
 public double getPopulation() {
  return population;
 }
 
 public void setPopulation(double population) {
  this.population = population;
 }
 
 public String getCapital() {
  return capital;
 }
 
 public void setCapital(String capital) {
  this.capital = capital;
 }
 
 public String toString()
 {
  return name+" | "+capital+" | "+population ;
 }
 
}

readexcelwithcounrymain.java.

package org.igi.theitroad;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
import org.apache.poi.ss.usermodel.Cell;
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.xssf.usermodel.XSSFWorkbook;
 
import com.igi.theitroad.model.Country;
public class ReadExcelWithCountryMain {
 
 public static void main(String[] args) throws IOException {
  List countries=readFileUsingPOI();
  for(Country country:countries)
  {
   System.out.println(country.toString());
  }
 
 }
 
 public static List readFileUsingPOI() throws IOException 
 {
  List countries=new ArrayList();
  
  ClassLoader classLoader = ReadExcelWithCountryMain.class.getClassLoader();
  String excelFilePath = "Countries.xlsx";
  FileInputStream inputStream = new FileInputStream(new File(classLoader.getResource(excelFilePath).getFile()));
 
  Workbook workbook = new XSSFWorkbook(inputStream);
  Sheet sheet = workbook.getSheetAt(0);
 
  Iterator iterator = sheet.iterator();
    while (iterator.hasNext()) {
   Row nextRow = iterator.next();
   
   //Not creating country object for header
   if(nextRow.getRowNum()==0)
    continue;
   
   Country countryObj=new Country();
   Iterator cellIterator = nextRow.cellIterator();
   
   while (cellIterator.hasNext()) {
    Cell cell = cellIterator.next();
    int columnIndex=cell.getColumnIndex();
    switch (columnIndex+1) {
    case 1:
     countryObj.setName(cell.getStringCellValue());
     break;
    case 2:
     countryObj.setCapital(cell.getStringCellValue());
     break;
    case 3:
     countryObj.setPopulation(cell.getNumericCellValue());
     break;
    }
    
   }
   countries.add(countryObj);
   
  }
 
  workbook.close();
  inputStream.close();
  
  return countries;
 }
 
 
}

运行上面的程序时,我们将获取以下输出:

Netherlands | Delhi | 10000.0
France | Paris | 40000.0
Germany | Berlin | 20000.0
England | London | 30000.0