programing

Apache POI를 사용하여 내 xlsx 시트를 Java 개체로 변환하는 방법

i4 2023. 6. 10. 08:18
반응형

Apache POI를 사용하여 내 xlsx 시트를 Java 개체로 변환하는 방법

Apache POI를 사용하여 xlsx 시트를 Java 객체로 변환할 것을 제안할 수 있습니까?

eq, 내 엑셀 시트는 두 개의 열을 포함합니다.

  • emp_noemp_name
  • 01 an과
  • 02 쿠마르

그리고 나의 자바 객체.

Employee{
String empNo;
String empName; 
}

이제 제 엑셀 시트를 자바 객체로 변환하고 싶습니다.저는 인터넷에서 시도해봤지만 대부분의 튜토리얼은 각 행을 반복하고 개체의 각 구성원에게 값을 할당하는 것에 대해 이야기합니다.JAXB xml parser에 Marshaller와 UnMarshaller와 같은 직접 변환하는 기능이 있습니까?

잘 부탁드립니다.

주어진 시나리오에서 시트의 각 행은 첫 번째 열이 직원 번호를 유지하고 두 번째 열이 직원 이름을 유지하는 직원을 나타낸다고 가정합니다.다음을 사용할 수 있습니다.

Employee{
  String empNo;
  String empName; 
}

직원 정보를 다음과 같이 할당하는 방법을 만듭니다.

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

또는 원하는 경우 동일한 생성자를 생성할 수 있습니다.

이제 각 행에 대해 위의 방법을 사용하여 정보를 가져오거나 사용하기만 하면 됩니다.

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
}

Excel에서 POJO로 변환하기 위해 Apache POI를 사용하여 내부적으로 이 라이브러리를 사용해 보십시오.:포지

아래 보고서를 확인하십시오.그것은 "사용의 용이성"을 염두에 두고 개발되었습니다.https://github.com/millij/poi-object-mapper

초기 버전이 메이븐 센트럴에 게시되었습니다.

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

잭슨이랑 비슷한 작품.아래와 같이 당신의 콩에 주석을 달아주세요.

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

그리고 읽기..

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

현재 상태로는 모든 기본 데이터 유형이 지원됩니다.에 대한 지원 추가 작업 중Date,Formula등등..

이게 도움이 되길 바랍니다.

저는 POI를 사용하고 있으며 간단한 프로그램을 업로드하고 있습니다.이것이 당신에게 도움이 되기를 바랍니다.

참고: 파일 경로를 변경해야 합니다.

병 세부 정보: 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 

모델 또는 Pojo:신입사원.자바

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

주 방법: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();
          }
      }
}

당신은 또한 이 작은 도서관 excellorm을 사용하는 것을 고려할 수 있습니다.

방금 두 개의 라이브러리를 찾았습니다.

  • jxls-reader(그러나 구성은 전적으로 XML로 수행됩니다... 으악!!!)http://jxls.sourceforge.net/reference/reader.html
  • excel-object-mapping이것은 주석일 뿐이지만 안타깝게도 여전히 "1.0-SNAPSHORT"에 있거나 유일한 꺼내기 요청 https://github.com/jittagornp/excel-object-mapping 을 참조하십시오(편집: repo는 그 이후로 제거되었습니다. 여기서 클론을 찾았습니다: https://github.com/pramoth/excel-object-mapping ).

누군가에게 도움이 되기를 바랍니다.

저도 같은 문제가 있었습니다. 표준(Apache POI)을 통한 구현이 왜 그렇게 많은 시간이 소요되는지 알고 있었기 때문에 검색하고 둘러본 결과 더 나은 이유를 찾았습니다(JXLS-Reader).

우선 jxls-dll 라이브러리 사용/가져오기/가져오기

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

그런 다음 열과 개체 속성 간의 대응을 위해 라이브러리에서 사용하는 XML 파일을 만듭니다. 이 XML은 초기화된 목록을 매개 변수로 사용하여 Excel 파일에서 추출된 데이터(직원 개체)로 채웁니다. 예제에서는 다음과 같이 표시됩니다.

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

그런 다음 Java에서 직원 목록을 초기화하고(파싱 결과가 포함될 위치) 입력 Excel 파일 및 XML 매핑을 사용하여 JXLS 판독기를 호출하면 다음과 같이 됩니다.

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 {
            IOUtils.closeQuietly(inputStream);
        }

    }

}

이것이 그러한 문제를 가진 사람들에게 도움이 되기를 바랍니다!

저는 xls/xlsx 파일을 pojo 목록으로 구문 분석하는 간단한 방법을 찾고 싶습니다.검색을 좀 해본 결과 편리한 것을 찾지 못했고 빨리 개발하는 것을 선호했습니다.이제 전화만 하면 포조를 받을 수 있습니다.

InputStream is = this.getClass().getResourceAsStream("/ExcelUtilsTest.xlsx");
List<Pojo> pojos = ExcelToPojoUtils.toPojo(Pojo.class, is);

관심이 있는 경우 다음을 확인합니다.

https://github.com/ZPavel/excelToPojo

Apache POI를 사용하여 xlsx 시트를 개체 목록에 바인딩하는 를 설정합니다.

Apache POI를 사용하여 Microsoft Excel(xlsx) 시트를 개체 목록으로 변환하는 방법을 보여주는 매우 간단한 예입니다.

이 아이디어는 단순히 시트 열을 매핑할 필드에 주석 @ExcelCellInfo를 정의하는 것입니다.그런 다음 주석 속성에 따라 반사를 사용하여 시트 셀을 바인딩합니다.

사용 예:

ExcelSheetDescriptor<RowClassSample> sheetDescriptor = new ExcelSheetDescriptor<>(RowClassSample.class).setHasHeader();
List<RowClassSample> rows = ExcelUtils.readFirstSheet("pathToFile.xlsx", sheetDescriptor);

바인딩할 클래스:

public class RowClassSample {

    @ExcelCellInfo(index = 0)
    private long serial;

    @ExcelCellInfo(index = 1)
    private String name;

    @ExcelCellInfo(index = 2, cellParser = CellNumericAsStringParser.class)
    private String registrationNumber;

    @ExcelCellInfo(index = 3, cellParser = CellPercentageParser.class)
    private Double percentage;

    @ExcelCellInfo(index = 6)
    private String reason;

    @ExcelCellInfo(index = 4)
    private String notes;

    @ExcelCellInfo(index = 5, cellParser = CellBooleanYesNoArParser.class)
    private boolean approval;

    // getters & setters
}

언급URL : https://stackoverflow.com/questions/22015660/how-to-convert-my-xlsx-sheet-to-java-object-using-apache-poi

반응형