valor texto numero formato convertir como almacenado java excel apache-poi

java - texto - ¿Cómo puedo leer cadenas numéricas en celdas de Excel como una cadena(no números)?



numero almacenado como texto convertir a numero (18)

  1. Tengo un archivo de Excel con dichos contenidos:

    • A1: SomeString

    • A2: 2

    Todos los campos están configurados en formato de cadena.

  2. Cuando leo el archivo en Java usando POI, dice que A2 está en formato de celda numérica.

  3. El problema es que el valor en A2 puede ser 2 o 2.0 (y quiero poder distinguirlos), así que no puedo usar .toString() .

¿Qué puedo hacer para leer el valor como una cadena?


¿Controla la hoja de cálculo de Excel de todos modos? ¿Hay una plantilla que los usuarios tengan para darle la entrada? Si es así, puede tener el formato de código de las celdas de entrada para usted.



Cuando leemos el valor numérico de la celda de MS Excel utilizando la biblioteca de PDI de Apache, la leemos como numérica. Pero a veces queremos que se lea como una cadena (por ejemplo, números de teléfono, etc.). Así es como lo hice:

  1. Inserte una nueva columna con first cell = CONCATENATE ("!", D2). Supongo que D2 es la identificación de la celda de su columna de número de teléfono. Arrastra una nueva celda hasta el final.

  2. Ahora, si lee la celda con PDI, leerá la fórmula en lugar del valor calculado. Ahora haz lo siguiente:

  3. Agrega otra columna

  4. Seleccione la columna completa creada en el paso 1. y elija Edición-> COPIA

  5. Vaya a la celda superior de la columna creada en el paso 3. y seleccione Editar-> Pegar especial

  6. En la ventana abierta, seleccione el botón de selección "Valores"

  7. Seleccione "OK"

  8. Ahora lea usando la API de POI ... después de leer en Java ... simplemente elimine el primer carácter, es decir, "!"


El siguiente código funcionó para mí para cualquier tipo de celda.

InputStream inp =getClass().getResourceAsStream("filename.xls")); Workbook wb = WorkbookFactory.create(inp); DataFormatter objDefaultFormat = new DataFormatter(); FormulaEvaluator objFormulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) wb); Sheet sheet= wb.getSheetAt(0); Iterator<Row> objIterator = sheet.rowIterator(); while(objIterator.hasNext()){ Row row = objIterator.next(); Cell cellValue = row.getCell(0); objFormulaEvaluator.evaluate(cellValue); // This will evaluate the cell, And any type of cell will return string value String cellValueStr = objDefaultFormat.formatCellValue(cellValue,objFormulaEvaluator); }


Esto funcionó perfecto para mí.

Double legacyRow = row.getCell(col).getNumericCellValue(); String legacyRowStr = legacyRow.toString(); if(legacyRowStr.contains(".0")){ legacyRowStr = legacyRowStr.substring(0, legacyRowStr.length()-2); }


Muchas de estas respuestas hacen referencia a la documentación y clases antiguas de PDI. En el último POI 3.16, Cell con los tipos int ha quedado obsoleto

Cell.CELL_TYPE_STRING

En cambio, se puede usar CellType enum .

CellType.STRING

Solo asegúrese de actualizar su pom con la dependencia de poi, así como la dependencia de 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:

titleRowCell = currentReportRow.createCell(currentReportColumnIndex, CellType.STRING);


No creo que hayamos recuperado esta clase cuando hiciste la pregunta, pero hoy hay una respuesta fácil.

Lo que quiere hacer es usar la clase DataFormatter . Le pasa esto a una celda y hace todo lo posible para devolverle una cadena que contiene lo que Excel le mostraría para esa celda. Si le pasa una celda de cadena, recuperará la cadena. Si le pasa una celda numérica con las reglas de formato aplicadas, formateará el número basado en ellas y le devolverá la cadena.

Para su caso, asumiría que las celdas numéricas tienen una regla de formato entero aplicada a ellas. Si le pide a DataFormatter que formatee esas celdas, le devolverá una cadena con la cadena de números enteros.

Además, tenga en cuenta que muchas personas sugieren hacer cell.setCellType(Cell.CELL_TYPE_STRING) , pero los JavaDocs de Apache POI indican claramente que no debe hacer esto . Hacer la llamada a setCellType perderá formateo, ya que los javadocs explican que la única forma de convertir a String con el formato restante es usar la clase DataFormatter .



Sí, esto funciona a la perfección

recomendado:

DataFormatter dataFormatter = new DataFormatter(); String value = dataFormatter.formatCellValue(cell);

antiguo:

cell.setCellType(Cell.CELL_TYPE_STRING);

incluso si tiene un problema para recuperar un valor de la cell tiene fórmula, aún así funciona.


Siempre que 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 que está formateado como Texto, podrá recuperar su valor como una cadena (el triángulo verde aparece siempre que algo que parece ser un número) es coaccionado en un formato de texto). Si tiene celdas con formato de texto que contienen números, pero POI no le permitirá obtener esos valores como cadenas, hay algunas cosas que puede hacer a los datos de la hoja de cálculo para permitir eso:

  • Haga doble clic en la celda para que el cursor de edición esté presente dentro de la celda, luego haga clic en Entrar (que se puede hacer solo una celda a la vez).
  • Utilice la función de conversión de texto de Excel 2007 (que se puede hacer en varias celdas a la vez).
  • Recorte los valores ofensivos a otra ubicación, vuelva a formatear las celdas de la hoja de cálculo como texto, luego vuelva a pasar los valores recortados previamente como valores sin formato al área adecuada.

