Tengo un archivo de Excel con tales contenidos:
A1: SomeString
A2: 2
Todos los campos están configurados en formato de cadena.
Cuando leo el archivo en Java usando POI, me dice que A2 está en formato de celda numérica.
- El problema es que el valor en A2 puede ser 2 o 2.0 (y quiero poder distinguirlos), así que no puedo usarlo
.toString()
.
¿Qué puedo hacer para leer el valor como cadena?
java
excel
apache-poi
joycollector
fuente
fuente
No creo que tuviéramos esta clase cuando hiciste la pregunta, pero hoy hay una respuesta fácil.
Lo que quieres hacer es usar la clase DataFormatter . Se le pasa esta celda y hace todo lo posible para devolverle una cadena que contiene lo que Excel le mostrará para esa celda. Si le pasa una celda de cadena, recuperará la cadena. Si le pasa una celda numérica con reglas de formato aplicadas, formateará el número en función de ellas y le devolverá la cadena.
Para su caso, supongo que las celdas numéricas tienen aplicada una regla de formato entero. Si le pide a DataFormatter que formatee esas celdas, le devolverá una cadena con la cadena entera.
Además, tenga en cuenta que mucha gente sugiere hacerlo
cell.setCellType(Cell.CELL_TYPE_STRING)
, pero los JavaDoc de PDI de Apache indican claramente que no debe hacer esto . Hacer lasetCellType
llamada perderá el formato, ya que los javadocs explican que la única forma de convertir a una Cadena con formato restante es usar la clase DataFormatter .fuente
When passed a null or blank cell, this method will return an empty String (""). Formulas in formula type cells will not be evaluated.
El siguiente código funcionó para mí para cualquier tipo de celda.
fuente
getCreationHelper().createFormulaEvaluator()
método. De esta manera, su código no se combinará con la clase HSSFFormulaEvaluator.FormulaEvaluator
Simplemente se puede eliminar de esta solución? ¿Sirve para un propósito?Recomendaría el siguiente enfoque cuando modificar el tipo de celda no es deseable:
NumberToTextConverter puede convertir correctamente el valor doble en un texto utilizando las reglas de Excel sin pérdida de precisión.
fuente
Como ya se mencionó en los JavaDocs de Poi ( https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29 ) no use:
pero usa:
Más ejemplos en http://massapi.com/class/da/DataFormatter.html
fuente
Si, esto funciona perfectamente
recomendado:
antiguo:
incluso si tiene un problema con recuperar un valor de
cell
tener fórmula, aún así funciona.fuente
Tratar:
Debe formatear el número correctamente.
fuente
2
y2.0
. Tu solución no haría esto. (¡Pero aún así, bienvenido a Stack Overflow!)Mientras la celda esté en formato de texto antes de que el usuario ingrese el número, POI le permitirá obtener el valor como una cadena. Una clave es que si hay un pequeño triángulo verde en la esquina superior izquierda de la celda con formato de Texto, podrá recuperar su valor como una cadena (el triángulo verde aparece cada vez que algo parece ser un número es forzado a un formato de texto). Si tiene celdas con formato de texto que contienen números, pero POI no le permitirá recuperar esos valores como cadenas, hay algunas cosas que puede hacer con los datos de la hoja de cálculo para permitir eso:
Una última cosa que puede hacer es que si está utilizando POI para obtener datos de una hoja de cálculo de Excel 2007, puede usar el método 'getRawValue ()' de la clase Cell. Esto no le importa cuál es el formato. Simplemente devolverá una cadena con los datos sin procesar.
fuente
Cuando leemos el valor de celda numérica de MS Excel usando la biblioteca Apache POI, lo lee como numérico. Pero en algún momento queremos que se lea como una cadena (por ejemplo, números de teléfono, etc.). Así es como lo hice:
Inserte una nueva columna con la primera celda = CONCATENAR ("!", D2). Supongo que D2 es la identificación de la celda de su columna de número de teléfono. Arrastre la nueva celda hasta el final.
Ahora, si lee la celda usando POI, leerá la fórmula en lugar del valor calculado. Ahora haz lo siguiente:
Agregar otra columna
Seleccione la columna completa creada en el paso 1. y elija Editar-> COPIAR
Vaya a la celda superior de la columna creada en el paso 3. y seleccione Editar-> Pegado especial
En la ventana abierta, seleccione el botón de opción "Valores"
Seleccione "OK"
Ahora lea usando POI API ... después de leer en Java ... simplemente elimine el primer carácter, es decir, "!"
fuente
También he tenido un problema similar en un conjunto de datos de miles de números y creo que he encontrado una manera simple de resolverlo. Necesitaba insertar el apóstrofe antes de un número para que una importación de DB por separado siempre vea los números como texto. Antes de esto, el número 8 se importaría como 8.0.
Solución:
Hola Presto todos los números pero almacenados como texto.
fuente
getStringCellValue devuelve NumberFormatException si el tipo de celda es numérico. Si no desea cambiar el tipo de celda a cadena, puede hacerlo.
fuente
Muchas de estas respuestas hacen referencia a documentación y clases antiguas de PDI. En el POI 3.16 más reciente, la celda con los tipos int ha quedado en desuso
En cambio, se puede usar la enumeración CellType .
Solo asegúrese de actualizar su pom con la dependencia poi, así como la dependencia poi-ooxml a la nueva versión 3.16, de lo contrario, continuará recibiendo excepciones. Una ventaja de esta versión es que puede especificar el tipo de celda en el momento en que se crea la celda, eliminando todos los pasos adicionales descritos en las respuestas anteriores:
fuente
Preferiría seguir la ruta de la respuesta de Wil o Vinayak Dornala, desafortunadamente afectaron mi actuación demasiado. Fui por una solución HACKY de casting implícito:
No le sugiero que haga esto, para mi situación funcionó debido a la naturaleza de cómo funcionaba el sistema y tenía un origen de archivos confiable.
Nota al pie: numericColumn Es un int que se genera al leer el encabezado del archivo procesado.
fuente
Intenté esto y funcionó para mí
fuente
¿Controlas la hoja de cálculo de Excel de todos modos? ¿Hay una plantilla que los usuarios tienen para darle la entrada? Si es así, puede hacer que el código formatee las celdas de entrada por usted.
fuente
Parece que esto no se puede hacer en la versión actual de POI, debido al hecho de que este error:
https://issues.apache.org/bugzilla/show_bug.cgi?id=46136
Aún está pendiente.
fuente
cell.setCellType (Cell.CELL_TYPE_STRING); está funcionando bien para mí
fuente
Esto funcionó perfecto para mí.
fuente
Tuvimos el mismo problema y obligamos a nuestros usuarios a formatear las celdas como 'texto' antes de ingresar el valor. De esa manera, Excel almacena correctamente los números pares como texto. Si luego se cambia el formato, Excel solo cambia la forma en que se muestra el valor, pero no cambia la forma en que se almacena el valor, a menos que el valor se ingrese nuevamente (por ejemplo, presionando Intro cuando está en la celda).
Si Excel almacenó correctamente o no el valor como texto se indica mediante el pequeño triángulo verde que Excel muestra en la esquina superior izquierda de la celda si cree que la celda contiene un número pero está formateado como texto.
fuente
emitir a un int luego hacer un
.toString()
. Es feo pero funciona.fuente