web-dev-qa-db-ja.com

xlsxシートをJavaオブジェクトにApache POIを使用して変換する方法

私のxlsxシートをJavaオブジェクトにApache POIを使用して変換することを提案できますか?.

eQ、私のExcelシートには2つの列が含まれています

  • emp_no emp_name
  • 01アナンド
  • 02クマール

そして私のJavaオブジェクト

Employee{
String empNo;
String empName; 
}

ここで、ExcelシートをJavaオブジェクトに変換します。インターネットで試しましたが、ほとんどのチュートリアルでは、各行を反復してオブジェクトの各メンバーに値を割り当てる方法について説明しています。機能はありますか?直接変換するJAXB xmlパーサーのMarshallerおよびUnMarshallerのように。

前もって感謝します。

10
Anand

ExcelからPOJOに変換するためにApache POIを使用してこのライブラリを内部で試してください。 Poji

10
Balaban Mario

特定のシナリオでは、シートの各行が従業員を表し、最初の列が従業員番号を保持し、2番目の列が従業員名を保持していると想定しています。したがって、以下を使用できます。

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

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 

モデルまたは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;
    }    
}

メインメソッド: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

この小さなライブラリの使用を検討することもできます excelorm

2
Mr. Skip

2つのライブラリが見つかりました:

それが誰かを助けることを願っています。

1
maxxyme

以下のリポジトリを確認してください。 「使いやすさ」を重視して開発されました。 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>

ジャクソンと同様に機能します。以下のように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;
    }
    ...
}

そして読むために...

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

現状では、すべてのプリミティブデータタイプがサポートされています。 DateFormulaなどのサポートの追加に取り組んでいます。

お役に立てれば。

1
Milli

私は同じ問題を抱えていましたが、標準(Apache POI)を介した実装にはなぜ非常に時間がかかるのかを知っていたので、検索して見回した後、より良い理由を見つけました(JXLS-Reader)

まず最初に、ライブラリjxls-readerを使用/インポート/インクルードします

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

}

これがそのような問題を抱えている人を助けることを願っています!

0
Shessuky