Eu tenho um arquivo excel com esse conteúdo:
A1: SomeString
A2: 2
Todos os campos são definidos para o formato String.
Quando leio o arquivo em java usando o POI, ele informa que A2 está no formato de célula numérica.
- O problema é que o valor em A2 pode ser 2 ou 2,0 (e eu quero ser capaz de distingui-los), então não posso usar apenas
.toString()
.
O que posso fazer para ler o valor como string?
java
excel
apache-poi
joycollector
fonte
fonte
Eu não acho que tivemos essa aula de volta quando você fez a pergunta, mas hoje existe uma resposta fácil.
O que você deseja fazer é usar a classe DataFormatter . Você passa essa célula para uma célula e é melhor retornar uma string contendo o que o Excel mostraria para essa célula. Se você passar uma célula de string, você receberá a string de volta. Se você passar uma célula numérica com as regras de formatação aplicadas, ele formatará o número com base nelas e retornará a string.
Para o seu caso, eu suponho que as células numéricas tenham uma regra de formatação inteira aplicada a elas. Se você solicitar ao DataFormatter para formatar essas células, ele retornará uma sequência com a sequência inteira.
Além disso, observe que muitas pessoas sugerem fazer isso
cell.setCellType(Cell.CELL_TYPE_STRING)
, mas os JavaDocs do Apache POI afirmam claramente que você não deve fazer isso ! Fazer asetCellType
chamada perderá a formatação, pois os javadocs explicam que a única maneira de converter para uma String com a formatação restante é usar a classe DataFormatter .fonte
When passed a null or blank cell, this method will return an empty String (""). Formulas in formula type cells will not be evaluated.
O código abaixo funcionou para mim para qualquer tipo de célula.
fonte
getCreationHelper().createFormulaEvaluator()
método. Dessa forma, seu código não será associado à classe HSSFFormulaEvaluator.FormulaEvaluator
simplesmente ser removido desta solução? Isso serve a um propósito?Eu recomendaria a seguinte abordagem ao modificar o tipo de célula é indesejável:
NumberToTextConverter pode converter corretamente o valor duplo em um texto usando as regras do Excel sem perda de precisão.
fonte
Como já mencionado nos JavaDocs do Poi ( https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29 ), não use:
mas use:
Mais exemplos em http://massapi.com/class/da/DataFormatter.html
fonte
Sim, isso funciona perfeitamente
recomendado:
velho:
mesmo se você tiver um problema ao recuperar um valor da
cell
fórmula, ainda assim isso funciona.fonte
Experimentar:
Deve formatar o número corretamente.
fonte
2
e2.0
. Sua solução não faria isso. (Mas ainda assim, bem-vindo ao estouro de pilha!)Enquanto a célula estiver no formato de texto antes de o usuário digitar o número, o POI permitirá que você obtenha o valor como uma sequência. Uma chave é que, se houver um pequeno triângulo verde no canto superior esquerdo da célula formatado como Texto, você poderá recuperar seu valor como uma string (o triângulo verde aparece sempre que algo que parece ser um número for coagido em um formato de texto). Se você tiver células formatadas em texto que contenham números, mas o POI não permitirá que você busque esses valores como sequências, existem algumas coisas que você pode fazer com os dados da planilha para permitir que:
Uma última coisa que você pode fazer é que, se você estiver usando o POI para obter dados de uma planilha do Excel 2007, poderá usar o método 'getRawValue ()' da classe Cell. Isso não se importa com o formato. Ele simplesmente retornará uma string com os dados brutos.
fonte
Quando lemos o valor da célula numérica do MS Excel usando a biblioteca Apache POI, ele é lido como numérico. Mas, em algum momento, queremos que ele seja lido como uma string (por exemplo, números de telefone etc.). Foi assim que eu fiz:
Insira uma nova coluna com a primeira célula = CONCATENATE ("!", D2). Presumo que D2 seja o ID da célula da sua coluna de número de telefone. Arraste a nova célula até o fim.
Agora, se você ler a célula usando o POI, ela lerá a fórmula em vez do valor calculado. Agora faça o seguinte:
Adicione outra coluna
Selecione a coluna completa criada na etapa 1. e escolha Editar-> COPIAR
Vá para a célula superior da coluna criada na etapa 3. e selecione Editar-> Colar Especial
Na janela aberta, selecione o botão de opção "Valores"
Selecione "OK"
Agora leia usando a API POI ... depois de ler em Java ... basta remover o primeiro caractere, ou seja, "!"
fonte
Eu também tive um problema semelhante em um conjunto de dados de milhares de números e acho que encontrei uma maneira simples de resolver. Eu precisava inserir o apóstrofo antes de um número para que uma importação de banco de dados separada sempre os visse como texto. Antes disso, o número 8 seria importado como 8.0.
Solução:
Hey Presto todos os números, mas armazenados como texto.
fonte
getStringCellValue retornará NumberFormatException se o tipo de célula for numérico. Se você não deseja alterar o tipo de célula para string, você pode fazer isso.
fonte
Muitas dessas respostas referenciam a documentação e as classes antigas de POI. No POI 3.16 mais recente, a célula com os tipos int foi descontinuada
Em vez disso, o CellType enum pode ser usado.
Apenas certifique-se de atualizar seu pom com a dependência de poi e a dependência de poi-ooxml para a nova versão 3.16, caso contrário você continuará recebendo exceções. Uma vantagem desta versão é que você pode especificar o tipo de célula no momento em que a célula é criada, eliminando todas as etapas extras descritas nas respostas anteriores:
fonte
Eu preferiria seguir o caminho da resposta do wil ou Vinayak Dornala, infelizmente eles afetaram muito meu desempenho. Fui para uma solução HACKY de elenco implícito:
Eu não sugiro que você faça isso, para a minha situação funcionou devido à natureza de como o sistema funcionava e eu tinha uma fonte de arquivo confiável.
Nota de rodapé: numericColumn É um int gerado pela leitura do cabeçalho do arquivo processado.
fonte
Eu tentei isso e funcionou para mim
fonte
Você controla a planilha do Excel de qualquer maneira? Existe um modelo que os usuários tenham para fornecer a entrada? Nesse caso, você pode formatar o código das células de entrada para você.
fonte
Parece que isso não pode ser feito na versão atual do POI, com base no fato de que este bug:
https://issues.apache.org/bugzilla/show_bug.cgi?id=46136
ainda é excelente.
fonte
cell.setCellType (Cell.CELL_TYPE_STRING); está funcionando bem para mim
fonte
Isso funcionou perfeito para mim.
fonte
Tivemos o mesmo problema e forçamos nossos usuários a formatar as células como 'texto' antes de inserir o valor. Dessa forma, o Excel armazena corretamente números pares como texto. Se o formato for alterado posteriormente, o Excel altera apenas a maneira como o valor é exibido, mas não altera a maneira como o valor é armazenado, a menos que o valor seja inserido novamente (por exemplo, pressionando return quando na célula).
Se o Excel armazenou ou não corretamente o valor como texto é indicado pelo pequeno triângulo verde que o Excel exibe no canto superior esquerdo da célula, se achar que a célula contém um número, mas está formatada como texto.
fonte
convertido para um int, então faça a
.toString()
. É feio, mas funciona.fonte