XlsxExporter creates autofilter with column index instead of object index, cause IndexOutOfBounds

XMLWordPrintable

    • Type: Bug
    • Resolution: Fixed
    • Priority: Normal
    • 6.2.0
    • Affects Version/s: 6.0.0
    • Component/s: None
    • Security Level: Jimmy
    • None

      Steps to Reproduce

      1. import xlsx in Kekai (see ticket for reproducing sample)
      2. export to excel

      Current Result

      Exception: io.keikai.range.impl.imexp.ExportException: Fail to export auto filter in sheet sheet1 from book book1.xlsx
        Caused by: java.lang.IndexOutOfBoundsException: null
        at org.apache.xmlbeans.impl.store.Xobj.insert_element_user(Xobj.java:2033)
        at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTAutoFilterImpl.insertNewFilterColumn(CTAutoFilterImpl.java:111)
        at io.keikai.range.impl.imexp.ExcelXlsxExporter.exportFilterColumns(ExcelXlsxExporter.java:996)
        at io.keikai.range.impl.imexp.ExcelXlsxExporter.exportAutoFilter(ExcelXlsxExporter.java:919)
        at io.keikai.range.impl.imexp.AbstractExcelExporter.export(AbstractExcelExporter.java:298) 
      

      Expected Result

      No error

      Debug Information

      in io.keikai.range.impl.imexp.ExcelXlsxExporter.exportFilterColumns(CTAutoFilter, SAutoFilter, int).srcFilterColumn

      	protected void exportFilterColumns(CTAutoFilter poiAutoFilter, SAutoFilter autoFilter, int numberOfColumn) {
      		final Map<String, Object> extra = new HashMap<String, Object>();
      		int autoFilterItemIndex = 0;
      		for( int i = 0 ; i < numberOfColumn ; i++){
      ...
      			if (poiAutoFilter.sizeOfFilterColumnArray() > i) {
      				destFilterColumn = new XSSFFilterColumn(poiAutoFilter.getFilterColumnArray(
      						i));
      			} else {
      				CTFilterColumn ctFilterColumn = poiAutoFilter.insertNewFilterColumn(
      						i); // ISSUE LOCATED HERE
      				autoFilterItemIndex++;
      				destFilterColumn = new XSSFFilterColumn(ctFilterColumn);
      				ctFilterColumn.setColId(i);
      			}
      

      poiAutoFilter.insertNewFilterColumn appear to treat autoFilter index and autoFilter column ID as separate values.
      When inserting an autofilter column, the inserted index must be >=0 but <=(maxIndex+1)
      Since the collection of auto filter columns is empty at the start, the only valid index is 0, because it doesn't represent the column index in page, but the column index in the collection of columns.

      Workaround

      create an extra int to track column index when inserting.

      Attached replacement exporter class, deploy to override at
      /src/main/java/io/keikai/range/impl/imexp/ExcelXlsxExporter.java

            Assignee:
            jamson
            Reporter:
            MDuchemin
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: