dmui        2003/03/16 20:47:58

  Modified:    src/java/org/apache/poi/hssf/model FormulaParser.java
               src/testcases/org/apache/poi/hssf/model
                        TestFormulaParser.java
               src/testcases/org/apache/poi/hssf/usermodel
                        TestFormulas.java
  Added:       src/testcases/org/apache/poi/hssf/data sumifformula.xls
  Log:
  Support for the SUMIF formula and non-alpha string literals
  
   Also fixes Bug #17582
   Test case for non-alpha string literals provided by [EMAIL PROTECTED] (Jens Riis)
   Thanks Avik for your FormulaParser help
  
  Revision  Changes    Path
  1.9       +10 -4     
jakarta-poi/src/java/org/apache/poi/hssf/model/FormulaParser.java
  
  Index: FormulaParser.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/model/FormulaParser.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- FormulaParser.java        15 Mar 2003 01:57:41 -0000      1.8
  +++ FormulaParser.java        17 Mar 2003 04:47:58 -0000      1.9
  @@ -214,6 +214,14 @@
           return  (c ==' ' || c== TAB);
       }
       
  +    /**
  +     * Determines special characters;primarily in use for definition of string 
literals
  +     * @param c
  +     * @return boolean
  +     */
  +    private boolean IsSpecialChar(char c) {
  +     return (c == '>' || c== '<' || c== '=' || c=='&' || c=='[' || c==']');
  +    }
       
   
       /** Skip Over Leading White Space */
  @@ -253,10 +261,8 @@
          converting to uppercase; used for literals */
       private String GetNameAsIs() {
           StringBuffer Token = new StringBuffer();
  -        if (!IsAlpha(look)) {
  -            Expected("Name");
  -        }
  -        while (IsAlNum(look) || IsWhite(look)) {
  +             
  +             while (IsAlNum(look) || IsWhite(look) || IsSpecialChar(look)) {
               Token = Token.append(look);
               GetChar();
           }
  
  
  
  1.1                  
jakarta-poi/src/testcases/org/apache/poi/hssf/data/sumifformula.xls
  
        <<Binary file>>
  
  
  1.4       +30 -1     
jakarta-poi/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java
  
  Index: TestFormulaParser.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TestFormulaParser.java    15 Mar 2003 01:57:41 -0000      1.3
  +++ TestFormulaParser.java    17 Mar 2003 04:47:58 -0000      1.4
  @@ -217,10 +217,39 @@
                FuncVarPtg funcPtg = (FuncVarPtg)asts[6];
                assertEquals("Arguments", 2, funcPtg.getNumberOfOperands());
                
  -                                             
                
  +     }
  +
  +     public void testSumIf() {
  +             String function ="SUMIF(A1:A5,\">4000\",B1:B5)";
  +             FormulaParser fp = new FormulaParser(function, null);
  +             fp.parse();
  +             Ptg[] asts = fp.getRPNPtg();
  +             assertEquals("4 Ptgs expected", 4, asts.length);
                
        }
  +      
  +     /**
  +      * Bug Reported by [EMAIL PROTECTED] (Jens Riis)
  +      * Refers to Bug <a 
href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=17582";>#17582</a>
  +      *
  +      */
  +     public void testNonAlphaFormula(){
  +             String currencyCell = "F3";
  +             String function="\"TOTAL[\"&"+currencyCell+"&\"]\"";
  +
  +             FormulaParser fp = new FormulaParser(function, null);
  +             fp.parse();
  +             Ptg[] asts = fp.getRPNPtg();
  +             assertEquals("5 ptgs expected", 5, asts.length);
  +             assertTrue ("Ptg[0] is a string", (asts[0] instanceof StringPtg));
  +             StringPtg firstString = (StringPtg)asts[0];             
  +             
  +             assertEquals("TOTAL[", firstString.getValue());
  +             //the PTG order isn't 100% correct but it still works - dmui
  +             
  +                                     
  +     }        
            
        public static void main(String [] args) {
           System.out.println("Testing 
org.apache.poi.hssf.record.formula.FormulaParser");
  
  
  
  1.28      +57 -13    
jakarta-poi/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java
  
  Index: TestFormulas.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- TestFormulas.java 15 Mar 2003 01:57:41 -0000      1.27
  +++ TestFormulas.java 17 Mar 2003 04:47:58 -0000      1.28
  @@ -55,23 +55,15 @@
   
   package org.apache.poi.hssf.usermodel;
   
  -import junit.framework.TestCase;
  -
  -import org.apache.poi.poifs.filesystem.POIFSFileSystem;
  -import org.apache.poi.hssf.model.Sheet;
  -import org.apache.poi.hssf.record.Record;
  -import org.apache.poi.hssf.record.BOFRecord;
  -import org.apache.poi.hssf.record.EOFRecord;
  -import org.apache.poi.hssf.util.CellReference;
  -
   import java.io.File;
   import java.io.FileInputStream;
   import java.io.FileOutputStream;
  -
  -import java.util.List;
  -import java.util.Iterator;
  +import java.io.IOException;
   import java.util.Date;
  -import java.util.GregorianCalendar;
  +
  +import junit.framework.TestCase;
  +
  +import org.apache.poi.hssf.util.CellReference;
   
   /**
    * @author Andrew C. Oliver (acoliver at apache dot org)
  @@ -985,6 +977,58 @@
                assertTrue("length of nestedIf file is zero", (nestedIf.length()>0));  
           
       }
   
  +     public void testSumIf()
  +             throws java.io.IOException
  +     {
  +             String readFilename = System.getProperty("HSSF.testdata.path");        
 
  +             String function ="SUMIF(A1:A5,\">4000\",B1:B5)";
  +             
  +             File inFile = new File(readFilename+"/sumifformula.xls");
  +             FileInputStream in = new FileInputStream(inFile);
  +             HSSFWorkbook wb = new HSSFWorkbook(in);
  +             in.close();
  +             
  +             HSSFSheet        s      = wb.getSheetAt(0);
  +             HSSFRow          r      = s.getRow(0);
  +             HSSFCell         c      = r.getCell((short)2);
  +             assertEquals(function, c.getCellFormula());
  +             
  +
  +             File file = File.createTempFile("testSumIfFormula",".xls");
  +             FileOutputStream out    = new FileOutputStream(file);
  +             wb     = new HSSFWorkbook();
  +             s      = wb.createSheet();
  +             
  +             r = s.createRow((short)0);
  +             c=r.createCell((short)0); c.setCellValue((double)1000);
  +             c=r.createCell((short)1); c.setCellValue((double)1);
  +             
  +             
  +             r = s.createRow((short)1);
  +             c=r.createCell((short)0); c.setCellValue((double)2000);
  +             c=r.createCell((short)1); c.setCellValue((double)2);
  +
  +             r = s.createRow((short)2);
  +             c=r.createCell((short)0); c.setCellValue((double)3000);
  +             c=r.createCell((short)1); c.setCellValue((double)3);
  +
  +             r = s.createRow((short)3);
  +             c=r.createCell((short)0); c.setCellValue((double)4000);
  +             c=r.createCell((short)1); c.setCellValue((double)4);
  +
  +             r = s.createRow((short)4);
  +             c=r.createCell((short)0); c.setCellValue((double)5000);
  +             c=r.createCell((short)1); c.setCellValue((double)5);
  +             
  +             r = s.getRow(0);
  +             c=r.createCell((short)2); c.setCellFormula(function);
  +                     
  +             wb.write(out);                          
  +             out.close();
  +             
  +             assertTrue("sumif file doesnt exists", (file.exists()));
  +             assertTrue("sumif == 0 bytes", file.length() > 0);
  +     }
       
       public static void main(String [] args) {
           System.out
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to