Как добавить номер строки в переменную цикла сотрудника?

Я хочу добавить текущий номер строки строки excel в сопоставленную переменную Employee.

Из примера ниже: я хочу знать, что сотрудник «Юрий» находится в строке Excel под номером 8.

Но я не могу найти способ получить к нему доступ. Он есть в XLSRowCursor, но как добавить его в отображаемый компонент? Я знаю, что читатель использует текущий номер строки обработки при написании исключения, и 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    

person P.Paulsen    schedule 08.02.2016    source источник


Ответы (2)


Вы можете расширить SimpleBlockReaderImpl и переопределить его read(XLSRowCursor cursor, Map bean), чтобы использовать XLSRowCursor для получения текущей строки Excel и вставки ее в bean-компонент.

В настоящее время не существует автоматического способа внедрить собственную реализацию CustomBlockReader через XML, поэтому вам придется делать это вручную, получая все средства чтения листов из XLSReader и заменяя внутренние устройства чтения блоков своими собственными экземплярами.

person Leonid Vysochyn    schedule 08.02.2016
comment
Очень хорошая идея, но ручная замена BlockReaders не работает. Но я заменил RowReaderBuilder и скорректировал дайджест.addObjectCreate(*/section с моим собственным SimpleBlockReaderImpl, и это отлично работает. Спасибо за вашу потрясающую помощь, и я счастлив иметь rowNumbers!!! - person P.Paulsen; 11.02.2016

У меня была та же проблема, но она была решена хитростью: используйте статическую переменную, которая инициализируется автоматически перед каждым синтаксическим анализом, чтобы сохранить номер строки в дополнительном атрибуте в 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().

person Shessuky    schedule 20.08.2019