From ab64303cbbbdc180b53e3f83dd063bdb49d9669c Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Sun, 26 Apr 2020 17:07:26 +0200 Subject: [PATCH] allow xlsx files to have more columns (#2602) --- .../google/refine/exporters/XlsExporter.java | 18 ++++++++++++++---- .../refine/exporters/XlsExporterTests.java | 7 +++++++ .../refine/exporters/XlsxExporterTests.java | 8 ++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/main/src/com/google/refine/exporters/XlsExporter.java b/main/src/com/google/refine/exporters/XlsExporter.java index 18458ac37..fb1d01738 100644 --- a/main/src/com/google/refine/exporters/XlsExporter.java +++ b/main/src/com/google/refine/exporters/XlsExporter.java @@ -42,6 +42,7 @@ import java.util.Properties; import org.apache.poi.ss.usermodel.Hyperlink; import org.apache.poi.common.usermodel.HyperlinkType; import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.SpreadsheetVersion; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Row; @@ -98,10 +99,12 @@ public class XlsExporter implements StreamExporter { @Override public void addRow(List cells, boolean isHeader) { Row r = s.createRow(rowCount++); - + int maxColumns = getSpreadsheetVersion().getMaxColumns(); + int maxTextLength = getSpreadsheetVersion().getMaxTextLength(); + for (int i = 0; i < cells.size(); i++) { Cell c = r.createCell(i); - if (i == 255 && cells.size() > 256) { + if (i == (maxColumns - 1) && cells.size() > maxColumns) { c.setCellValue("ERROR: TOO MANY COLUMNS"); break; } else { @@ -119,9 +122,9 @@ public class XlsExporter implements StreamExporter { c.setCellStyle(dateStyle); } else { String s = cellData.text; - if (s.length() > 32767) { + if (s.length() > maxTextLength) { // The maximum length of cell contents (text) is 32,767 characters - s = s.substring(0, 32767); + s = s.substring(0, maxTextLength); } c.setCellValue(s); } @@ -151,4 +154,11 @@ public class XlsExporter implements StreamExporter { wb.close(); } + /** + * @return POI SpreadsheetVersion with metadata about row and column limits + */ + SpreadsheetVersion getSpreadsheetVersion() { + return xml ? SpreadsheetVersion.EXCEL2007 : SpreadsheetVersion.EXCEL97; + } + } diff --git a/main/tests/server/src/com/google/refine/exporters/XlsExporterTests.java b/main/tests/server/src/com/google/refine/exporters/XlsExporterTests.java index c5fbe6660..55a4f6344 100644 --- a/main/tests/server/src/com/google/refine/exporters/XlsExporterTests.java +++ b/main/tests/server/src/com/google/refine/exporters/XlsExporterTests.java @@ -45,6 +45,7 @@ import java.time.OffsetDateTime; import java.util.Properties; import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.SpreadsheetVersion; import org.slf4j.LoggerFactory; import org.testng.Assert; import org.testng.annotations.AfterMethod; @@ -113,6 +114,12 @@ public class XlsExporterTests extends RefineTest { Assert.assertEquals(SUT.getContentType(), "application/vnd.ms-excel"); } + @Test + public void getSpreadsheetVersion(){ + XlsExporter exporter = (XlsExporter)SUT; + Assert.assertEquals(exporter.getSpreadsheetVersion(), SpreadsheetVersion.EXCEL97); + } + @Test public void exportSimpleXls() throws IOException { CreateGrid(2, 2); diff --git a/main/tests/server/src/com/google/refine/exporters/XlsxExporterTests.java b/main/tests/server/src/com/google/refine/exporters/XlsxExporterTests.java index 0c8c1a6a7..9e43a615d 100644 --- a/main/tests/server/src/com/google/refine/exporters/XlsxExporterTests.java +++ b/main/tests/server/src/com/google/refine/exporters/XlsxExporterTests.java @@ -34,6 +34,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package com.google.refine.exporters; import java.io.ByteArrayInputStream; + +import org.apache.poi.ss.SpreadsheetVersion; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFRow; @@ -115,6 +117,12 @@ public class XlsxExporterTests extends RefineTest { Assert.assertEquals(SUT.getContentType(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); } + @Test + public void getSpreadsheetVersion(){ + XlsExporter exporter = (XlsExporter)SUT; + Assert.assertEquals(exporter.getSpreadsheetVersion(), SpreadsheetVersion.EXCEL2007); + } + @Test public void exportSimpleXlsx(){ CreateGrid(2, 2);