如何将行号添加到员工循环变量中?

How to add the row num to the employee loop variable?

我想将 excel 行的当前行号添加到映射的 Employee 变量。

从下面的示例:我想知道员工 "Yuri" 在 excel 行号 8.

但我找不到任何访问方法。 XLSRowCursor 有它,但如何将它添加到映射的 bean 中?我知道 reader 在写异常时使用当前处理行号,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    

您可以扩展 SimpleBlockReaderImpl 并覆盖其 read(XLSRowCursor cursor, Map beans) 方法以使用 XLSRowCursor 来获取当前 Excel 行并将其注入 bean。

目前没有通过 XML 自动注入您自己的 CustomBlockReader 实现的方法,因此您必须通过从 XLSReader[= 获取所有 sheet 阅读器来手动执行此操作18=] 并用您的自定义实例替换内部块读取器。

我有同样的问题,但通过一个技巧解决了:使用一个在每次解析之前自动初始化的静态变量,将行号存储在 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()得到行号。