]> source.dussan.org Git - poi.git/commitdiff
introduce CellReferenceType
authorPJ Fanning <fanningpj@apache.org>
Fri, 4 Feb 2022 20:29:55 +0000 (20:29 +0000)
committerPJ Fanning <fanningpj@apache.org>
Fri, 4 Feb 2022 20:29:55 +0000 (20:29 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1897780 13f79535-47bb-0310-9956-ffa450edef68

poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java
poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java
poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
poi/src/main/java/org/apache/poi/ss/usermodel/Workbook.java
poi/src/test/java/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java

index 50f945a44b5552d7bb9404efeb65e3071ec14b3d..37ea1519be31d10115674d2e935350cf0e11824e 100644 (file)
@@ -1362,7 +1362,7 @@ public class SXSSFWorkbook implements Workbook {
     }
 
     @Override
-    public void setUseR1C1CellReferences(boolean useR1C1CellReferences) {
-        getXSSFWorkbook().setUseR1C1CellReferences(useR1C1CellReferences);
+    public void setCellReferenceType(CellReferenceType cellReferenceType) {
+        getXSSFWorkbook().setCellReferenceType(cellReferenceType);
     }
 }
index dc4e8448e6c06b1c643b018f42f71e0353d5b4d2..037531f3fb10d28d783a710bca63d6e7e84479ec 100644 (file)
@@ -1565,11 +1565,17 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Date1904Su
     }
 
     @Override
