Fórmulas no Excel usando POI HSSF

Pessoal, estou com um problema…

quando eu coloco esta fórmula em uma célula assim, dá erro:

cell.setCellType(HSSFCell.CELL_TYPE_FORMULA); cell.setCellFormula("SOMASE($Planilha02.A$1:A$1064;A2;$Planilha02.C$1:C$1064)");

se eu coloco assim não dá erro, mas a fórmula aparece como uma string na planilha!

cell.setCellType(HSSFCell.CELL_TYPE_STRING); cell.setCellValue("=SOMASE($Planilha02.A$1:A$1064;A2;$Planilha02.C$1:C$1064)");

alguém sabe como fazer?

Olhando por cima a sua fórmula, ela me parece errada! Não sou um profundo conhecedor do Excel, mas… :slight_smile:

Em $Planilha02.A$1:A$1064 você está definindo um range, mas o correto acho que seria Planilha02!A$1:A$1064.

Da mesma forma o range usado no terceiro parâmetro da função. E também acredito que você deva colocar o nome da função em inglês: sumif, e não em português (mesmo o Excel não estando no idioma inglês). Mas isso do idioma é apenas um chute…

A função ficaria assim:
SUMIF(Planilha02!A$1:A$1064;A2;Planilha02!C$1:C$1064)

acho q minha fórmula estava errada mesmo… agora coloquei da forma mais simples: SUMIF(Planilha2.A4:A100;A2;Planilha2.C4:C100)
e assim tb: SUMIF(Planilha2!A4:A100;A2;Planilha2!C4:C100)

e olha o erro que deu:

HTTP Status 500 - 

--------------------------------------------------------------------------------

type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

org.apache.jasper.JasperException: String index out of range: 0
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:372)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


root cause 

java.lang.StringIndexOutOfBoundsException: String index out of range: 0
	java.lang.String.charAt(String.java:444)
	org.apache.poi.hssf.util.CellReference.<init>(CellReference.java:44)
	org.apache.poi.hssf.record.formula.ReferencePtg.<init>(ReferencePtg.java:50)
	org.apache.poi.hssf.model.FormulaParser.Ident(FormulaParser.java:291)
	org.apache.poi.hssf.model.FormulaParser.Factor(FormulaParser.java:474)
	org.apache.poi.hssf.model.FormulaParser.Term(FormulaParser.java:548)
	org.apache.poi.hssf.model.FormulaParser.Expression(FormulaParser.java:596)
	org.apache.poi.hssf.model.FormulaParser.Arguments(FormulaParser.java:443)
	org.apache.poi.hssf.model.FormulaParser.function(FormulaParser.java:315)
	org.apache.poi.hssf.model.FormulaParser.Ident(FormulaParser.java:265)
	org.apache.poi.hssf.model.FormulaParser.Factor(FormulaParser.java:474)
	org.apache.poi.hssf.model.FormulaParser.Term(FormulaParser.java:548)
	org.apache.poi.hssf.model.FormulaParser.Expression(FormulaParser.java:596)
	org.apache.poi.hssf.model.FormulaParser.parse(FormulaParser.java:700)
	org.apache.poi.hssf.usermodel.HSSFCell.setCellFormula(HSSFCell.java:678)
	Pacote.xlsEstoque.criaPlanilhaResumo(xlsEstoque.java:174)
	Pacote.xlsEstoque.cria(xlsEstoque.java:56)
	org.apache.jsp.PosicaoEstoque.PosicaoEstoque_jsp._jspService(PosicaoEstoque_jsp.java:248)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


note The full stack trace of the root cause is available in the Apache Tomcat/5.0.28 logs.

É…sei lá porque o POI não se dá muito bem quando você tenta colocar referências já “mastigadas” pra ele.

Tente isso:

StringBuffer formula = new StringBuffer();
formula.append("SUMIF('Planilha2'!");
CellReference cellRef = new CellReference(3, 0);
formula.append(cellRef.toString());
formula.append(":");
cellRef= new CellReference(99, 0);
formula.append(cellRef.toString());
formula.append(";");
cellRef= new CellReference(0, 1);
formula.append(cellRef.toString());
formula.append(";'Planilha2'!");
cellRef= new CellReference(3, 2);
formula.append(cellRef.toString());
formula.append(":");
cellRef= new CellReference(99, 2);
formula.append(cellRef.toString());
formula.append(")");
cell.setCellFormula(formula.toString());

Lembrando que para o POI, a primeira coluna é a 0 (zero), assim como a primeira linha, então a célula “A1” fica na coordenada “0,0”.

O código todo acima poderia perfeitamente ser colocado numa única linha, mas assim fica mais fácil de entender o que está fazendo. :slight_smile: