diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 446790656..a84c71bfb 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -33,6 +33,9 @@ + 47839 - improved API for OOXML custom properties + 47862 - fixed XSSFSheet.setColumnWidth to handle columns included in a column span + 47804 - fixed XSSFSheet.setColumnHidden to handle columns included in a column span 47889 - fixed XSSFCell.getStringCellValue() to properly handle cached formula results diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java index 4fb9185b9..8db42bc18 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java @@ -1086,7 +1086,8 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { * @return hidden - false if the column is visible */ public boolean isColumnHidden(int columnIndex) { - return columnHelper.getColumn(columnIndex, false).getHidden(); + CTCol col = columnHelper.getColumn(columnIndex, false); + return col != null && col.getHidden(); } /** diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/ColumnHelper.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/ColumnHelper.java index 4f8f33b5b..8359ab818 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/ColumnHelper.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/ColumnHelper.java @@ -72,7 +72,7 @@ public class ColumnHelper { worksheet.setColsArray(0, newCols); } - public void sortColumns(CTCols newCols) { + public static void sortColumns(CTCols newCols) { CTCol[] colArray = newCols.getColArray(); Arrays.sort(colArray, new CTColComparator()); newCols.setColArray(colArray); @@ -235,17 +235,17 @@ public class ColumnHelper { col.setBestFit(bestFit); } public void setCustomWidth(long index, boolean bestFit) { - CTCol col = getOrCreateColumn1Based(index+1, false); + CTCol col = getOrCreateColumn1Based(index+1, true); col.setCustomWidth(bestFit); } public void setColWidth(long index, double width) { - CTCol col = getOrCreateColumn1Based(index+1, false); + CTCol col = getOrCreateColumn1Based(index+1, true); col.setWidth(width); } public void setColHidden(long index, boolean hidden) { - CTCol col = getOrCreateColumn1Based(index+1, false); + CTCol col = getOrCreateColumn1Based(index+1, true); col.setHidden(hidden); } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java index 39a1a4d76..d0110f410 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java @@ -717,4 +717,130 @@ public class TestXSSFSheet extends BaseTestSheet { assertEquals(33.0, col.getWidth(), 0.0); assertTrue(col.getCustomWidth()); } + + /** + * Setting width of a column included in a column span + */ + public void test47862() { + XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("47862.xlsx"); + XSSFSheet sheet = wb.getSheetAt(0); + CTCols cols = sheet.getCTWorksheet().getColsArray(0); + // + // + // + + //a span of columns [1,5] + assertEquals(1, cols.sizeOfColArray()); + CTCol col = cols.getColArray(0); + assertEquals(1, col.getMin()); + assertEquals(5, col.getMax()); + double swidth = 15.77734375; //width of columns in the span + assertEquals(swidth, col.getWidth()); + + for (int i = 0; i < 5; i++) { + assertEquals((int)(swidth*256), sheet.getColumnWidth(i)); + } + + int[] cw = new int[]{10, 15, 20, 25, 30}; + for (int i = 0; i < 5; i++) { + sheet.setColumnWidth(i, cw[i]*256); + } + + //the check below failed prior to fix of Bug #47862 + ColumnHelper.sortColumns(cols); + // + // + // + // + // + // + // + + //now the span is splitted into 5 individual columns + assertEquals(5, cols.sizeOfColArray()); + for (int i = 0; i < 5; i++) { + assertEquals(cw[i]*256, sheet.getColumnWidth(i)); + assertEquals((double)cw[i], cols.getColArray(i).getWidth()); + } + + //serialize and check again + wb = getTestDataProvider().writeOutAndReadBack(wb); + sheet = wb.getSheetAt(0); + cols = sheet.getCTWorksheet().getColsArray(0); + assertEquals(5, cols.sizeOfColArray()); + for (int i = 0; i < 5; i++) { + assertEquals(cw[i]*256, sheet.getColumnWidth(i)); + assertEquals((double)cw[i], cols.getColArray(i).getWidth()); + } + } + + /** + * Hiding a column included in a column span + */ + public void test47804() { + XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("47804.xlsx"); + XSSFSheet sheet = wb.getSheetAt(0); + CTCols cols = sheet.getCTWorksheet().getColsArray(0); + assertEquals(2, cols.sizeOfColArray()); + CTCol col; + // + // + // + // + + //a span of columns [2,4] + col = cols.getColArray(0); + assertEquals(2, col.getMin()); + assertEquals(4, col.getMax()); + //individual column + col = cols.getColArray(1); + assertEquals(7, col.getMin()); + assertEquals(7, col.getMax()); + + sheet.setColumnHidden(2, true); // Column C + sheet.setColumnHidden(6, true); // Column G + + assertTrue(sheet.isColumnHidden(2)); + assertTrue(sheet.isColumnHidden(6)); + + //other columns but C and G are not hidden + assertFalse(sheet.isColumnHidden(1)); + assertFalse(sheet.isColumnHidden(3)); + assertFalse(sheet.isColumnHidden(4)); + assertFalse(sheet.isColumnHidden(5)); + + //the check below failed prior to fix of Bug #47804 + ColumnHelper.sortColumns(cols); + //the span is now splitted into three parts + // + // + // + // + // + // + + assertEquals(4, cols.sizeOfColArray()); + col = cols.getColArray(0); + assertEquals(2, col.getMin()); + assertEquals(2, col.getMax()); + col = cols.getColArray(1); + assertEquals(3, col.getMin()); + assertEquals(3, col.getMax()); + col = cols.getColArray(2); + assertEquals(4, col.getMin()); + assertEquals(4, col.getMax()); + col = cols.getColArray(3); + assertEquals(7, col.getMin()); + assertEquals(7, col.getMax()); + + //serialize and check again + wb = getTestDataProvider().writeOutAndReadBack(wb); + sheet = wb.getSheetAt(0); + assertTrue(sheet.isColumnHidden(2)); + assertTrue(sheet.isColumnHidden(6)); + assertFalse(sheet.isColumnHidden(1)); + assertFalse(sheet.isColumnHidden(3)); + assertFalse(sheet.isColumnHidden(4)); + assertFalse(sheet.isColumnHidden(5)); + } } diff --git a/test-data/spreadsheet/47804.xlsx b/test-data/spreadsheet/47804.xlsx new file mode 100644 index 000000000..7e1434628 Binary files /dev/null and b/test-data/spreadsheet/47804.xlsx differ diff --git a/test-data/spreadsheet/47862.xlsx b/test-data/spreadsheet/47862.xlsx new file mode 100644 index 000000000..d5d19c8ca Binary files /dev/null and b/test-data/spreadsheet/47862.xlsx differ