私のxlsxシートをJavaオブジェクトにApache POIを使用して変換することを提案できますか?.
eQ、私のExcelシートには2つの列が含まれています
そして私のJavaオブジェクト
Employee{
String empNo;
String empName;
}
ここで、ExcelシートをJavaオブジェクトに変換します。インターネットで試しましたが、ほとんどのチュートリアルでは、各行を反復してオブジェクトの各メンバーに値を割り当てる方法について説明しています。機能はありますか?直接変換するJAXB xmlパーサーのMarshallerおよびUnMarshallerのように。
前もって感謝します。
ExcelからPOJOに変換するためにApache POIを使用してこのライブラリを内部で試してください。 Poji
特定のシナリオでは、シートの各行が従業員を表し、最初の列が従業員番号を保持し、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
}
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();
}
}
}
この小さなライブラリの使用を検討することもできます excelorm
2つのライブラリが見つかりました:
jxls-reader
(ただし、構成はすべてXMLで行われます... !!!) http://jxls.sourceforge.net/reference/reader.htmlExcel-object-mapping
これは注釈のみですが、残念ながらその作成者は実際にはサポートしていません。まだ「1.0-SNAPSHORT」のままであるか、唯一のプルリクエストが表示されます https://github.com/jittagornp/Excel-object-mapping (編集:リポジトリが削除されて以来、ここにクローンが見つかりました: https://github.com/pramoth/Excel-object-mapping )それが誰かを助けることを願っています。
以下のリポジトリを確認してください。 「使いやすさ」を重視して開発されました。 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);
...
現状では、すべてのプリミティブデータタイプがサポートされています。 Date
、Formula
などのサポートの追加に取り組んでいます。
お役に立てれば。
私は同じ問題を抱えていましたが、標準(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);
}
}
}
}
これがそのような問題を抱えている人を助けることを願っています!