From 9c2787efb487b31651125fee42ff2a2516f08236 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Wed, 9 Jan 2008 09:55:20 +0000 Subject: [PATCH] Have autoSizeColumn skip over merged regions - bug #43902. Patch from Paolo git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@610328 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/hssf/usermodel/HSSFSheet.java | 8 +++- .../org/apache/poi/hssf/data/43902.xls | Bin 0 -> 83456 bytes .../poi/hssf/usermodel/TestHSSFSheet.java | 39 ++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 src/testcases/org/apache/poi/hssf/data/43902.xls diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java b/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java index 5855a4937..6fc113c08 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java @@ -1615,7 +1615,13 @@ public class HSSFSheet for (Iterator it = rowIterator(); it.hasNext();) { HSSFRow row = (HSSFRow) it.next(); HSSFCell cell = row.getCell(column); - if (cell == null) continue; + + boolean isCellInMergedRegion = false; + for (int i = 0 ; i < getNumMergedRegions() && ! isCellInMergedRegion; i++) { + isCellInMergedRegion = getMergedRegionAt(i).contains(row.getRowNum(), column); + } + + if (cell == null | isCellInMergedRegion) continue; HSSFCellStyle style = cell.getCellStyle(); HSSFFont font = wb.getFontAt(style.getFontIndex()); diff --git a/src/testcases/org/apache/poi/hssf/data/43902.xls b/src/testcases/org/apache/poi/hssf/data/43902.xls new file mode 100644 index 0000000000000000000000000000000000000000..a67720d6c410ef5e16a2fbad1199d270d16a431c GIT binary patch literal 83456 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 Nvs1HK$~US1{{bv%){y`J literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheet.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheet.java index f6f506c57..9a6f9dca0 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheet.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheet.java @@ -32,6 +32,7 @@ import org.apache.poi.hssf.record.VCenterRecord; import org.apache.poi.hssf.record.WSBoolRecord; import org.apache.poi.hssf.record.WindowTwoRecord; import org.apache.poi.hssf.util.Region; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.util.TempFile; /** @@ -614,6 +615,44 @@ public class TestHSSFSheet workbook = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); assertTrue("No Exceptions while reading file", true); + } + + public void testAutoSizeColumn() throws Exception { + String filename = System.getProperty("HSSF.testdata.path"); + filename = filename + "/43902.xls"; + String sheetName = "my sheet"; + FileInputStream is = new FileInputStream(filename); + POIFSFileSystem fs = new POIFSFileSystem(is); + HSSFWorkbook wb = new HSSFWorkbook(fs); + HSSFSheet sheet = wb.getSheet(sheetName); + + // autoSize the first column and check its size before the merged region (1,0,1,1) is set: + // it has to be based on the 2nd row width + sheet.autoSizeColumn((short)0); + assertEquals("Column autosized with only one row: wrong width", (short)7169, sheet.getColumnWidth((short)0)); + + //create a region over the 2nd row and auto size the first column + sheet.addMergedRegion(new Region(1,(short)0,1,(short)1)); + sheet.autoSizeColumn((short)0); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + wb.write(out); + out.close(); + + // check that the autoSized column width has ignored the 2nd row + // because it is included in a merged region (Excel like behavior) + HSSFWorkbook wb2 = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); + HSSFSheet sheet2 = wb2.getSheet(sheetName); + assertEquals((short)3024, sheet2.getColumnWidth((short)0)); + + // remove the 2nd row merged region and check that the 2nd row value is used to the autoSizeColumn width + sheet2.removeMergedRegion(1); + sheet2.autoSizeColumn((short)0); + out = new ByteArrayOutputStream(); + wb2.write(out); + out.close(); + HSSFWorkbook wb3 = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); + HSSFSheet sheet3 = wb3.getSheet(sheetName); + assertEquals((short)7169, sheet3.getColumnWidth((short)0)); } public static void main(java.lang.String[] args) {