Bug 60541 - Column collapsed attribute is incorrectly set when reading file
Summary: Column collapsed attribute is incorrectly set when reading file
Status: NEW
Alias: None
Product: POI
Classification: Unclassified
Component: XSSF (show other bugs)
Version: 3.15-FINAL
Hardware: PC All
: P2 normal (vote)
Target Milestone: ---
Assignee: POI Developers List
Depends on:
Reported: 2017-01-02 20:02 UTC by Christian Schroeder
Modified: 2017-01-18 19:11 UTC (History)
0 users

Code to reproduce the erroneous behavior (1.77 KB, text/plain)
2017-01-02 20:02 UTC, Christian Schroeder
Proposed patch from comment 0 (728 bytes, patch)
2017-01-03 02:21 UTC, Javen O'Neal
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Christian Schroeder 2017-01-02 20:02:30 UTC
Created attachment 34576 [details]
Code to reproduce the erroneous behavior

When reading an OOXML Excel document from a file, the "collapsed" attribute of any column is always set, even if the attribute was not set in the input file. If the attribute was not present in the input file, it will be set to "false". If the attribute was present in the input file, it will be set to "true", regardless of the actual value of the attribute. By saving and loading the document multiple times, the attribute will eventually have a true value, regardless of its initial state.

Example to reproduce this behavior is attached.

The error occurs in line 259 of org.apache.poi.xssf.usermodel.helpers.ColumnHelper. The existing line:


... should either be changed to:


... or removed at all.
Comment 1 Javen O'Neal 2017-01-03 02:21:46 UTC
Created attachment 34580 [details]
Proposed patch from comment 0

It looks like that line was added in r775731 for bug 46161 with the commit message "xssf support for setGroupColumnCollapsed() setGroupRowCollapsed()".

> r636729       nick     public void setColumnAttributes(CTCol fromCol, CTCol toCol) {
> r1561435 kiwiwings         if(fromCol.isSetBestFit()) toCol.setBestFit(fromCol.getBestFit());
> ...
> r747895      yegor         if(fromCol.isSetCollapsed()) toCol.setCollapsed(fromCol.getCollapsed());
> ...
> r775731       nick         toCol.setCollapsed(fromCol.isSetCollapsed());
> r615258       nick     }

I'm in favor of deleting the unguarded toCol.setCollapsed, but it currently breaks TestXSSFSheet#setColumnGroupCollapsed.
This old unit test appears to have many problems, such as confusing isSetCollapsed with getCollapsed, assuming hidden is the same as collapsed, among many other problems. I am rewriting this unit test before making your changes to avoid regressions.