如何将行num添加到employee循环变量?

时间:2016-02-08 09:03:11

标签: java reader jxls

我想将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    

2 个答案:

答案 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()获取行号

希望这对遇到同样问题的人有所帮助!