如何使用Apache POI将我的xlsx工作表转换为java对象

Ana*_*and 10 java apache excel apache-poi

任何人都建议我使用Apache POI将我的xlsx表转换为java对象.

eq,我的Excel工作表包含两列

  • emp_no emp_name
  • 01 anand
  • 02 kumar

和我的java对象

Employee{
String empNo;
String empName; 
}
Run Code Online (Sandbox Code Playgroud)

现在我想将我的Excel工作表转换为java对象.我已经尝试过在互联网上,但是大多数教程都讨论了迭代每一行并为每个成员分配值.是否有任何功能,如Marshaller和UnMarshaller在JAXB xml解析器中直接转换.

提前致谢.

San*_*ngh 11

对于给定的场景,我假设工作表的每一行代表一个员工,其中第一列保留员工编号,第二列保留员工姓名.所以你可以使用以下内容:

Employee{
  String empNo;
  String empName; 
}
Run Code Online (Sandbox Code Playgroud)

创建一种将Employee信息分配为的方法

assignEmployee(Row row){
    empNo = row.getCell(0).toString();
    empName = row.getCell(1).toString();
}
Run Code Online (Sandbox Code Playgroud)

或者如果你想,你可以为它创建一个构造函数.

现在,您只需要迭代每一行以使用上述方法获取/使用信息.

Employee emp = new Employee();
Iterator<Row> itr = sheet.iterator();
    while(itr.hasNext()){
       Row row = itr.next();
       emp.assignEmployee(row);
      //  enter code here for the rest operation
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回复而不是迭代每一行是否有任何转换方式,例如JAXB我们有一个名为Unmarshaller的概念,marshaller有助于将对象转换为xml,xml转换为对象.是否有任何类型的功能在Apache POI中可用 (4认同)

Bal*_*rio 10

使用Apache POI在内部尝试使用此库从excel转换为POJO: Poji


Mil*_*lli 6

检查下面的存储库。它的开发始终牢记“易用性”。 https://github.com/millij/poi-object-mapper

初始版本已发布到Maven Central

<dependency>
    <groupId>io.github.millij</groupId>
    <artifactId>poi-object-mapper</artifactId>
    <version>1.0.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

作品与杰克逊类似。像下面这样注释你的bean..

@Sheet
public class Employee {
    // Pick either field or its accessor methods to apply the Column mapping.
    ...
    @SheetColumn("Age")
    private Integer age;
    ...
    @SheetColumn("Name")
    public String getName() {
        return name;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

并阅读..

...
final File xlsxFile = new File("<path_to_file>");
final XlsReader reader = new XlsReader();
List<Employee> employees = reader.read(Employee.class, xlsxFile);
...
Run Code Online (Sandbox Code Playgroud)

目前,所有原始数据类型都受支持。仍在努力添加对Date等的支持Formula

希望这可以帮助。


小智 5

我正在使用 POI 并且正在上传一个简单的程序。希望这会帮助你。

注意:请记住更改文件路径。

jar 详细信息:dom4j-1.6.1.jar、poi-3.9.jar、poi-ooxml-3.9.jar、poi-ooxml-schemas-3.11.jar、xmlbeans-2.6.0.jar

我在 Excel 表中的数据:

ID   NAME  LASTNAME 
1.0  Ena   Rana 
2.0  Meena Hanly 
3.0  Tina  Mounce 
4.0  Dina  Cobain 
Run Code Online (Sandbox Code Playgroud)

模型或 Pojo:NewEmployee.java

public class NewEmployee {
     private Double id;
     private String firstName;
     private String lastName;

     public NewEmployee(){}

    public NewEmployee(Double id, String firstName, String lastName) {
        super();
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public Double getId() {
        return id;
    }

    public void setId(Double id) {
        this.id = id;
    }

    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;
    }    
}
Run Code Online (Sandbox Code Playgroud)

主要方法:ExcelToObject.java

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelToObject {

    public static void main(String[] args) {
         try
          {
              FileInputStream file = new FileInputStream(new File("/home/ohelig/eclipse/New Worksheet.xlsx"));

              //Create Workbook instance holding reference to .xlsx file
              XSSFWorkbook workbook = new XSSFWorkbook(file);

              //Get first/desired sheet from the workbook
              XSSFSheet sheet = workbook.getSheetAt(0);

              ArrayList<NewEmployee> employeeList = new ArrayList<>();
    //I've Header and I'm ignoring header for that I've +1 in loop
              for(int i=sheet.getFirstRowNum()+1;i<=sheet.getLastRowNum();i++){
                  NewEmployee e= new NewEmployee();
                  Row ro=sheet.getRow(i);
                  for(int j=ro.getFirstCellNum();j<=ro.getLastCellNum();j++){
                      Cell ce = ro.getCell(j);
                    if(j==0){  
                        //If you have Header in text It'll throw exception because it won't get NumericValue
                        e.setId(ce.getNumericCellValue());
                    }
                    if(j==1){
                        e.setFirstName(ce.getStringCellValue());
                    }
                    if(j==2){
                        e.setLastName(ce.getStringCellValue());
                    }    
                  }
                  employeeList.add(e);
              }
              for(NewEmployee emp: employeeList){
                  System.out.println("ID:"+emp.getId()+" firstName:"+emp.getFirstName());
              }
              file.close();
          } 
          catch (Exception e) 
          {
              e.printStackTrace();
          }
      }
}
Run Code Online (Sandbox Code Playgroud)