Support for the SUMIF formula and non-alpha string literals

PR:
 Also fixes Bug #17582
Obtained from:
Submitted by:
 Test case for non-alpha string literals provided by ext-jens.riis@nokia.com (Jens Riis)
Reviewed by:
 Thanks Avik for your FormulaParser help


git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353028 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Danny Muid 2003-03-17 04:47:58 +00:00
parent 9dfd573ce7
commit 83b4c947da
4 changed files with 98 additions and 19 deletions

View File

@ -214,6 +214,14 @@ public class FormulaParser {
return (c ==' ' || c== TAB); 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 */ /** Skip Over Leading White Space */
@ -253,10 +261,8 @@ public class FormulaParser {
converting to uppercase; used for literals */ converting to uppercase; used for literals */
private String GetNameAsIs() { private String GetNameAsIs() {
StringBuffer Token = new StringBuffer(); StringBuffer Token = new StringBuffer();
if (!IsAlpha(look)) {
Expected("Name"); while (IsAlNum(look) || IsWhite(look) || IsSpecialChar(look)) {
}
while (IsAlNum(look) || IsWhite(look)) {
Token = Token.append(look); Token = Token.append(look);
GetChar(); GetChar();
} }

Binary file not shown.

View File

@ -217,10 +217,39 @@ public class TestFormulaParser extends TestCase {
FuncVarPtg funcPtg = (FuncVarPtg)asts[6]; FuncVarPtg funcPtg = (FuncVarPtg)asts[6];
assertEquals("Arguments", 2, funcPtg.getNumberOfOperands()); 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 xt-jens.riis@nokia.com (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) { public static void main(String [] args) {
System.out.println("Testing org.apache.poi.hssf.record.formula.FormulaParser"); System.out.println("Testing org.apache.poi.hssf.record.formula.FormulaParser");

View File

@ -55,23 +55,15 @@
package org.apache.poi.hssf.usermodel; 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.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Iterator;
import java.util.Date; 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) * @author Andrew C. Oliver (acoliver at apache dot org)
@ -985,6 +977,58 @@ extends TestCase {
assertTrue("length of nestedIf file is zero", (nestedIf.length()>0)); 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) { public static void main(String [] args) {
System.out System.out