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?
JExcelAPI x Apache POI
28 Respostas
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
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
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
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.
É só usar sheet.getRows() e sheet.getColumns(). 
Fala ae @yigong2033 e onde fica esses métodos no Apache POI. No JXL eu já encontrei.
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
@lele_vader como eu faria isso? teria algum exemplo pra postar?
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.
Sem problemas já dá pra ter uma noção obrigado.
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?
Você pode tentar usar o .toString
Não tem nenhum método com nome getStringCellValue ?
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;
}
é 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.
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
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
Você sabe se o campo de data é do tipo date no excel ?
é do tipo data sim… ex.: 03/01/2013
E o que acontece quando você dá um getDateCellValue ?
fala que o valor é incorreto pegar um valor numeric de um acélula text
Vai nas propriedades da célula e vê se é um tipo data ou texto.
É data
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.
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
Tem aquele outro comando Xms eu acho que você pode alterar.
Esses problemas de jvm com memória são complicados mesmo.
eu coloquei isso nas classes… coloquei no Run Configurations… e nada… cara devia ter feito Educação Física, kkkk
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.
Eu vi la… só que não da… mas valeu pelas dicas e informações vader…