JExcelAPI x Apache POI

28 respostas
F

Alguém ai sabe como faço para recuperar a quantidade de Linhas e Colunas no apache POI assim como se faz no jexcel api?

28 Respostas

L

Um objeto da classe Sheet tem o método sheet.getLastRowNum(), que traz o número da última linha e um objeto da classe Row tem o método getLastCellNum(), que te traz o número da última célula da linha, trazendo a quantidade de colunas.

Daí você pode fazer for’s e usar o método de Sheet getRow, para pegar a referência de uma linha específica e
o método de Row getRow, para pegar a referência a uma célula específica

L

Um objeto da classe Sheet tem o método sheet.getLastRowNum(), que traz o número da última linha e um objeto da classe Row tem o método getLastCellNum(), que te traz o número da última célula da linha, trazendo a quantidade de colunas.

Daí você pode fazer for’s e usar o método de Sheet getRow, para pegar a referência de uma linha específica e
o método de Row getRow, para pegar a referência a uma célula específica

F

Obrigado lele_vader pela resposta. no JExcelApi isso á mais facil de fazer. É só usar sheet.getRows() e sheet.getColumns(). Vou avaliar se vale a pena migrar. Pois o unico problema do jxl é que não le arquivos .xlsx

L

Só lembra de que no apache poi a implementação para ler .xlxs é diferente
Daí use a interface e implemente de acordo com o tipo.
Xls ou xlsx

Se você quer a quantidade é so somar 1 a partir desses métodos, pois a contagem começa de 0.

Y

É só usar sheet.getRows() e sheet.getColumns().

F

Fala ae @yigong2033 e onde fica esses métodos no Apache POI. No JXL eu já encontrei.

L

Só lembre-se de trabalhar com a interface, pois as classes de xls e xlsx são diferentes e se você não programar pela interface e quiser mudar depois vai ter que mudar toda a implementação

F

@lele_vader como eu faria isso? teria algum exemplo pra postar?

