From: PJ Fanning Date: Fri, 4 Feb 2022 20:16:44 +0000 (+0000) Subject: introduce CellReferenceType X-Git-Tag: REL_5_2_1~99 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=e6926f9779cca31c458cb9b01ceb6f816bfe7428;p=poi.git introduce CellReferenceType git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1897779 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java index 3c392cc63c..50f945a44b 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java @@ -50,6 +50,7 @@ import org.apache.poi.openxml4j.util.ZipSecureFile; import org.apache.poi.ss.SpreadsheetVersion; import org.apache.poi.ss.formula.EvaluationWorkbook; import org.apache.poi.ss.formula.udf.UDFFinder; +import org.apache.poi.ss.usermodel.CellReferenceType; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.DataFormat; @@ -1356,8 +1357,8 @@ public class SXSSFWorkbook implements Workbook { } @Override - public Boolean usesR1C1CellReferences() { - return getXSSFWorkbook().usesR1C1CellReferences(); + public CellReferenceType getCellReferenceType() { + return getXSSFWorkbook().getCellReferenceType(); } @Override diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java index 0fd6eb56a9..dc4e8448e6 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java @@ -71,6 +71,7 @@ import org.apache.poi.ss.formula.SheetNameFormatter; import org.apache.poi.ss.formula.udf.AggregatingUDFFinder; import org.apache.poi.ss.formula.udf.IndexedUDFFinder; import org.apache.poi.ss.formula.udf.UDFFinder; +import org.apache.poi.ss.usermodel.CellReferenceType; import org.apache.poi.ss.usermodel.DataFormat; import org.apache.poi.ss.usermodel.Date1904Support; import org.apache.poi.ss.usermodel.Name; @@ -1551,16 +1552,16 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Date1904Su } @Override - public Boolean usesR1C1CellReferences() { + public CellReferenceType getCellReferenceType() { final CTCalcPr calcPr = getCTWorkbook().getCalcPr(); if (calcPr == null) { - return null; + return CellReferenceType.UNKNOWN; } else if (calcPr.getRefMode() == R_1_C_1) { - return Boolean.TRUE; + return CellReferenceType.R1C1; } else if (calcPr.getRefMode() == A_1) { - return Boolean.FALSE; + return CellReferenceType.A1; } - return null; + return CellReferenceType.UNKNOWN; } @Override diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java index de1e1cc312..51a91fc920 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java @@ -17,38 +17,38 @@ package org.apache.poi.xssf.usermodel; -import static org.apache.commons.io.output.NullOutputStream.NULL_OUTPUT_STREAM; -import static org.apache.poi.hssf.HSSFTestDataSamples.openSampleFileStream; -import static org.apache.poi.xssf.XSSFTestDataSamples.*; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertSame; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.zip.CRC32; - import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream; import org.apache.poi.POIDataSamples; import org.apache.poi.hssf.HSSFTestDataSamples; import org.apache.poi.ooxml.POIXMLProperties; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; -import org.apache.poi.openxml4j.opc.*; +import org.apache.poi.openxml4j.opc.ContentTypes; +import org.apache.poi.openxml4j.opc.OPCPackage; +import org.apache.poi.openxml4j.opc.PackageAccess; +import org.apache.poi.openxml4j.opc.PackagePart; +import org.apache.poi.openxml4j.opc.PackagePartName; +import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.openxml4j.opc.PackageRelationshipCollection; +import org.apache.poi.openxml4j.opc.PackagingURIHelper; +import org.apache.poi.openxml4j.opc.ZipPackage; import org.apache.poi.openxml4j.opc.internal.FileHelper; import org.apache.poi.openxml4j.opc.internal.MemoryPackagePart; import org.apache.poi.openxml4j.opc.internal.PackagePropertiesPart; import org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource; import org.apache.poi.ss.tests.usermodel.BaseTestXWorkbook; -import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellReferenceType; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Comment; +import org.apache.poi.ss.usermodel.DataFormatter; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.FormulaError; +import org.apache.poi.ss.usermodel.RichTextString; +import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Row.MissingCellPolicy; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.util.AreaReference; import org.apache.poi.ss.util.CellAddress; import org.apache.poi.ss.util.CellReference; @@ -68,6 +68,31 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbookPr; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCalcMode; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.zip.CRC32; + +import static org.apache.commons.io.output.NullOutputStream.NULL_OUTPUT_STREAM; +import static org.apache.poi.hssf.HSSFTestDataSamples.openSampleFileStream; +import static org.apache.poi.xssf.XSSFTestDataSamples.openSampleWorkbook; +import static org.apache.poi.xssf.XSSFTestDataSamples.writeOut; +import static org.apache.poi.xssf.XSSFTestDataSamples.writeOutAndReadBack; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + public final class TestXSSFWorkbook extends BaseTestXWorkbook { public TestXSSFWorkbook() { @@ -1347,12 +1372,12 @@ public final class TestXSSFWorkbook extends BaseTestXWorkbook { UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream(); XSSFWorkbook wb = openSampleWorkbook("WithTable.xlsx") ) { - assertFalse(wb.usesR1C1CellReferences()); + assertEquals(CellReferenceType.A1, wb.getCellReferenceType()); wb.setUseR1C1CellReferences(true); - assertTrue(wb.usesR1C1CellReferences()); + assertEquals(CellReferenceType.R1C1, wb.getCellReferenceType()); wb.write(bos); try (XSSFWorkbook wb2 = new XSSFWorkbook(bos.toInputStream())) { - assertTrue(wb2.usesR1C1CellReferences()); + assertEquals(CellReferenceType.R1C1, wb2.getCellReferenceType()); } } } @@ -1363,12 +1388,12 @@ public final class TestXSSFWorkbook extends BaseTestXWorkbook { UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream(); XSSFWorkbook wb = new XSSFWorkbook() ) { - assertNull(wb.usesR1C1CellReferences()); + assertEquals(CellReferenceType.UNKNOWN, wb.getCellReferenceType()); wb.setUseR1C1CellReferences(true); - assertTrue(wb.usesR1C1CellReferences()); + assertEquals(CellReferenceType.R1C1, wb.getCellReferenceType()); wb.write(bos); try (XSSFWorkbook wb2 = new XSSFWorkbook(bos.toInputStream())) { - assertTrue(wb2.usesR1C1CellReferences()); + assertEquals(CellReferenceType.R1C1, wb2.getCellReferenceType()); } } } diff --git a/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java b/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java index cc457daa12..82473b60ff 100644 --- a/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java +++ b/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java @@ -96,6 +96,7 @@ import org.apache.poi.ss.formula.SheetNameFormatter; import org.apache.poi.ss.formula.udf.AggregatingUDFFinder; import org.apache.poi.ss.formula.udf.IndexedUDFFinder; import org.apache.poi.ss.formula.udf.UDFFinder; +import org.apache.poi.ss.usermodel.CellReferenceType; import org.apache.poi.ss.usermodel.Name; import org.apache.poi.ss.usermodel.Row.MissingCellPolicy; import org.apache.poi.ss.usermodel.Sheet; @@ -1748,7 +1749,7 @@ public final class HSSFWorkbook extends POIDocument implements Workbook { } @Override - public Boolean usesR1C1CellReferences() { + public CellReferenceType getCellReferenceType() { for (HSSFSheet hssfSheet : _sheets) { InternalSheet internalSheet = hssfSheet.getSheet(); @@ -1759,14 +1760,14 @@ public final class HSSFWorkbook extends POIDocument implements Workbook { if (record instanceof RefModeRecord) refModeRecord = (RefModeRecord)record; } if (refModeRecord == null) { - return null; + continue; } else if (refModeRecord.getMode() == RefModeRecord.USE_R1C1_MODE) { - return Boolean.TRUE; + return CellReferenceType.R1C1; } else if (refModeRecord.getMode() == RefModeRecord.USE_A1_MODE) { - return Boolean.FALSE; + return CellReferenceType.A1; } } - return null; + return CellReferenceType.UNKNOWN; } /** diff --git a/poi/src/main/java/org/apache/poi/ss/usermodel/CellReferenceType.java b/poi/src/main/java/org/apache/poi/ss/usermodel/CellReferenceType.java new file mode 100644 index 0000000000..c4f9bc0c38 --- /dev/null +++ b/poi/src/main/java/org/apache/poi/ss/usermodel/CellReferenceType.java @@ -0,0 +1,40 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.ss.usermodel; + +/** + * Types of cell references. + * @since POI 5.2.1 + */ +public enum CellReferenceType { + + /** + * Cells are referenced in the form A1, B4, etc. + */ + A1, + + /** + * Cells are referenced in the form R1C1, R4C2, etc. + */ + R1C1, + + /** + * The cell reference type is not defined explicitly by A1 is the default in this case. + */ + UNKNOWN +} diff --git a/poi/src/main/java/org/apache/poi/ss/usermodel/Workbook.java b/poi/src/main/java/org/apache/poi/ss/usermodel/Workbook.java index 3851ed581e..7f59ab17b5 100644 --- a/poi/src/main/java/org/apache/poi/ss/usermodel/Workbook.java +++ b/poi/src/main/java/org/apache/poi/ss/usermodel/Workbook.java @@ -633,11 +633,10 @@ public interface Workbook extends Closeable, Iterable { EvaluationWorkbook createEvaluationWorkbook(); /** - * @return true if workbook is configured to use R1C1 cell references (as opposed to A1 cell references). - * Returns null if the configuration is not explicitly set on the workbook. + * @return the type of cell references used * @since POI 5.2.1 */ - Boolean usesR1C1CellReferences(); + CellReferenceType getCellReferenceType(); /** * @param useR1C1CellReferences set to true if you want to configure workbook to use R1C1 cell references (as opposed to A1 cell references). diff --git a/poi/src/test/java/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java b/poi/src/test/java/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java index 35caef0690..3851c44a7e 100644 --- a/poi/src/test/java/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java +++ b/poi/src/test/java/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java @@ -61,6 +61,7 @@ import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.ss.formula.ptg.Area3DPtg; import org.apache.poi.ss.usermodel.BaseTestWorkbook; import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellReferenceType; import org.apache.poi.ss.usermodel.ConditionalFormatting; import org.apache.poi.ss.usermodel.ConditionalFormattingRule; import org.apache.poi.ss.usermodel.Name; @@ -1184,12 +1185,12 @@ public final class TestHSSFWorkbook extends BaseTestWorkbook { UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream(); HSSFWorkbook wb = openSampleWorkbook("49423.xls") ) { - assertFalse(wb.usesR1C1CellReferences()); + assertEquals(CellReferenceType.A1, wb.getCellReferenceType()); wb.setUseR1C1CellReferences(true); - assertTrue(wb.usesR1C1CellReferences()); + assertEquals(CellReferenceType.R1C1, wb.getCellReferenceType()); wb.write(bos); try (HSSFWorkbook wb2 = new HSSFWorkbook(bos.toInputStream())) { - assertTrue(wb2.usesR1C1CellReferences()); + assertEquals(CellReferenceType.R1C1, wb2.getCellReferenceType()); } } } @@ -1200,14 +1201,14 @@ public final class TestHSSFWorkbook extends BaseTestWorkbook { UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream(); HSSFWorkbook wb = new HSSFWorkbook() ) { - assertNull(wb.usesR1C1CellReferences()); + assertEquals(CellReferenceType.UNKNOWN, wb.getCellReferenceType()); HSSFSheet sheet = wb.createSheet(); - assertFalse(wb.usesR1C1CellReferences()); + assertEquals(CellReferenceType.A1, wb.getCellReferenceType()); wb.setUseR1C1CellReferences(true); - assertTrue(wb.usesR1C1CellReferences()); + assertEquals(CellReferenceType.R1C1, wb.getCellReferenceType()); wb.write(bos); try (HSSFWorkbook wb2 = new HSSFWorkbook(bos.toInputStream())) { - assertTrue(wb2.usesR1C1CellReferences()); + assertEquals(CellReferenceType.R1C1, wb2.getCellReferenceType()); } } }