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

StackOverflow https://stackoverflow.com/questions/1072561

  •  21-08-2019
  •  | 
  •  

Pregunta

  1. Tengo archivo de Excel con tales contenidos:

    • A1: someString

    • A2: 2

    Todos los campos se establecen en formato de cadena.

  2. Cuando leí el archivo en Java usando POI, se dice que está en formato A2 celular numérico.

  3. El problema es que el valor de A2 puede ser 2 o 2.0 (y quiero ser capaz de distinguir ellos) así que no sólo puede utilizar .toString().

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

¿Fue útil?

Solución

Yo tenía el mismo problema. Hice cell.setCellType(Cell.CELL_TYPE_STRING); antes de leer el valor de la cadena, que resuelve el problema, independientemente de cómo el usuario formatea la celda.

Otros consejos

No creo que hayamos tenido esta clase de nuevo cuando se hizo la pregunta, pero hoy en día hay una respuesta fácil.

Lo que se quiere hacer es utilizar la DataFormatter clase . Se pasa esta una célula, y se hace lo posible para que devolver una cadena que contiene lo que Excel le mostraría para esa celda. Si se le pasa una célula cadena, que obtendrá la cadena de nuevo. Si se le pasa una célula numérico con reglas de formato aplicados, se dará formato al número basado en ellos y le dará la cadena de nuevo.

En su caso, me gustaría asumir que las celdas numéricas tienen una regla de formato de enteros que se les aplica. Si le preguntas a DataFormatter para dar formato a las celdas, te dará vuelta una cadena con la cadena número entero en el mismo.

Además, tenga en cuenta que muchas personas sugieren hacer cell.setCellType(Cell.CELL_TYPE_STRING), pero el JavaDocs Apache POI afirmar con claridad que no se debe hacer esto ! Haciendo la llamada setCellType perderá el formato, como el javadocs explican la única manera de convertir en una cadena con el formateo restante es utilizar el clase DataFormatter .

El código siguiente trabajó para mí para cualquier tipo de célula.

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);

}

Yo recomendaría el siguiente enfoque al modificar el tipo de célula no es deseable:

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

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

Como ya se mencionó en JavaDocs del POI ( https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29 ) no utilizar:

cell.setCellType(Cell.CELL_TYPE_STRING);

pero el uso:

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

Más ejemplos sobre http://massapi.com/class/da/DataFormatter.html

Sí, esto funciona perfectamente

recomendada:

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

edad:

cell.setCellType(Cell.CELL_TYPE_STRING);

, incluso si tiene un problema con la recuperación de un valor de cell que tiene la fórmula, siendo esto funciona.

Probar:

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

En caso de formatear el número correctamente.

Mientras que la célula está en formato de texto antes de que el usuario escribe en el número, PDI le permitirá obtener el valor como una cadena. Una de las claves es que si hay un pequeño triángulo verde en la esquina superior izquierda de la celda que tiene formato de texto, usted será capaz de recuperar su valor como una cadena (el triángulo verde aparece siempre algo que parece ser un número está obligada a tener un formato de texto). Si usted tiene células con formato de texto que contienen números, pero PDI no dejará de hacer salir esos valores como cadenas, hay algunas cosas que puede hacer con los datos de hoja de cálculo para permitir que:

  • Haga doble clic en la celda para que el cursor de edición está presente dentro de la célula, a continuación, haga clic en Enter (que se puede hacer sólo una célula a la vez).
  • Utilice la función de conversión de texto Excel 2007 (que se puede hacer en varias celdas a la vez).
  • Para recortar los valores inválidos a otra ubicación, formatear las celdas de hoja de cálculo como texto, a continuación, pegar cualquier los valores previamente cortadas como Los valores sin formato de nuevo en el área apropiada.

Una última cosa que usted puede hacer es que si está utilizando PDI para obtener datos de una hoja de cálculo de Excel 2007, puede método de la clase teléfono 'getRawValue ()'. Esto no le importa lo que el formato es. Simplemente se devolverá una cadena con los datos en bruto.

