web-dev-qa-db-fra.com

Comment convertir ma feuille xlsx en objet Java avec Apache POI

quelqu'un peut-il me suggérer de convertir ma feuille xlsx en objet Java à l'aide d'un POI Apache?.

eq, ma feuille Excel contient deux colonnes

  • emp_no emp_name 
  • 01 anand
  • 02 kumar

et mon objet Java 

Employee{
String empNo;
String empName; 
}

Maintenant, je veux convertir ma feuille Excel en objet Java. J'ai essayé sur Internet, mais la plupart des tutoriels traitent de l'itération de chaque ligne et attribuent des valeurs à chaque membre de l'objet. Existe-t-il des fonctionnalités telles que Marshaller et UnMarshaller dans l’analyseur JAXB xml qui convertissent directement. 

Merci d'avance.

7
Anand

Pour le scénario donné, je suppose que chaque ligne de la feuille représente un employé, à savoir que la première colonne conserve le numéro d'employé et que la deuxième colonne contient le nom de l'employé. afin que vous puissiez utiliser les éléments suivants:

Employee{
  String empNo;
  String empName; 
}

Créer une méthode d’attribution des informations sur l’employé en tant que 

assignEmployee(Row row){
    empNo = row.getCell(0).toString();
    empName = row.getCell(1).toString();
}

ou si vous voulez, vous pouvez créer un constructeur pour la même chose. 

Maintenant, il vous suffit de parcourir chaque ligne pour obtenir/utiliser les informations à l'aide de la méthode ci-dessus.

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
}
10
Sankumarsingh

Essayez cette bibliothèque en interne en utilisant Apache POI pour convertir Excel en POJO.: Poji

8
Balaban Mario

J'utilise POI et je télécharge un programme simple. J'espère que ceci vous aidera. 

Remarque: n'oubliez pas de changer le chemin du fichier. 

Détails sur les pots: 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

Mes données dans le tableau Excel:

ID   NAME  LASTNAME 
1.0  Ena   Rana 
2.0  Meena Hanly 
3.0  Tina  Mounce 
4.0  Dina  Cobain 

Modèle ou 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;
    }    
}

Méthode principale: 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();
          }
      }
}
4
Yanish Pradhananga

Je viens de trouver deux bibliothèques:

En espérant que ça va aider quelqu'un.

1
maxxyme

Vérifiez le repo ci-dessous. Il a été développé en gardant à l'esprit la "facilité d'utilisation". https://github.com/millij/poi-object-mapper

La version initiale a été publiée sur Maven Central

<dependency>
    <groupId>io.github.millij</groupId>
    <artifactId>poi-object-mapper</artifactId>
    <version>1.0.0</version>
</dependency>

Fonctionne comme Jackson. Annotez votre haricot comme ci-dessous ..

@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;
    }
    ...
}

Et à lire ..

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

En l'état actuel, tous les types de données primitifs sont pris en charge. Nous travaillons toujours sur l'ajout de la prise en charge de Date, Formula etc.

J'espère que cela t'aides.

1
Milli

J'ai eu le même problème, je savais que la mise en œuvre via la norme (POI Apache) pourquoi coûtait tellement de temps, donc après avoir cherché et cherché, j'ai trouvé un meilleur pourquoi (JXLS-Reader)

tout d'abord utiliser/importer/inclure la bibliothèque jxls-reader

    <dependency>
        <groupId>org.jxls</groupId>
        <artifactId>jxls-reader</artifactId>
        <version>2.0.3</version>
    </dependency>

créez ensuite un fichier XML utilisé par la bibliothèque pour la correspondance entre les colonnes et les attributs de votre objet, ce XML prend en paramètre une liste initialisée pour la remplir par les données extraites (objets Employé) du fichier Excel, dans votre exemple, ressembler :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workbook>
    <worksheet idx="0">
        <section startRow="0" endRow="0" />
        <loop startRow="1" endRow="1" items="employeeList" var="employee" varType="com.department.Employee">
            <section startRow="1" endRow="1">
            <mapping row="1"  col="0">employee.empNo</mapping>
            <mapping row="1"  col="1">employee.empName</mapping>
            </section>
            <loopbreakcondition>
                <rowcheck offset="0">
                    <cellcheck offset="0"></cellcheck>
                </rowcheck>
            </loopbreakcondition>
        </loop>
    </worksheet>
</workbook>

Ensuite, en Java, initialisez la liste des employés (où le résultat de l'analyse sera inclus), puis appelez le lecteur JXLS avec le fichier Excel d'entrée et le mappage XML. Il ressemblera à ceci:

package com.department;

import Java.io.BufferedInputStream;
import Java.io.File;
import Java.io.FileInputStream;
import Java.io.IOException;
import Java.io.InputStream;
import Java.util.ArrayList;
import Java.util.HashMap;
import Java.util.List;
import Java.util.Map;

import org.Apache.commons.io.IOUtils;
import org.Apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.jxls.reader.ReaderBuilder;
import org.jxls.reader.ReaderConfig;
import org.jxls.reader.XLSReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;


public class ExcelProcessor {

    private static Logger logger = LoggerFactory.getLogger(ExcelProcessor.class);

    public void parseExcelFile(File excelFile) throws Exception{
        final List<Employee> employeeList = new ArrayList<Employee>();
        InputStream xmlMapping = new BufferedInputStream(ExcelProcessor.class.getClassLoader().getResourceAsStream("proBroMapping.xml"));
        ReaderConfig.getInstance().setUseDefaultValuesForPrimitiveTypes(true);
        ReaderConfig.getInstance().setSkipErrors(true);
        InputStream inputXLS;
        try{
            XLSReader mainReader = ReaderBuilder.buildFromXML(xmlMapping);
            inputXLS = new BufferedInputStream(new FileInputStream(excelFile));
            final Map<String, Object> beans = new HashMap<String, Object>();
            beans.put("employeeList", employeeList);
            mainReader.read(inputXLS, beans);
            System.out.println("Employee data are extracted successfully from the Excel file, number of Employees is: "+employeeList.size());
        } catch(Java.lang.OutOfMemoryError ex){
            // Case of a very large file that exceed the capacity of the physical memory
               ex.printStackTrace();
            throw new Exception(ex.getMessage());
        } catch (IOException ex) {
            logger.error(ex.getMessage());
            throw new Exception(ex.getMessage());
        } catch (SAXException ex) {
            logger.error(ex.getMessage());
            throw new Exception(ex.getMessage());
        } catch (InvalidFormatException ex) {
            logger.error(ex.getMessage());
            throw new Exception(ex.getMessage());
        } finally {
            closeInputStream(inputXLS);
        }

    }

    private void closeInputStream(final InputStream inputStream){
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (final IOException e) {
                logger.warn(e.getMessage(), e);
                IOUtils.closeQuietly(inputStream);
            }
        }
    }

}

J'espère que cela aide tous ceux qui ont un tel problème!

0
Shessuky

Vous pouvez également envisager d’utiliser cette petite bibliothèque excelorm

0
Mr. Skip