diff options
author | PJ Fanning <fanningpj@apache.org> | 2025-01-11 14:23:49 +0000 |
---|---|---|
committer | PJ Fanning <fanningpj@apache.org> | 2025-01-11 14:23:49 +0000 |
commit | 9eda2463986e817d8c4ebbc6f51d33c06311a86c (patch) | |
tree | 90a4d34a16cf3867275e3e1f456921f1d00dcec0 | |
parent | 0ab1ccc20a609014bddaf1fe6a3e78c4d069f8e4 (diff) | |
download | poi-9eda2463986e817d8c4ebbc6f51d33c06311a86c.tar.gz poi-9eda2463986e817d8c4ebbc6f51d33c06311a86c.zip |
reimplement SXSSFSheet arbitrary extra width support (5.4.0 code does not work)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1923071 13f79535-47bb-0310-9956-ffa450edef68
3 files changed, 52 insertions, 11 deletions
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/AutoSizeColumnTracker.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/AutoSizeColumnTracker.java index b6b674a53b..de85d9a4d4 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/AutoSizeColumnTracker.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/AutoSizeColumnTracker.java @@ -392,9 +392,9 @@ import org.apache.poi.util.Internal; */ private void updateColumnWidth(final Cell cell, final ColumnWidthPair pair) { final double unmergedWidth = - SheetUtil.getCellWidth(cell, defaultCharWidth, dataFormatter, false) + arbitraryExtraWidth; + SheetUtil.getCellWidth(cell, defaultCharWidth, dataFormatter, false); final double mergedWidth = - SheetUtil.getCellWidth(cell, defaultCharWidth, dataFormatter, true) + arbitraryExtraWidth; + SheetUtil.getCellWidth(cell, defaultCharWidth, dataFormatter, true); pair.setMaxColumnWidths(unmergedWidth, mergedWidth); } } diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java index 08b7fb9c45..fc5462620e 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java @@ -1666,7 +1666,8 @@ public class SXSSFSheet implements Sheet, OoxmlSheetExtensions { } // get the best-fit width of rows currently in the random access window - final int activeWidth = (int) (256 * SheetUtil.getColumnWidth(this, column, useMergedCells)); + final double w1 = SheetUtil.getColumnWidth(this, column, useMergedCells); + final int activeWidth = (int) ((256 * w1) + getArbitraryExtraWidth()); // the best-fit width for both flushed rows and random access window rows // flushedWidth or activeWidth may be negative if column contains only blank cells diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFSheet.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFSheet.java index 015f608cf2..5ab64a69aa 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFSheet.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFSheet.java @@ -23,6 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import java.io.ByteArrayOutputStream; import java.io.IOException; import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream; @@ -45,7 +46,7 @@ public final class TestSXSSFSheet extends BaseTestXSheet { @AfterEach - void tearDown(){ + void tearDown() { SXSSFITestDataProvider.instance.cleanup(); } @@ -84,9 +85,9 @@ public final class TestSXSSFSheet extends BaseTestXSheet { } /** - * Bug 35084: cloning cells with formula - * - * The test is disabled because cloning of sheets is not supported in SXSSF + * Bug 35084: cloning cells with formula + * <p> + * The test is disabled because cloning of sheets is not supported in SXSSF */ @Override @Test @@ -193,9 +194,9 @@ public final class TestSXSSFSheet extends BaseTestXSheet { //one level sheet.groupRow(9, 10); - try(UnsynchronizedByteArrayOutputStream bos = UnsynchronizedByteArrayOutputStream.builder().get()) { + try (UnsynchronizedByteArrayOutputStream bos = UnsynchronizedByteArrayOutputStream.builder().get()) { workbook.write(bos); - try(XSSFWorkbook xssfWorkbook = new XSSFWorkbook(bos.toInputStream())) { + try (XSSFWorkbook xssfWorkbook = new XSSFWorkbook(bos.toInputStream())) { XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0); CTRow ctrow = xssfSheet.getRow(9).getCTRow(); @@ -223,9 +224,9 @@ public final class TestSXSSFSheet extends BaseTestXSheet { //two level sheet.groupRow(10, 13); - try(UnsynchronizedByteArrayOutputStream bos = UnsynchronizedByteArrayOutputStream.builder().get()) { + try (UnsynchronizedByteArrayOutputStream bos = UnsynchronizedByteArrayOutputStream.builder().get()) { workbook.write(bos); - try(XSSFWorkbook xssfWorkbook = new XSSFWorkbook(bos.toInputStream())) { + try (XSSFWorkbook xssfWorkbook = new XSSFWorkbook(bos.toInputStream())) { XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0); CTRow ctrow = xssfSheet.getRow(9).getCTRow(); @@ -242,4 +243,43 @@ public final class TestSXSSFSheet extends BaseTestXSheet { } } } + + @Test + void autosizeWithArbitraryExtraWidth() throws IOException { + final int extra = 100; + final String longText = + "This is a very long text that will exceed default column width for sure."; + int width0, width1 = 0; + try (SXSSFWorkbook workbook0 = new SXSSFWorkbook()) { + SXSSFSheet sheet = workbook0.createSheet(); + sheet.trackColumnForAutoSizing(0); + + SXSSFRow row = sheet.createRow(0); + row.createCell(0).setCellValue(longText); + sheet.autoSizeColumn(0); + + try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) { + workbook0.write(bos); + } + width0 = sheet.getColumnWidth(0); + } + + try (SXSSFWorkbook workbook1 = new SXSSFWorkbook()) { + SXSSFSheet sheet = workbook1.createSheet(); + sheet.setArbitraryExtraWidth(extra); + sheet.trackColumnForAutoSizing(0); + + SXSSFRow row = sheet.createRow(0); + row.createCell(0).setCellValue(longText); + sheet.autoSizeColumn(0); + + try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) { + workbook1.write(bos); + } + width1 = sheet.getColumnWidth(0); + } + + assertEquals(width0 + extra, width1); + } + } |