2011-12-17 26 views
5

Estoy intentando leer valores de un archivo Excel usando xlrd. Ha funcionado muy bien en fechas, números y texto hasta ahora. Tengo una columna (categoría) con celdas que contienen texto (las celdas están formateadas como texto). Cuando imprimo el valor de la celda, se muestra un flotador en lugar del texto. También imprimí el tipo de objeto Cell (s) para verificar y se muestra como Number. He leído la documentación y el tutorial de xlrd y parece que no puedo encontrar por qué ocurre esto. ¿Podría ser que mi archivo de Excel esté de alguna manera en mal estado? ¿Alguna sugerencia o sugerencia en la dirección correcta?python xlrd recibiendo flotación desde la celda de texto de Excel

import xlrd 
import datetime 

workbook = xlrd.open_workbook('training.xls') 
courseSheet = workbook.sheet_by_index(0) 

for row in range(courseSheet.nrows): 
    title = courseSheet.cell_value(row, 2) 
    date = courseSheet.cell_value(row, 4) 
    date = datetime.datetime(*xlrd.xldate_as_tuple(date, workbook.datemode)) 
    dateTuple = date.timetuple() 
    category = courseSheet.cell_value(row, 7) 
    print category 
+0

¿cuál es el 'cell.ctype' de las celdas en la columna 7? –

+0

¿Cómo debo leer el código publicado para comprender su problema? ¿Cómo sabes que es una carroza? de la impresión de la 'categoría de impresión'? – joaquin

+0

@MikePennington el tipo de celda de la columna 7 es xlrd.XL_CELL_NUMBER. Simplemente no estoy seguro de por qué xlrd está leyendo una celda de texto como eso. – binaryFever

Respuesta

3

Antecedentes: Para cada celda, XLRD informa el valor intrínseco (si los hay) que se almacena en el archivo XLS. Los tipos de valores se asignan inicialmente únicamente sobre la base del tipo de registro en el archivo (por ejemplo, los registros NUMBER y RK contienen números de coma flotante). Clasifica los formatos como se describe en here y usa esa información para anular el tipo de valor donde es evidente que una fecha, fecha o hora es más bien un número. xlrd no pretende poder representar valores de celda de acuerdo con el formato atribuido a la celda.

Las celdas en cuestión se han ingresado evidentemente como números. Si se les ha aplicado un formato de texto, eso no los convierte en "celdas de texto".

Usted dice "" "Cuando imprimo el valor de la celda, aparece un flotador en lugar del texto" "" ... por favor proporcione algunos ejemplos de (a) lo que se escribió en la celda cuando se creó el archivo (b) ¿cuál es la evidencia de que "las celdas están formateadas como texto" (c) qué es repr (cell.value) (d) qué es "el texto" que esperaba que se muestre?

Usted puede encontrar el siguiente código útil:

import xlrd, sys 

def dump_cell(sheet, rowx, colx): 
    c = sheet.cell(rowx, colx) 
    xf = sheet.book.xf_list[c.xf_index] 
    fmt_obj = sheet.book.format_map[xf.format_key] 
    print rowx, colx, repr(c.value), c.ctype, \ 
     fmt_obj.type, fmt_obj.format_key, fmt_obj.format_str 

book = xlrd.open_workbook(sys.argv[1], formatting_info=1) 
sheet = book.sheet_by_index(0) 
for rowx in xrange(sheet.nrows): 
    for colx in xrange(sheet.ncols): 
     dump_cell(sheet, rowx, colx) 
+0

¿Alguna forma de leer el valor de la celda 'en bruto' y trabajar con eso? –

0

tengo el mismo problema que el OP y creo que he llegado a la conclusión de que hay casos en los que no hay solución en el pitón (XLRD) lado. Usted está a merced de cómo los datos se ingresaron originalmente en la hoja de Excel. Específicamente, si los datos se ingresaron en una celda que ya tenía el formato de 'Texto' correcto, o si los datos se ingresaron en una celda con el formato predeterminado 'General' y luego el formato de la celda se cambió a ' Texto 'después de ingresar los datos.

Si ingresa datos en una celda preformateada, sus datos numéricos se marcarán con una marca de advertencia de Excel que indica que tiene datos numéricos en una celda formateada para Texto. En este caso, xlrd manejará los datos como espera: devolver la cadena tal como aparece en la hoja de cálculo de Excel. (Por ejemplo, los contenidos de la celda leídos como "1" en excel y xlrd devolverán "1" como valor de celda)

Sin embargo, si cambia el formato de la celda después de haber ingresado los datos numéricos, terminará en una situación donde los datos en excel se presentan como "1", pero xlrd devolverá un valor de celda de "1.0". Si marca el xlrd cell.ctype para esta celda, verá que la celda todavía se está tratando como un número, aunque el formato se cambió a Texto en Excel.

Una posible solución puede ser tener sus datos de cadena de Excel rodeados de comillas. Esto prohibiría que Excel trate los datos como un valor numérico desde el comienzo.

+0

Lo que John Machin estaba tratando de explicar en su respuesta es que el "Formato de texto" de Excel está meramente formateando. No cambia el tipo subyacente de los datos. Si Excel cree que los datos son numéricos, se almacenan como flotantes. Período. Fin de la historia. Incluso puede ver que ** NO ** se trata como texto (a pesar de cualquier palabrería presentada por Excel) cuando incluye esa celda en una fórmula numérica, como 'SUM'. Si crea una celda cuyo tipo subyacente es el texto, como al ingresar un apóstrofo seguido de un número, esa celda no contribuirá nada a 'SUMA '. –

+0

John Y - entiendo lo que dices. mi publicación fue sobre "Si Excel cree que los datos son numéricos", parte del problema, ya que creo que de ahí viene la confusión. Específicamente, el hecho de que el orden en el que se establece el formato de una celda y el ingreso de los datos de una celda afectará si Excel cree que un dato es numérico o de texto –

+0

Lo siento, hasta ahora me ha llevado a comprender completamente lo que se expresaba en esta respuesta Realmente no tenía sentido para mí que "escribir cosas, luego configurar el formateo" pudiera resultar en algo diferente a "configurar el formateo, luego escribir cosas". Y sin embargo, realmente lo hace. La bombilla se encendió en algún momento después de que respondí al [número 140] (https://github.com/python-excel/xlrd/issues/140) en el repositorio xlrd. –

Cuestiones relacionadas