]> source.dussan.org Git - poi.git/commitdiff
add excel Workbook.usesR1C1CellReferences()
authorPJ Fanning <fanningpj@apache.org>
Tue, 1 Feb 2022 10:36:34 +0000 (10:36 +0000)
committerPJ Fanning <fanningpj@apache.org>
Tue, 1 Feb 2022 10:36:34 +0000 (10:36 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1897649 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/src/main/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
poi/src/main/java/org/apache/poi/ss/usermodel/Workbook.java

index 189787f96b716bfd0dc63921fa53c4ee59dc9e1e..584a1f3f2378b45c7001154e42dca25a3b128c08 100644 (file)
@@ -1350,9 +1350,13 @@ public class SXSSFWorkbook implements Workbook {
         return _wb.addOlePackage(oleData, label, fileName, command);
     }
 
-
     @Override
     public EvaluationWorkbook createEvaluationWorkbook() {
         return SXSSFEvaluationWorkbook.create(this);
     }
+
+    @Override
+    public Boolean usesR1C1CellReferences() {
+        return getXSSFWorkbook().usesR1C1CellReferences();
+    }
 }
index 7988e4e6e099765e466cc28ee32e7d8dd9c76ff7..47e19e29569d9786937c745b99dd7d29295ff155 100644 (file)
@@ -20,6 +20,7 @@ package org.apache.poi.xssf.usermodel;
 import static org.apache.poi.ooxml.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;
 import static org.apache.poi.xssf.usermodel.helpers.XSSFPasswordHelper.setPassword;
 import static org.apache.poi.xssf.usermodel.helpers.XSSFPasswordHelper.validatePassword;
+import static org.openxmlformats.schemas.spreadsheetml.x2006.main.STRefMode.*;
 
 import java.io.File;
 import java.io.IOException;
@@ -1566,6 +1567,19 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Date1904Su
         setPrintArea(sheetIndex, reference);
     }
 
+    @Override
+    public Boolean usesR1C1CellReferences() {
+        final CTCalcPr calcPr = getCTWorkbook().getCalcPr();
+        if (calcPr == null) {
+            return null;
+        } else if (calcPr.getRefMode() == R_1_C_1) {
+            return Boolean.TRUE;
+        } else if (calcPr.getRefMode() == A_1) {
+            return Boolean.FALSE;
+        }
+        return null;
+    }
+
     private static String getReferencePrintArea(String sheetName, int startC, int endC, int startR, int endR) {
         //windows excel example: Sheet1!$C$3:$E$4
         CellReference colRef = new CellReference(sheetName, startR, startC, true, true);
index e369488d107b8151cbf14625a25589033d9ffd75..86cd7440fdfe940e562a10c692915bb36357487c 100644 (file)
@@ -69,22 +69,7 @@ import org.apache.poi.hssf.model.InternalSheet.UnsupportedBOFType;
 import org.apache.poi.hssf.model.InternalWorkbook;
 import org.apache.poi.hssf.model.RecordStream;
 import org.apache.poi.hssf.model.WorkbookRecordList;
-import org.apache.poi.hssf.record.AbstractEscherHolderRecord;
-import org.apache.poi.hssf.record.BackupRecord;
-import org.apache.poi.hssf.record.BoundSheetRecord;
-import org.apache.poi.hssf.record.DrawingGroupRecord;
-import org.apache.poi.hssf.record.ExtendedFormatRecord;
-import org.apache.poi.hssf.record.FilePassRecord;
-import org.apache.poi.hssf.record.FontRecord;
-import org.apache.poi.hssf.record.FormatRecord;
-import org.apache.poi.hssf.record.LabelRecord;
-import org.apache.poi.hssf.record.LabelSSTRecord;
-import org.apache.poi.hssf.record.NameRecord;
-import org.apache.poi.hssf.record.RecalcIdRecord;
-import org.apache.poi.hssf.record.Record;
-import org.apache.poi.hssf.record.RecordFactory;
-import org.apache.poi.hssf.record.SSTRecord;
-import org.apache.poi.hssf.record.UnknownRecord;
+import org.apache.poi.hssf.record.*;
 import org.apache.poi.hssf.record.aggregates.RecordAggregate.RecordVisitor;
 import org.apache.poi.hssf.record.common.UnicodeString;
 import org.apache.poi.hssf.record.crypto.Biff8DecryptingStream;
@@ -1762,6 +1747,28 @@ public final class HSSFWorkbook extends POIDocument implements Workbook {
         return newName;
     }
 
+    @Override
+    public Boolean usesR1C1CellReferences() {
+        for (HSSFSheet hssfSheet : _sheets) {
+            InternalSheet internalSheet = hssfSheet.getSheet();
+
+            List<RecordBase> records = internalSheet.getRecords();
+
+            RefModeRecord refModeRecord = null;
+            for (RecordBase record : records) {
+                if (record instanceof RefModeRecord) refModeRecord = (RefModeRecord)record;
+            }
+            if (refModeRecord == null) {
+                return null;
+            } else if (refModeRecord.getMode() == RefModeRecord.USE_R1C1_MODE) {
+                return Boolean.TRUE;
+            } else if (refModeRecord.getMode() == RefModeRecord.USE_A1_MODE) {
+                return Boolean.FALSE;
+            }
+        }
+        return null;
+    }
+
     int getNameIndex(String name) {
 
         for (int k = 0; k < names.size(); k++) {
index e76637f5fddf20b3c450267c902c4828a7f61492..041d7a785f1ccf89161cf1b1b30ff953152d731b 100644 (file)
@@ -631,4 +631,11 @@ public interface Workbook extends Closeable, Iterable<Sheet> {
      * @return an evaluation workbook
      */
     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.
+     * @since POI 5.2.1
+     */
+    Boolean usesR1C1CellReferences();
 }