我想将excel行的当前行号添加到映射的Employee变量中。
从下面的例子中:我想知道员工" Yuri"在excel第8行。
但我无法找到任何方法来访问它。 XLSRowCursor有它但是如何将它添加到映射的bean?我知道读者在编写异常时使用当前处理行号,POI也有。
我身边的一个简单的自行计数解决方案并不是一个有效的想法,因为我们在错误机制中使用跳过行。
任何提示或提示?
xml文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<workbook>
....
<loop startRow="7" endRow="7" items="department.staff" var="employee" varType="net.sf.jxls.reader.sample.Employee">
<section startRow="7" endRow="7">
<mapping row="7" col="0">employee.name</mapping>
<mapping row="7" col="1">employee.age</mapping>
<mapping row="7" col="3">employee.payment</mapping>
<mapping row="7" col="4">employee.bonus</mapping>
</section>
...
</loop>
</worksheet>
</workbook>
excel文件: 员工
6 Name Age Birth Date Payment Bonus Total Superior Name
7 Oleg 32 2-Jan-74 2000 20,00% 2400 Maxim
8 Yuri 29 26-Sep-77 1800 15,00% 2070 Oleg
9 Leonid 30 12-Feb-76 1700 20,00% 2040 Oleg
10 Alex 28 18-Aug-78 1600 20,00% 1920 Oleg
11 Employee Payment Totals: 7100 8430
答案 0 :(得分:1)
您可以扩展SimpleBlockReaderImpl并覆盖其读取(XLSRowCursor游标,地图bean)方法,以使用teh XLSRowCursor 获取当前Excel行并将其注入进入豆子。
目前没有自动方式通过XML注入您自己的CustomBlockReader实现,因此您必须通过从 XLSReader 获取所有工作表读取器并使用您的自定义实例替换内部块读取器来手动执行此操作。
答案 1 :(得分:0)
我遇到了同样的问题,但是它可以通过一个技巧解决:使用一个静态变量,该变量在每次解析之前都会自动初始化,以将行号存储在bean的其他属性中
bean将具有一个附加属性“ rowNumber”,它将包含Excel文件中的行号,以及一个静态变量“ position”,它将在每个对象实例化时递增(这意味着在Excel文件中处理新行) )
package com.test.parser.model;
public class Employee{
private String name;
private String age;
private String payment;
private static int position = 2;
private int rowNumber;
public Employee(){
setRowNumber(position++);
}
public static void resetRowNumber() {
position = 2;
}
public int getRowNumber() {
return rowNumber;
}
public void setRowNumber(int rowNumber) {
this.rowNumber = rowNumber;
}
}
在读取JXLS之前,通过静态方法Employee.resetRowNumber()将静态值重置为开始行(在我的情况下为第二行),如下所示:
XLSReader mainReader = ReaderBuilder.buildFromXML(<InputStream of XML Mapping File>);
List<Employee> employeeList = new ArrayList<Employee>();
Employee.resetRowNumber();
beans.put("department.staff", employeeList);
mainReader.read(inputXLS, beans);
在解析结束时,我们将能够通过Employee.getRowNumber()获取行号
希望这对遇到同样问题的人有所帮助!