aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPJ Fanning <fanningpj@apache.org>2025-01-11 14:23:49 +0000
committerPJ Fanning <fanningpj@apache.org>2025-01-11 14:23:49 +0000
commit9eda2463986e817d8c4ebbc6f51d33c06311a86c (patch)
tree90a4d34a16cf3867275e3e1f456921f1d00dcec0
parent0ab1ccc20a609014bddaf1fe6a3e78c4d069f8e4 (diff)
downloadpoi-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
-rw-r--r--poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/AutoSizeColumnTracker.java4
-rw-r--r--poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java3
-rw-r--r--poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFSheet.java56
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);
+ }
+
}