Tanja: Python: xml/xlsx parser

Guten Morgen,

seit längerem nutze ich das xlsx2csv.py Script zum Konvertieren verschiedener Exports.

Leider haben einige "Datenlieferanten" neuerdings in ihrer xlsx Datei eine leere Zeile. Die Datei ist valide, aber eben mit dem "Bug", dass Zeile 1 leer ist und die Reihenbeschriftung in Zeile 2 zu finden ist.

An sich kein Problem, aber scheinbar sieht Python das anders:

...
self.colNum = cellId[:len(cellId)-len(self.rowNum)]
=> TypeError: object of type 'NoneType' has no len()

Habt ihr einen Tipp, wie sich das umgehen lässt?

Einiges habe ich bereits versucht, jedoch immer nur mit dem Ergebnis, dass zwar der Fehler nicht mehr angezeigt wird, aber die Inhalte der darunterliegenden Reihen nicht vollständig geladen werden :-(

    def handleStartElement(self, name, attrs):  
##self.colType!="NoneType" fuehrt dazu, dass auch darunterliegende Inhalte fehlen  
        if self.in_row and name == 'c' and self.colType!="NoneType":  
            self.colType = attrs.get("t")  
            self.s_attr = attrs.get("s")  
            cellId = attrs.get("r")  
##dasselbe passiert damit  
#            try:  
#               self.colNum = cellId[:len(cellId)-len(self.rowNum)]  
#            except (TypeError):  
#               self.colNum = self.colNum  
            self.colNum = cellId[:len(cellId)-len(self.rowNum)]  
            #self.formula = None  
            self.data = ""  
            self.in_cell = True  
        elif self.in_cell and name == 'v':  
            self.in_cell_value = True  
        elif self.in_sheet and name == 'row' and attrs.has_key('r'):  
            self.rowNum = attrs['r']  
            self.in_row = True  
            self.columns = {}  
            self.spans = None  
            if attrs.has_key('spans'):  
                self.spans = [int(i) for i in attrs['spans'].split(":")]  
        elif name == 'sheetData':  
            self.in_sheet = True  

Großes Dankeschön

  1. Tach!

    Leider haben einige "Datenlieferanten" neuerdings in ihrer xlsx Datei eine leere Zeile. Die Datei ist valide, aber eben mit dem "Bug", dass Zeile 1 leer ist und die Reihenbeschriftung in Zeile 2 zu finden ist.
    Habt ihr einen Tipp, wie sich das umgehen lässt?

    Die einfachste Vermutung ist, dass das Problem sich mit einem Trim oder wenigstens LTrim lösen lässt.

    dedlfix.

    1. Hallo dedlfix,

      nach einer geeigneten Stelle, wo sich der Dateiinhalt trimmen lässt, habe ich vergeblich gesucht: https://github.com/dilshod/xlsx2csv/blob/master/xlsx2csv.py

      Tanja

      1. Tach!

        nach einer geeigneten Stelle, wo sich der Dateiinhalt trimmen lässt, habe ich vergeblich gesucht: https://github.com/dilshod/xlsx2csv/blob/master/xlsx2csv.py

        Da gibt es einen Parameter skip_empty_lines, sorgt der eventuell für die gesuchte Funktionalität? Ansonsten, denke ich, sieht Zeile 122 erfolgversprechend aus:

        instance.parse(ziphandle.read(filename))

        Mir scheint, dass am Ergebnis von ziphandle.read(filename) das Trim ansetzen müsste, bevor es zum Parsen geht.

        dedlfix.