Una última cosa que puede hacer es que si está utilizando un 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.


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óstrofo delante de un número para que una importación DB independiente siempre vea los números como texto. Antes de esto, el número 8 se importaría como 8.0.

Solución:

  • Mantenga todo el formato como General.
  • Aquí estoy suponiendo que los números se almacenan en la Columna A comenzando en la Fila 1.
  • Coloque el ''en la Columna B y copie tantas filas como sea necesario. No aparece nada en la hoja de trabajo, pero al hacer clic en la celda puede ver el apostophe en la barra de fórmulas.
  • En la Columna C: = B1 y A1.
  • Seleccione todas las Celdas en la Columna C y haga un Pegado Especial en la Columna D usando la opción de Valores.

Hey Presto todos los números pero almacenados como Texto.


Tratar:

new java.text.DecimalFormat("0").format( cell.getNumericCellValue() )

Debe formatear el número correctamente.


Tuve el mismo problema Hice cell.setCellType(Cell.CELL_TYPE_STRING); antes de leer el valor de la cadena, que resolvió el problema independientemente de cómo formateó el usuario la celda.


Tuvimos el mismo problema y obligamos a nuestros usuarios a formatear las celdas como ''texto'' antes de ingresar el valor. De esa forma, 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 se vuelva a ingresar el valor (por ejemplo, al presionar return cuando esté en la celda).

Si Excel almacena correctamente 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á formateada como texto.


Yo recomendaría el siguiente enfoque cuando modificar el tipo de celda no es deseable:

if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) { String str = NumberToTextConverter.toText(cell.getNumericCellValue()) }

NumberToTextConverter puede convertir correctamente el doble valor a un texto utilizando las reglas de Excel sin pérdida de precisión.


cell.setCellType (Cell.CELL_TYPE_STRING); está funcionando bien para mí


getStringCellValue devuelve NumberFormatException si el tipo de celda es numérico. Si no desea cambiar el tipo de celda a cadena, puede hacerlo.

String rsdata = ""; try { rsdata = cell.getStringValue(); } catch (NumberFormatException ex) { rsdata = cell.getNumericValue() + ""; }


lanzar a un int luego hacer un .toString() . Es feo pero funciona.