Cuando leemos valor de celda numérico del MS Excel usando la biblioteca Apache POI, se lee como numéricos. Pero en algún momento queremos que se lee como de cuerda (por ejemplo, números de teléfono, etc.). Esto es cómo lo hice:

  1. Inserte una nueva columna con primera celda = concatenar ( "!", D2). Asumo D2 es la ID de celda de la columna-número de teléfono. Arrastre nueva célula hasta el final.

  2. Ahora bien, si usted lee la celda utilizando PDI, se leerá la fórmula en lugar del valor calculado. Ahora hacer lo siguiente:

  3. Añadir otra columna

  4. Seleccione completa columna creada en el paso 1. y seleccione Editar-> Copiar

  5. Ir a la celda superior de la columna creada en el paso 3. Seleccionar y Editar-> Pegado especial

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

  7. Seleccione "OK"

  8. Ahora lee utilizando la API de puntos de interés ... después de leer en Java ... basta con retirar el primer carácter es decir, "!"

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 resolver. Que necesitaba para conseguir el apóstrofe insertado antes de un número de manera que una importación de base de datos separada siempre ve los números como texto. Antes de esto, el número 8 como se importaría 8.0.

Solución:

  • Mantenga todo el formato como el general.
  • Números Aquí estoy asumiendo que se almacenan en la Columna A partir de la fila 1.
  • Poner en el 'en la columna B y copiar hacia abajo tantas filas como sea necesario. No aparece nada en la hoja de trabajo, pero al hacer clic en la celda se 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 hacer una pasta especial en la columna D usando la opción Valores.

Hey Presto todos los números sino que se almacena como texto.

getStringCellValue devuelve NumberFormatException si el tipo de célula es numérico. Si no desea cambiar el tipo de célula de cadena, puede hacer esto.

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

Muchas de estas respuestas referencia del Antiguo documentación de puntos de interés y las clases. En el más reciente POI 3,16, celular con los tipos int ha quedado en desuso

Cell.CELL_TYPE_STRING

introducir descripción de la imagen aquí

En lugar del celltype enumeración puede ser utilizado.

CellType.STRING 

Sólo asegúrese de actualizar su pom con la dependencia de puntos de interés, así como la dependencia poi-OOXML a la nueva versión 3.16 de lo contrario se continuará recibiendo excepciones. Una ventaja de esta versión es que se puede especificar el tipo de célula en el momento en que se crea la célula eliminando todos los pasos adicionales que se describen en las respuestas anteriores:

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

Me gustaría mucho ir a la ruta de la respuesta del Wil o Vinayak Dornala, por desgracia en que hayan realizado mi rendimiento lejos de mucho. Fui a dar un HACKY solución de conversión implícita:

for (Row row : sheet){
String strValue = (row.getCell(numericColumn)+""); // hack
...

No sugiero hacer esto, para mi situación funcionó debido a la naturaleza de cómo funciona el sistema y que tenía una fuente fiable de archivos.

Nota al pie:     numericColumn Es un int que se genera a partir de la lectura de la cabecera del archivo procesado.

public class Excellib {
public String getExceldata(String sheetname,int rownum,int cellnum, boolean isString) {
    String retVal=null;
    try {
        FileInputStream fis=new FileInputStream("E:\\Sample-Automation-Workspace\\SampleTestDataDriven\\Registration.xlsx");
        Workbook wb=WorkbookFactory.create(fis);
        Sheet s=wb.getSheet(sheetname);
        Row r=s.getRow(rownum);
        Cell c=r.getCell(cellnum);
        if(c.getCellType() == Cell.CELL_TYPE_STRING)
        retVal=c.getStringCellValue();
        else {
            retVal = String.valueOf(c.getNumericCellValue());
        }

He intentado esto y funcionó para mí

Hemos tenido el mismo problema y obligó a nuestros usuarios para dar formato a las celdas como 'texto' antes de introducir el valor. De esa manera Excel almacena correctamente los números pares como texto. Si el formato se cambia después de Excel sólo cambia la forma de visualización de valor, pero no cambia la forma en que se almacena el valor menos que se introduzca de nuevo el valor (por ejemplo, pulsando retorno cuando en la célula).

Si o no Excel almacena correctamente el valor como texto es indicado por el pequeño triángulo verde que Excel muestra en la esquina superior izquierda de la celda si se piensa que la celda contiene un número, pero se formatea como texto.

Cómo se controla la hoja de cálculo Excel de todos modos? ¿Hay una plantilla de los usuarios tienen para darle la entrada? Si es así, usted puede tener formato de código de las celdas de entrada para usted.

Parece que esto no puede hacerse en la versión actual del PDI, basado en el hecho de que este error:

https://issues.apache.org/bugzilla/show_bug.cgi? id = 46136

todavía está pendiente.

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

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

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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top