]> source.dussan.org Git - poi.git/commitdiff
Back port fixes from the ooxml branch for CellReference column number<->letter stuff
authorNick Burch <nick@apache.org>
Thu, 10 Jul 2008 20:30:46 +0000 (20:30 +0000)
committerNick Burch <nick@apache.org>
Thu, 10 Jul 2008 20:30:46 +0000 (20:30 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@675717 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/util/CellReference.java
src/testcases/org/apache/poi/hssf/util/TestCellReference.java

index bde5407d6344ab7d6aa5115a6b8c3f6cd87bcdd5..efbc37eff97f37fdfe1d563c40770659876a82bd 100644 (file)
@@ -92,6 +92,13 @@ public final class CellReference {
         _rowIndex = Integer.parseInt(rowRef)-1; // -1 to convert 1-based to zero-based
     }
 
+    public CellReference(int pRow, int pCol) {
+       this(pRow, pCol, false, false);
+    }
+    public CellReference(int pRow, short pCol) {
+       this(pRow, (int)pCol, false, false);
+    }
+
     public CellReference(int pRow, int pCol, boolean pAbsRow, boolean pAbsCol) {
         this(null, pRow, pCol, pAbsRow, pAbsCol);
     }
@@ -128,20 +135,19 @@ public final class CellReference {
      * ALPHA-26 number format to 0-based base 10.
      */
     private int convertColStringToNum(String ref) {
-        int lastIx = ref.length()-1;
-        int retval=0;
-        int pos = 0;
-
-        for (int k = lastIx; k > -1; k--) {
-            char thechar = ref.charAt(k);
-            if ( pos == 0) {
-                retval += (Character.getNumericValue(thechar)-9);
-            } else {
-                retval += (Character.getNumericValue(thechar)-9) * (pos * 26);
-            }
-            pos++;
-        }
-        return retval-1;
+               int lastIx = ref.length()-1;
+               int retval=0;
+               int pos = 0;
+               
+               for (int k = lastIx; k > -1; k--) {
+                       char thechar = ref.charAt(k);
+                       // Character.getNumericValue() returns the values
+                       //  10-35 for the letter A-Z
+                       int shift = (int)Math.pow(26, pos);
+                       retval += (Character.getNumericValue(thechar)-9) * shift;
+                       pos++;
+               }
+               return retval-1;
     }
 
     /**
@@ -349,19 +355,24 @@ public final class CellReference {
      * eg column #3 -> D
      */
     protected static String convertNumToColString(int col) {
-        String retval = null;
-        int mod = col % 26;
-        int div = col / 26;
-        char small=(char)(mod + 65);
-        char big = (char)(div + 64);
-
-        if (div == 0) {
-            retval = ""+small;
-        } else {
-            retval = ""+big+""+small;
-        }
-
-        return retval;
+               // Excel counts column A as the 1st column, we
+               //  treat it as the 0th one
+               int excelColNum = col + 1;
+               
+               String colRef = "";
+               int colRemain = excelColNum;
+               
+               while(colRemain > 0) {
+                       int thisPart = colRemain % 26;
+                       if(thisPart == 0) { thisPart = 26; }
+                       colRemain = (colRemain - thisPart) / 26;
+                       
+                       // The letter A is at 65
+                       char colChar = (char)(thisPart+64);
+                       colRef = colChar + colRef;
+               }
+               
+               return colRef;
     }
 
     /**
@@ -392,6 +403,22 @@ public final class CellReference {
         return sb.toString();
     }
 
+       /**
+        * Returns the three parts of the cell reference, the
+        *  Sheet name (or null if none supplied), the 1 based
+        *  row number, and the A based column letter.
+        * This will not include any markers for absolute
+        *  references, so use {@link #formatAsString()}
+        *  to properly turn references into strings. 
+        */
+       public String[] getCellRefParts() {
+               return new String[] {
+                               _sheetName,
+                               Integer.toString(_rowIndex+1),
+                               convertNumToColString(_colIndex)
+               };
+       }
+
     /**
      * Appends cell reference with '$' markers for absolute values as required.
      * Sheet name is not included.
index 8ec8f994674576a37ee780245c3da12322059220..8e30a2989a9b8f908fe87807f617746c20a57a55 100644 (file)
@@ -106,4 +106,147 @@ public final class TestCellReference extends TestCase {
         int actualResult = CellReference.classifyCellReference(ref);
         assertEquals(expectedResult, actualResult);
     }
-}
+
+
+       public void testGetCellRefParts() {
+               CellReference cellReference;
+               String[] parts;
+               
+               String cellRef = "A1";
+               cellReference = new CellReference(cellRef);
+               assertEquals(0, cellReference.getCol());
+               parts = cellReference.getCellRefParts();
+               assertNotNull(parts);
+               assertEquals(null, parts[0]);
+               assertEquals("1", parts[1]);
+               assertEquals("A", parts[2]);
+
+               cellRef = "AA1";
+               cellReference = new CellReference(cellRef);
+               assertEquals(26, cellReference.getCol());
+               parts = cellReference.getCellRefParts();
+               assertNotNull(parts);
+               assertEquals(null, parts[0]);
+               assertEquals("1", parts[1]);
+               assertEquals("AA", parts[2]);
+
+               cellRef = "AA100";
+               cellReference = new CellReference(cellRef);
+               assertEquals(26, cellReference.getCol());
+               parts = cellReference.getCellRefParts();
+               assertNotNull(parts);
+               assertEquals(null, parts[0]);
+               assertEquals("100", parts[1]);
+               assertEquals("AA", parts[2]);
+
+               cellRef = "AAA300";
+               cellReference = new CellReference(cellRef);
+               assertEquals(702, cellReference.getCol());
+               parts = cellReference.getCellRefParts();
+               assertNotNull(parts);
+               assertEquals(null, parts[0]);
+               assertEquals("300", parts[1]);
+               assertEquals("AAA", parts[2]);
+
+               cellRef = "ZZ100521";
+               cellReference = new CellReference(cellRef);
+               assertEquals(26*26+25, cellReference.getCol());
+               parts = cellReference.getCellRefParts();
+               assertNotNull(parts);
+               assertEquals(null, parts[0]);
+               assertEquals("100521", parts[1]);
+               assertEquals("ZZ", parts[2]);
+
+               cellRef = "ZYX987";
+               cellReference = new CellReference(cellRef);
+               assertEquals(26*26*26 + 25*26 + 24 - 1, cellReference.getCol());
+               parts = cellReference.getCellRefParts();
+               assertNotNull(parts);
+               assertEquals(null, parts[0]);
+               assertEquals("987", parts[1]);
+               assertEquals("ZYX", parts[2]);
+
+               cellRef = "AABC10065";
+               cellReference = new CellReference(cellRef);
+               parts = cellReference.getCellRefParts();
+               assertNotNull(parts);
+               assertEquals(null, parts[0]);
+               assertEquals("10065", parts[1]);
+               assertEquals("AABC", parts[2]);
+       }
+       
+       public void testGetColNumFromRef() {
+               String cellRef = "A1";
+               CellReference cellReference = new CellReference(cellRef);
+               assertEquals(0, cellReference.getCol());
+
+               cellRef = "AA1";
+               cellReference = new CellReference(cellRef);
+               assertEquals(26, cellReference.getCol());
+
+               cellRef = "AB1";
+               cellReference = new CellReference(cellRef);
+               assertEquals(27, cellReference.getCol());
+
+               cellRef = "BA1";
+               cellReference = new CellReference(cellRef);
+               assertEquals(26+26, cellReference.getCol());
+               
+               cellRef = "CA1";
+               cellReference = new CellReference(cellRef);
+               assertEquals(26+26+26, cellReference.getCol());
+               
+               cellRef = "ZA1";
+               cellReference = new CellReference(cellRef);
+               assertEquals(26*26, cellReference.getCol());
+               
+               cellRef = "ZZ1";
+               cellReference = new CellReference(cellRef);
+               assertEquals(26*26+25, cellReference.getCol());
+               
+               cellRef = "AAA1";
+               cellReference = new CellReference(cellRef);
+               assertEquals(26*26+26, cellReference.getCol());
+               
+               
+               cellRef = "A1100";
+               cellReference = new CellReference(cellRef);
+               assertEquals(0, cellReference.getCol());
+
+               cellRef = "BC15";
+               cellReference = new CellReference(cellRef);
+               assertEquals(54, cellReference.getCol());
+       }
+       
+       public void testGetRowNumFromRef() {
+               String cellRef = "A1";
+               CellReference cellReference = new CellReference(cellRef);
+               assertEquals(0, cellReference.getRow());
+
+               cellRef = "A12";
+               cellReference = new CellReference(cellRef);
+               assertEquals(11, cellReference.getRow());
+
+               cellRef = "AS121";
+               cellReference = new CellReference(cellRef);
+               assertEquals(120, cellReference.getRow());
+       }
+       
+       public void testConvertNumToColString() {
+               short col = 702;
+               String collRef = new CellReference(0, col).formatAsString();
+               assertEquals("AAA1", collRef);
+
+               short col2 = 0;
+               String collRef2 = new CellReference(0, col2).formatAsString();
+               assertEquals("A1", collRef2);
+               
+               short col3 = 27;
+               String collRef3 = new CellReference(0, col3).formatAsString();
+               assertEquals("AB1", collRef3);
+               
+               short col4 = 2080;
+               String collRef4 = new CellReference(0, col4).formatAsString();
+               assertEquals("CBA1", collRef4);
+       }
+}
\ No newline at end of file