2010-04-21 20 views
12

Utilizando el xlwt módulo de Python, escribiendo a la misma celda lanza dos veces un error:intento Python XLWT sobrescribir solución celular

Message File Name Line Position  
Traceback    
    <module> S:\******** 
    write C:\Python26\lib\site-packages\xlwt\Worksheet.py 1003   
    write C:\Python26\lib\site-packages\xlwt\Row.py 231  
    insert_cell C:\Python26\lib\site-packages\xlwt\Row.py 150  
Exception: Attempt to overwrite cell: sheetname=u'Sheet 1' rowx=1 colx=12 

con el fragmento de código

def insert_cell(self, col_index, cell_obj): 
     if col_index in self.__cells: 
      if not self.__parent._cell_overwrite_ok: 
       msg = "Attempt to overwrite cell: sheetname=%r rowx=%d colx=%d" \ 
        % (self.__parent.name, self.__idx, col_index) 
       raise Exception(msg) #row 150 
      prev_cell_obj = self.__cells[col_index] 
      sst_idx = getattr(prev_cell_obj, 'sst_idx', None) 
      if sst_idx is not None: 
       self.__parent_wb.del_str(sst_idx) 
     self.__cells[col_index] = cell_obj 

Parece que el código 'elevar es una excepción que detiene todo el proceso. ¿Eliminar el término "subir" es suficiente para permitir la sobreescritura de las celdas? Aprecio la advertencia de xlwt, pero pensé que la manera pitonica es suponer que "sabemos lo que estamos haciendo". No quiero romper nada más al tocar el módulo.

Respuesta

42

El problema es que la sobrescritura de datos de la hoja de cálculo está deshabilitada de forma predeterminada en xlwt. Usted tiene que permitir explícitamente, así:

worksheet = workbook.add_sheet("Sheet 1", cell_overwrite_ok=True) 
+1

+1 documentado aquí: http://groups.google.com/group/python-excel/browse_thread/thread/c0def68185c7b85e – bernie

+0

justo lo que necesito, y gracias por el enlace – PPTim

+1

Gracias por en realidad dando la respuesta; mucho más conveniente que apuntando en una dirección general ... – araisbec

1

Debe ponerse en contacto con el autor del módulo. Simplemente eliminar un raise es poco probable que funcione bien. Supongo que conduciría a otros problemas más adelante. Por ejemplo, el código posterior puede suponer que una celda dada está solo en la representación intermedia una vez.

5

Lo Ned B. ha escrito es valioso asesoramiento - excepto por el hecho de que a medida que xlwt es un tenedor de pyExcelerator "el autor del módulo" es mal definido ;-)

... y Kaloyan Todorov ha dado en el clavo en la cabeza.

He aquí algunos consejos más:

(1) Observe la línea siguiente en el código que usted ha citado:

if not self.__parent._cell_overwrite_ok: 

y buscar el código para _cell_overwrite_ok y usted debe venir a la conclusión de Kaloyan.

(2) Haga preguntas sobre (y buscar en los archivos de) la pitón-excel google-grupo

(3) Confirmar this site que da consejos para el google-grupo y un tutorial.

Antecedentes: el problema es que algunas personas no sabían lo que estaban haciendo (y en al menos un caso se alegraron de que se les diga), y el comportamiento que xlwt heredado de pyExcelerator fue escribir ciegamente dos (o más) registros para la misma celda, lo que condujo no solo a la saturación de archivos sino también a la confusión, porque Excel se quejaría y mostraría la primera versión escrita y OpenOffice y Gnumeric mostrarían en silencio el último escrito. La eliminación de todos los rastros de los datos antiguos de la tabla de cadenas compartidas para que no perdiera espacio o (peor) fuera visible en el archivo era un PITA.

Toda la saga está registrada en el grupo de google. El tutorial incluye una sección sobre sobrescribir celdas.

+0

gracias por los enlaces y la información, muy informativo. Entonces, de esto me doy cuenta de que sobrescribir demasiado de la tabla todavía era una mala idea, ya que los datos sobrescritos todavía están contenidos en la carpeta. – PPTim

+1

Si lo hace, se reúne incorrectamente; ver arriba "Eliminar todo el rastro ... fue [tiempo pasado]" y/o leer el hilo en el enlace que Adam Bernier le dio, ya sea creerlo o ejecutar el guión de 6 líneas en el tercer mensaje del hilo, inspeccionar el archivo de salida con un dumper char/hex (o el runxlrd.py provisto xlrd con el comando biff_dump), y observe que como se anuncia no hay rastro de los datos originales. –

2

Si:

  • no quieren establecer toda la hoja para poder ser sobrescrito en el constructor, y
  • aún capta la excepción en una base de caso por caso

...intente esto:

try: 
    worksheet.write(row, col, "text") 
except: 
    worksheet._cell_overwrite_ok = True 
    # do any required operations since we found a duplicate 
    worksheet.write(row, col, "new text") 
    worksheet._cell_overwrite_ok = False 
Cuestiones relacionadas