L
stream = new BufferedInputStream(new FileInputStream(arquivo));
			
			//Se for xls instancia HSSFWorkbook. Caso seja xlsx instancia XSSFWorkbook 
			Workbook workbook = (extensao.equalsIgnoreCase(Constantes.TIPO_XLS))?new HSSFWorkbook(stream):new XSSFWorkbook(stream);
			Sheet sheet = workbook.getSheetAt(0);
                        //Coloquei a partir de 1 porque a 1 linha e cabecalho
                        for(int count = 1; count <= sheet.getLastRowNum(); count++){
				Row row = sheet.getRow(count);
                                for(int countColuna = 0;counColuna < row.getLastCellNum();countColuna++){
                                          Cell cell = row.getCell(coluna,Row.CREATE_NULL_AS_BLANK);
                                          if(celula.getCellType()==CELL_TYPE_BLANK){
						System.out.println("Campo vazio");
				          }
				         else if(celula.getCellType()!=CELL_TYPE_NUMERIC){
                                              double valor = celula.getNumericCellValue();
				         }else{
                                           String valor = celula.getStringCellValue();
                                         }
                                }

Foi mais ou menos assim que fiz.
Se tiver uma maneira melhor, por favor alguém poste.
Desculpe pela identação ruim.

F

Sem problemas já dá pra ter uma noção obrigado.

P

Olá amigos beleza?

Cara, eu to tentando pegar o valor das células só que ta difícil… quero pegar como string só que ele le número e já coloca como numericc o valor da célula…
tem alguma maneira de converter ou do XSSF ler a celula sem ver o tipo?

L

Você pode tentar usar o .toString
Não tem nenhum método com nome getStringCellValue ?

P

Eu usei o (String.valueOf(cell.getNumericCellValue()));

tem sim… só que da erro… ele le a célula e já decide o valor… engraçado que para o mesmo campo ele as vezes le como string e as vezes como numeric…

tem alguma maneira de ele não ler o tipo e só pegar o valor como no JXCEL (getContent) ?

to apanhando muito… até para fazer o for… para ele ler as linhas e colunas…

trecho do código:

private Telecom carregarLinha(int nuLinhaAtual) {
		ValoresPlanilhaEnum planilhaEnum = null;
		Telecom linhaTelecom = new Telecom();
		XSSFRow celulas = null;
		celulas = sheet.getRow(nuLinhaAtual);

		for (int nuCelulaAtual = 0; nuCelulaAtual < celulas.getLastCellNum(); nuCelulaAtual++) {
			XSSFCell cell = celulas.getCell(nuLinhaAtual);
			TelecomCelulasEnum celulaTelecom = TelecomCelulasEnum
					.obterCelulaTelecom(nuCelulaAtual);

			switch (celulaTelecom) {
			case SIMCARD:
				linhaTelecom.setSimcard(String.valueOf(cell.getNumericCellValue()));
				break;
			case LINHA:
				linhaTelecom.setLinha(String.valueOf(cell.getNumericCellValue()));
				break;
			case APN_UTILIZADA:
				planilhaEnum = ValoresPlanilhaEnum.obtervALORPorDesc(String.valueOf(cell.getNumericCellValue()));
				linhaTelecom.setApnUtilizada(planilhaEnum.getCodigo());
				break;
			case CONTA:
				linhaTelecom.setConta(String.valueOf(cell.getNumericCellValue()));
				break;
			case OPERADORA:
				planilhaEnum = ValoresPlanilhaEnum.obtervALORPorDesc(String.valueOf(cell.getNumericCellValue()));
				linhaTelecom.setOperadora(planilhaEnum.getCodigo());
				break;
			case PLANO:
				linhaTelecom.setPlano(String.valueOf(cell.getNumericCellValue()));
				break;
			case STATUS_SIM_CARD:
				planilhaEnum = ValoresPlanilhaEnum.obtervALORPorDesc(String.valueOf(cell.getNumericCellValue()));
				linhaTelecom.setStatusSIMCard(planilhaEnum.getCodigo());
				break;
			case DATA_ATIVACAO:
				
				if (DateUtil.isCellDateFormatted(cell)) {
					Date dataCell = (cell.getDateCellValue());
					linhaTelecom.setDtAtivacao(dataCell);
				} else {
					linhaTelecom.setDtAtivacao(null);
				}
				break;
			case FONTE:
				planilhaEnum = ValoresPlanilhaEnum.obtervALORPorDesc(String.valueOf(cell.getNumericCellValue()));
				linhaTelecom.setFonte(planilhaEnum.getCodigo());
				break;
			case STATUS_LINHA:
				planilhaEnum = ValoresPlanilhaEnum.obtervALORPorDesc(String.valueOf(cell.getNumericCellValue()));
				linhaTelecom.setStatusLinha(planilhaEnum.getCodigo());
				break;
			case IMSI:
				linhaTelecom.setImsi(String.valueOf(cell.getNumericCellValue()));
				break;
			case CONSUMO_DADOS:
				linhaTelecom.setConsumoDados(String.valueOf(cell.getNumericCellValue()));
				break;
			}
		}

		return linhaTelecom;
	}
L

é que o tipo do campo é numerico no excel.
Daí as vezes ele lê como texto, pois no excel é texto.
Quando lê o numérico, é porque é numérico no excel.
Tenta usar cell.toString() e vê o que acontece.

P

Acho que funcionou… só que agora to apanhando na data…

vc pode me ajudar?

e no for… ele só ta pegando a primeira célula… não está pegando os registros das outras colunas… só ta lendo a A1, e não até a H

L

No seu método carregarLinha você só faz um for.
E você pega somente uma coluna.
Tem que fazer 2 for. Um para as linhas e outro para as colunas

L

Você sabe se o campo de data é do tipo date no excel ?

P

é do tipo data sim… ex.: 03/01/2013

L

E o que acontece quando você dá um getDateCellValue ?

P

fala que o valor é incorreto pegar um valor numeric de um acélula text

L

Vai nas propriedades da célula e vê se é um tipo data ou texto.

P

É data

L

Dá uma olhada no valor que você está pegando antes de chamar o método;
Se é a coluna correta.
Esquisito isso, já usei uma vez e ele lia como date e não ocorria esse método.

P

cara não me xinga ok?

mas acho que é por causa do for… ele ta pegando o mesmo valor ainda… me desculpa

vou arrumar essas coisas depois volto, rsrs…

muito obrigado mesmo… última coisa, vc sabe algo sobre a memória da VM? eu já alterei para pegar valores grandes (planiklha de 30MB) mas acho que não deu certo…

java -Xmx512m myapp.java
Exception in thread “http-bio-8080-exec-7” java.lang.OutOfMemoryError: Java heap space

L

Tem aquele outro comando Xms eu acho que você pode alterar.
Esses problemas de jvm com memória são complicados mesmo.

P

eu coloquei isso nas classes… coloquei no Run Configurations… e nada… cara devia ter feito Educação Física, kkkk

L

No outro tópico que você criou, um cara postou um link para o stack overflowm, onde talvez tenha uma classe que resolva o seu problema.

P

Eu vi la… só que não da… mas valeu pelas dicas e informações vader…

Criado 25 de junho de 2012
Ultima resposta 3 de jan. de 2013
Respostas 28
Participantes 4