YmouseY Posted August 22, 2013 at 04:02 PM Report #522410 Posted August 22, 2013 at 04:02 PM 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
jpfelgueiras Posted August 22, 2013 at 11:55 PM Report #522434 Posted August 22, 2013 at 11:55 PM 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 🙂
Ernest Posted August 23, 2013 at 12:24 AM Report #522436 Posted August 23, 2013 at 12:24 AM 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
jpfelgueiras Posted August 23, 2013 at 01:17 AM Report #522441 Posted August 23, 2013 at 01:17 AM Ernest Duarte Acho que leste o problema ao contrario, a questão não e escrever mas excel mas sim ler.
Ernest Posted August 23, 2013 at 03:58 AM Report #522445 Posted August 23, 2013 at 03:58 AM 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
YmouseY Posted August 23, 2013 at 10:08 AM Author Report #522465 Posted August 23, 2013 at 10:08 AM 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
Ernest Posted August 23, 2013 at 01:12 PM Report #522493 Posted August 23, 2013 at 01:12 PM 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
YmouseY Posted August 26, 2013 at 12:01 PM Author Report #522669 Posted August 26, 2013 at 12:01 PM 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
Hercles Posted December 9, 2015 at 01:35 PM Report #590501 Posted December 9, 2015 at 01:35 PM E como faço pra salvar em outra linha sem apagar o que já esta escrito na planilha?
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now