-    public void setUseR1C1CellReferences(boolean useR1C1CellReferences) {
+    public void setCellReferenceType(CellReferenceType cellReferenceType) {
         CTCalcPr calcPr = getCTWorkbook().getCalcPr();
-        if (calcPr == null) calcPr = getCTWorkbook().addNewCalcPr();
-        STRefMode.Enum refMode = useR1C1CellReferences ? R_1_C_1 : A_1;
-        calcPr.setRefMode(refMode);
+        if (cellReferenceType == CellReferenceType.UNKNOWN) {
+            if (calcPr != null) {
+                calcPr.unsetRefMode();
+            }
+        } else {
+            if (calcPr == null) calcPr = getCTWorkbook().addNewCalcPr();
+            STRefMode.Enum refMode = cellReferenceType == CellReferenceType.R1C1 ? R_1_C_1 : A_1;
+            calcPr.setRefMode(refMode);
+        }
     }
 
     private static String getReferencePrintArea(String sheetName, int startC, int endC, int startR, int endR) {
index 51a91fc920ac778ec2e0b019d54082e128bf037d..235d16116a1624f59b370f98a41d1d84142ce6d7 100644 (file)
@@ -1373,7 +1373,7 @@ public final class TestXSSFWorkbook extends BaseTestXWorkbook {
                 XSSFWorkbook wb = openSampleWorkbook("WithTable.xlsx")
         ) {
             assertEquals(CellReferenceType.A1, wb.getCellReferenceType());
-            wb.setUseR1C1CellReferences(true);
+            wb.setCellReferenceType(CellReferenceType.R1C1);
             assertEquals(CellReferenceType.R1C1, wb.getCellReferenceType());
             wb.write(bos);
             try (XSSFWorkbook wb2 = new XSSFWorkbook(bos.toInputStream())) {
@@ -1389,7 +1389,7 @@ public final class TestXSSFWorkbook extends BaseTestXWorkbook {
                 XSSFWorkbook wb = new XSSFWorkbook()
         ) {
             assertEquals(CellReferenceType.UNKNOWN, wb.getCellReferenceType());
-            wb.setUseR1C1CellReferences(true);
+            wb.setCellReferenceType(CellReferenceType.R1C1);
             assertEquals(CellReferenceType.R1C1, wb.getCellReferenceType());
             wb.write(bos);
             try (XSSFWorkbook wb2 = new XSSFWorkbook(bos.toInputStream())) {
index 82473b60ffe5b24e16aa163b5b4d0116cc1567c8..9b799191773508a61492410730c4c818a18b342e 100644 (file)
@@ -1757,7 +1757,10 @@ public final class HSSFWorkbook extends POIDocument implements Workbook {
 
             RefModeRecord refModeRecord = null;
             for (RecordBase record : records) {
-                if (record instanceof RefModeRecord) refModeRecord = (RefModeRecord)record;
+                if (record instanceof RefModeRecord) {
+                    refModeRecord = (RefModeRecord)record;
+                    break;
+                }
             }
             if (refModeRecord == null) {
                 continue;
@@ -1771,17 +1774,17 @@ public final class HSSFWorkbook extends POIDocument implements Workbook {
     }
 
     /**
-     * Configure workbook to use R1C1 cell references (as opposed to A1 cell references).
+     * Configure workbook to a specific cell reference type, e.g. R1C1 cell references (as opposed to A1 cell references).
      * <p>
      *     Note that HSSF format stores this information at sheet level - so if the workbook has no sheets,
      *     this call will have no effect. It is recommended that you call this (possibly again) just before
      *     writing HSSFWorkbook.
      * </p>
-     * @param useR1C1CellReferences set to true if you want to configure workbook to use R1C1 cell references (as opposed to A1 cell references).
+     * @param cellReferenceType the type of cell references used
      * @since POI 5.2.1
      */
     @Override
-    public void setUseR1C1CellReferences(boolean useR1C1CellReferences) {
+    public void setCellReferenceType(CellReferenceType cellReferenceType) {
         for (HSSFSheet hssfSheet : _sheets) {
 
             InternalSheet internalSheet = hssfSheet.getSheet();
@@ -1790,20 +1793,27 @@ public final class HSSFWorkbook extends POIDocument implements Workbook {
 
             RefModeRecord refModeRecord = null;
             for (RecordBase record : records) {
-                if (record instanceof RefModeRecord) refModeRecord = (RefModeRecord)record;
+                if (record instanceof RefModeRecord) {
+                    refModeRecord = (RefModeRecord)record;
+                    break;
+                }
             }
-            if (useR1C1CellReferences) {
+            if (cellReferenceType == CellReferenceType.R1C1) {
                 if (refModeRecord == null) {
                     refModeRecord = new RefModeRecord();
                     records.add(records.size() - 1, refModeRecord);
                 }
                 refModeRecord.setMode(RefModeRecord.USE_R1C1_MODE);
-            } else {
+            } else if (cellReferenceType == CellReferenceType.A1) {
                 if (refModeRecord == null) {
                     refModeRecord = new RefModeRecord();
                     records.add(records.size() - 1, refModeRecord);
                 }
                 refModeRecord.setMode(RefModeRecord.USE_A1_MODE);
+            } else {
+                if (refModeRecord != null) {
+                    records.remove(refModeRecord);
+                }
             }
         }
     }
index 7f59ab17b56ee9bff644cfe425948e0d69d73a05..64d6c1cf416a71f2e947a147d5d03882ea45ea41 100644 (file)
@@ -639,8 +639,8 @@ public interface Workbook extends Closeable, Iterable<Sheet> {
     CellReferenceType getCellReferenceType();
 
     /**
-     * @param useR1C1CellReferences set to true if you want to configure workbook to use R1C1 cell references (as opposed to A1 cell references).
+     * @param cellReferenceType the type of cell references used
      * @since POI 5.2.1
      */
-    void setUseR1C1CellReferences(boolean useR1C1CellReferences);
+    void setCellReferenceType(CellReferenceType cellReferenceType);
 }
index 3851c44a7e20fd74e741a1112f5bd1b88f0425ee..3cd5b703825f0bf403c387c9e728893dbebc7fe0 100644 (file)
@@ -1186,7 +1186,7 @@ public final class TestHSSFWorkbook extends BaseTestWorkbook {
                 HSSFWorkbook wb = openSampleWorkbook("49423.xls")
         ) {
             assertEquals(CellReferenceType.A1, wb.getCellReferenceType());
-            wb.setUseR1C1CellReferences(true);
+            wb.setCellReferenceType(CellReferenceType.R1C1);
             assertEquals(CellReferenceType.R1C1, wb.getCellReferenceType());
             wb.write(bos);
             try (HSSFWorkbook wb2 = new HSSFWorkbook(bos.toInputStream())) {
@@ -1204,7 +1204,7 @@ public final class TestHSSFWorkbook extends BaseTestWorkbook {
             assertEquals(CellReferenceType.UNKNOWN, wb.getCellReferenceType());
             HSSFSheet sheet = wb.createSheet();
             assertEquals(CellReferenceType.A1, wb.getCellReferenceType());
-            wb.setUseR1C1CellReferences(true);
+            wb.setCellReferenceType(CellReferenceType.R1C1);
             assertEquals(CellReferenceType.R1C1, wb.getCellReferenceType());
             wb.write(bos);
             try (HSSFWorkbook wb2 = new HSSFWorkbook(bos.toInputStream())) {