Jump to content
YmouseY

Utilização do Excel em Java

Recommended Posts

YmouseY

Boa tarde, estou a iniciar na programação, e estou a criar um programa que dada uma determinada Folha de calculo do Excel. Introduzindo uma linha, à escolha do utilizador, o que o programa faz é apresentar toda a restante informação contida nessa linha (as restantes colunas). Tudo aquilo que não usa formulas eu consigo fazer aparecer no meu JAva Eclipse, mas todos os outros campos que contenham formulas, o output apresentado é a formula do Excel. Eu como quero que apareça o resultado da formula e não, a formula em si, o que tenho que fazer para conseguir isso? Alguém me pode ajudar, por favor? Não sei se é importante referir que usei a biblioteca APACHE-POI-3.9 para conseguir mexer nas celulas do Excel.

Desde já obrigado.

Cumprimentos

Edited by Rui Carlos
Título editado (ver regras relativas à "urgência").

Share this post


Link to post
Share on other sites
jpfelgueiras

Em vez do APACE-POI podes usar o jxl

usando o jxl Cell.getContents() e NumberCell.getValue() retornam o valor.

usando FormulaCell.getFormula() retorna a formula.

no caso de ser obrigatório o uso do POI vais ter de calcular a formula ( o que e bastante chato se não tiveres ideia de que tipo de formula te vai aparecer)

espero ter ajudado :)

Share this post


Link to post
Share on other sites
Ernest

Bom dia,

Não é por meter no título "ajuda urgente" que a resposta vai aparecer mais rapidamente...

Etapa -1 : JDK 1.7_25 (o mais recente possível) e o Eclipse Kepler

Etapa 0 : Eu utilizo LibreOffice e Apache OpenOffice são gratuitos e Open Source: https://www.libreoffice.org/

Etapa 1 : Apache POI - the Java API for Microsoft Documents : http://poi.apache.org/

Etapa 2 : Apache POI - Download : poi-bin-3.9-20121203.zip (ou equivalente)

Etapa 3 : criar um directory lib/ no projeto Eclipse Kepler e meter dentro o ficheiro poi-3.9-20121203.jar (ou equivalente)

Etapa 4 : fazer um click direito no projeto Eclipse Kepler e ir no Java Build Path / Libraries fazer Add JARs... do ficheiro JAR visto na etapa 3

Etapa 5 : criar uma classe Java : TestPOI_Formula.java

Meter este Exemplo no ficheiro TestPOI_Formula.java :

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class TestPOI_Formula {

 public static void main( String[] args) {

   HSSFWorkbook wb = new HSSFWorkbook();
   HSSFSheet sheet = wb.createSheet("minha  Folha XLS");
   HSSFRow row = sheet.createRow(0);
   HSSFCell cell = null;
   cell = row.createCell((short) 0);
   cell.setCellValue(10);
   cell = row.createCell((short) 1);
   cell.setCellValue(20);
   cell = row.createCell((short) 2);
   cell.setCellValue(30);
   cell = row.createCell((short) 3);
   cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
   cell.setCellFormula("SUM(A1:C1)");
   FileOutputStream fileOut;
   try {
  fileOut = new FileOutputStream("meuficheiro.xls");
  wb.write(fileOut);
  fileOut.close();
   } catch (FileNotFoundException e) {
  e.printStackTrace();
   } catch (IOException e) {
  e.printStackTrace();
   }
 }
}

Etapa 6 : click direito no ficheiro e depois : Run as -> Java Application

Etapa 7 : fazer um F5 (refresh) e o ficheiro vai aparecer no projeto Eclipse com a valor da formula

Etapa 8 : verifique abrindo o ficheiro com o LibreOffice Calc que 10 + 20 + 30 = 60

Existem muitas outras soluções para trabalhar com o XLS com JAVA :

Java Excel API - A Java API to read, write, and modify Excel spreadsheets

http://jexcelapi.sourceforge.net/

Mas o Apache POI é muito potente

Cordialmente

Ernest Duarte

Share this post


Link to post
Share on other sites
jpfelgueiras

Ernest Duarte

Acho que leste o problema ao contrario, a questão não e escrever mas excel mas sim ler.

Share this post


Link to post
Share on other sites
Ernest

Bom dia,

Para ler um documento, use a classe POIFSFileSystem. Um dos construtores desta classe espera em parâmetro um objeto do tipo InputStream que envolve um fluxo para ler o documento.

A classe HSSFSheet fornece o método rowIterator() que retorna um tipo de objeto iterator que permite que você navegue as linhas da folha.

Para obter um dado, é melhor ter certeza do tipo de dados associado à célula usando o método getCellType ().

O getNumericCellValue() e getRichStringCellValue() métodos de classe HSSFCell para obter o valor da célula de acordo com seu tipo.

O setCellType () método HSSFCell classe permite que você especifique o tipo de conteúdo da célula (CELL_TYPE_BLANK, CELL_TYPE_BOOLEAN, CELL_TYPE_ERROR, CELL_TYPE_FORMULA, CELL_TYPE_NUMERIC, CELL_TYPE_STRING)

Vários sobrecargas do método setValue () da classe HSSFCell pode fornecer o valor da célula.

GET é para ler e SET é para escrever ...

Cordialmente

Ernest Duarte

Share this post


Link to post
Share on other sites
YmouseY

Bom dia, desde já quero agradecer as respostas rápidas.

Ernest coloquei o titulo dessa forma porque realmente tenho urgência em obter respostas e resultados.. Se isso lhe irritou de alguma forma, peço desculpa. Quanto ao tuturial que apresentou, eu tenho o programa e já tenho a biblioteca importada e já consigo ler dados, e escrever (coisa que de momento não me interessa). O problema real que tenho é todas as células que não contenham formulas eu consigo fazer o output sem qualquer problema (estou a usar o HSSFCell nColuna = linha.getCell(i)), mas todas as celulas que contenham formulas o output apresentado é a formula em si, deixo um exemplo que aparece:

("=CONCATENAR(SE(AO4<>"Sim";"";CONCATENAR($AO$2;" - "));SE(AP4<>"Sim";"";CONCATENAR($AP$2;" - "));SE(AM4<>"Sim";"";CONCATENAR($AM$2;" - "));SE(AF4<>"Não";"";)

Mas o que eu pretendo no meu output é o resultado da formula e não a formula em si.

jpfelgueiras, vou importa essa biblioteca e vou tentar com esses metodos.

Mais uma vez, obrigado pelas respostas.

Cumprimentos

Share this post


Link to post
Share on other sites
Ernest

Bom dia,

Você esperimentou com o HSSFFormulaEvaluator ?

HSSFWorkbook wb = new HSSFWorkbook();

HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);

...

fe.clearAllCachedResultValues();

...

HSSFCell cell ...

...

CellValue cv = fe.evaluate(cell);

...

cv.getNumberValue()

...

fe.evaluate(cell).getStringValue();

Cordialmente

Ernest Duarte

Share this post


Link to post
Share on other sites
YmouseY

Boas, já consegui resolver o problema. Tive que criar uma linha de código para reconhecer o tipo de celula, se String ou inteiro. Depois de feito isso, se fosse string bastou usar o codigo "getStringCellValue()"

Caso fosse inteiro, usar este codigo "nColuna.getNumericCellValue()"

Desta forma, o meu problema está resolvido, agradeço novamente a quem respondeu e tentou ajudar.

Obrigado

Cumprimentos

Share this post


Link to post
Share on other sites
Hercles

E como faço pra salvar em outra linha sem apagar o que já esta escrito na planilha?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.