任何人都可以建议我使用Apache POI将我的xlsx工作表转换为java对象。
eq,我的Excel工作表包含两列
和我的java对象
Employee{
String empNo;
String empName;
}
现在我想将我的Excel工作表转换为java对象。 我已经尝试过在互联网上,但是大多数教程都讨论了迭代每一行并为每个成员分配值。是否有任何功能,如Marshaller和UnMarshaller在JAXB xml解析器中直接转换。
提前致谢。
答案 0 :(得分:10)
对于给定的场景,我假设工作表的每一行代表一个员工,其中第一列保留员工编号,第二列保留员工姓名。所以你可以使用以下内容:
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
}
答案 1 :(得分:9)
使用Apache POI在内部尝试使用此库从excel转换为POJO: Poji
答案 2 :(得分:4)
我正在使用POI,我正在上传一个简单的程序。希望这会帮助你。
注意:请记住更改文件路径。
Jars详情: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();
}
}
}
答案 3 :(得分:1)
刚刚找到两个库:
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)希望它能帮助别人。
答案 4 :(得分:1)
您还可以考虑使用这个小型库excelorm
答案 5 :(得分:1)
检查以下回购。它是通过保持“易用性”而开发的。 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
等的支持。
希望这会有所帮助。
答案 6 :(得分:0)
我遇到了同样的问题,我知道通过标准(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中,初始化Employees列表(其中将包含解析结果),然后通过输入的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);
}
}
}
}
希望这可以帮助任何有此类问题的人!
答案 7 :(得分:0)
我想找到一种将xls / xlsx文件解析为pojo列表的简单方法。经过一番搜索,我发现没有任何方便和可取之处,因此希望快速开发它。现在我可以通过简单地调用来获得pojos了:
InputStream is = this.getClass().getResourceAsStream("/ExcelUtilsTest.xlsx");
List<Pojo> pojos = ExcelToPojoUtils.toPojo(Pojo.class, is);
如果有兴趣的话,请看一下它:
答案 8 :(得分:0)
看看使用Apache POI将xlsx工作表绑定到对象列表的example。
这是一个非常简单的示例,展示了如何使用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
}