2010-04-21 10 views
12

Używanie xlwt moduł Pythona, pisząc do tej samej komórki dwukrotnie zgłasza błąd:Python XLWT próba nadpisania obejście komórka

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 

z fragmentem kodu

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 

wygląda kodem „podnieść "wyjątek, który zatrzymuje cały proces. Czy usunięcie terminu "podnieś" wystarczy, aby umożliwić zastąpienie komórek? Doceniam ostrzeżenie xlwt, ale pomyślałem, że pythonic to zakładać "wiemy, co robimy". Nie chcę łamać niczego innego w dotykaniu modułu.

Odpowiedz

42

Problem polega na tym, że nadpisywanie danych arkusza roboczego jest domyślnie wyłączone w xlwt. Trzeba pozwolić go wyraźnie, tak jak poniżej:

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

+1 udokumentowany tutaj: http://groups.google.com/group/python-excel/browse_thread/thread/c0def68185c7b85e – bernie

+0

tylko to, co trzeba, i dzięki za link – PPTim

+1

Dziękuję za faktycznie dając odpowiedź; o wiele wygodniej niż wskazywanie w ogólnym kierunku ... – araisbec

1

Powinieneś skontaktować się z autorem modułu. Po prostu usunięcie raise jest mało prawdopodobne, aby działało dobrze. Sądzę, że doprowadziłoby to do innych problemów w dalszej części. Na przykład, późniejszy kod może zakładać, że jakakolwiek dana komórka jest tylko raz w reprezentacji pośredniej.

5

Co Ned B. napisał to cenne porady - z wyjątkiem faktu, że jako xlwt jest rozwidlenie pyExcelerator „autor modułu jest złego” zdefiniowane ;-)

... a Kaloyan Todorov trafił w sedno.

Oto kilka rad:

(1) Zwróć uwagę na następującą linię w kodzie, że cytowany:

if not self.__parent._cell_overwrite_ok: 

i przeszukać kod _cell_overwrite_ok i powinno dojść do wniosku, Kaloyan użytkownika.

(2) Zadawaj pytania na temat (i przeszukać archiwa) pyton-excel google-grupa

(3) Sprawdź this site która daje wskazówki do Google grupie i samouczek.

Tło: problem polegał na tym, że niektórzy ludzie nie wiedzieli, co robią (i przynajmniej w jednym przypadku byli zadowoleni, aby im to powiedzieć), a zachowanie, które xlwt odziedziczył po pyExcelerator, polegało na ślepym pisaniu dwóch (lub więcej)) zapisy dla tej samej komórki, co doprowadziło nie tylko do nadpisywania plików, ale także dezorientacji, ponieważ Excel narzekałby i pokazywał pierwsze napisane i OpenOffice i Gnumeric po cichu pokazywały ostatnie napisane. Usunięcie wszystkich śladów starych danych z udostępnianej tabeli tekstowej, aby nie marnować miejsca lub (gorzej) było widoczne w pliku, było PITA.

Cała saga jest rejestrowana w grupie google. Samouczek zawiera sekcję o nadpisywaniu komórek.

+0

dzięki za linki i informacje, bardzo pouczające. Więc z tego wynika, że ​​nadpisywanie zbyt dużej części tabeli było nadal złym pomysłem, ponieważ nadpisane dane są nadal zawarte w folderze? – PPTim

+1

Jeśli tak się zbierzesz, zbieracie się niepoprawnie; patrz wyżej "Usunięcie wszystkich śladów ... było [czas przeszły]" i/lub przeczytanie wątku pod linkiem, który podał ci Adam Bernier, albo uwierz w to, albo uruchom skrypt 6-wierszowy w trzeciej wiadomości w wątku, sprawdź plik wyjściowy z wywrotką char/hex (lub xlrd-dostarczone runxlrd.py z komendą biff_dump), i zauważ, że zgodnie z reklamą nie ma śladu oryginalnych danych. –

2

Jeśli:

  • nie chce, aby ustawić cały arkusz, aby móc zostać nadpisane w konstruktorze i
  • jeszcze złapać wyjątek na zasadzie case-by-case

...spróbuj tego:

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 
Powiązane problemy