wake-up-neo.com

Wie konvertiere ich mein Xlsx-Sheet mithilfe des Apache-POI in ein Java-Objekt?

kann mir jemand vorschlagen, mein Xlsx-Sheet mit Apache POI in ein Java-Objekt zu konvertieren.

eq, meine Excel-Tabelle enthält zwei Spalten

  • emp_no emp_name 
  • 01 anand
  • 02 kumar

und mein Java-Objekt 

Employee{
String empNo;
String empName; 
}

Jetzt möchte ich meine Excel-Tabelle in ein Java-Objekt konvertieren. Ich habe es im Internet versucht, aber die meisten Tutorials sprechen über das Durchlaufen jeder Zeile und weisen jedem Element Werte zu. Gibt es Funktionen wie Marshaller und UnMarshaller im JAXB-XML-Parser, die direkt konvertieren. 

Danke im Voraus.

7
Anand

Für das gegebene Szenario gehe ich davon aus, dass jede Zeile des Arbeitsblatts einen Mitarbeiter darstellt, dessen erste Spalte die Personalnummer und die zweite Spalte den Angestellten Namen enthält. Sie können also Folgendes verwenden:

Employee{
  String empNo;
  String empName; 
}

Erstellen Sie eine Methode zum Zuordnen der Mitarbeiterinformationen als 

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

wenn Sie möchten, können Sie auch einen Konstruktor erstellen. 

Jetzt müssen Sie nur noch jede Zeile durchlaufen, um die Informationen mit der obigen Methode zu erhalten/verwenden.

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

Probieren Sie diese Bibliothek intern mit Apache POI aus, um von Excel nach POJO zu konvertieren.: Poji

8
Balaban Mario

Ich verwende POI und lade ein einfaches Programm hoch. Hoffe, das wird dir helfen. 

Hinweis: Denken Sie daran, den Dateipfad zu ändern. 

Details der Dosen: 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

Meine Daten in Excel-Tabelle:

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

Modell oder 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;
    }    
}

Hauptmethode: 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

Ich habe gerade zwei Bibliotheken gefunden:

Ich hoffe, es hilft jemandem.

1
maxxyme

Überprüfen Sie das unten angegebene Repo. Es wurde unter Beibehaltung der "Benutzerfreundlichkeit" im Kopf entwickelt. https://github.com/millij/poi-object-mapper

Die ursprüngliche Version wurde in Maven Central veröffentlicht. 

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

Funktioniert ähnlich wie Jackson. Kommentieren Sie Ihre Bohne wie unten ..

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

Und zu lesen ..

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

Alle primitiven Datentypen werden unterstützt. Arbeitet noch daran, Unterstützung für Date, Formula etc hinzuzufügen.

Hoffe das hilft.

1
Milli

Ich hatte das gleiche Problem, mir war bewusst, dass die Implementierung über den Standard (Apache POI) warum so viel Zeit kostete, so dass ich nach dem Suchen und Schauen einen besseren Grund gefunden habe (JXLS-Reader)

verwenden Sie zunächst/import/include die Bibliothek jxls-reader

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

erstellen Sie anschließend eine XML-Datei, die von der Bibliothek für die Entsprechung zwischen den Spalten und Ihren Objektattributen verwendet wird. Diese XML-Datei enthält eine initialisierte Liste, um sie durch extrahierte Daten (Employee-Objekte) aus der Excel-Datei aufzufüllen. In Ihrem Beispiel wird sie verwendet aussehen wie :

<?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>

Initialisieren Sie dann in Java die Liste der Employees (in die das Ergebnis der Analyse einbezogen wird), rufen Sie den JXLS-Reader mit der Eingabe-Excel-Datei und der XML-Zuordnung auf. Es sieht so aus:

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);
            }
        }
    }

}

Hoffe, das hilft jedem, der so ein Problem hat!

0
Shessuky

Sie können auch die Verwendung dieser kleinen Bibliothek in Betracht ziehen Excel

0
Mr. Skip