Exemple #1
0
    def __init__(self, parent, data=NEW_WORKSHEET, ofs=0):
        self.columninfo = RecordList(ColumnInfo)
        self.parent = parent
        loaders = {
            0x0006: self.add_cell,  # Formula
            0x007d: self.columninfo.read,
            0x00bd: self.add_mulcell,  # MulRKRecord
            0x00be: self.add_mulcell,  # MulBlankRecord
            0x00fd: self.add_cell,  #LabelSSTRecord
            0x0200: self.add_dimensions,
            0x0201: self.add_cell,  #BlankRecord
            0x0203: self.add_cell,  #NumberRecord
            0x0207: self.read_string,  # StringRecord
            0x0208: self.add_row,
            0x027e: self.add_cell,  #RKRecord
            0x00d7: Record.ignore,  # DBCell
        }

        urecord = {}
        self.rows = {}
        self.records = Record(0, 0)
        last_record = self.records
        for sid, data in record_stream(data):
            if sid == 0x000A:  #EOF
                break
            new_record = loaders.get(sid, Record)(sid, data)
            if new_record:
                last_record.next = new_record
                last_record = new_record
                if sid not in urecord:
                    urecord[sid] = new_record
            #if new_record.__class__==Record:
            #    print '%04x(%08x): %s'%(sid,ofs,poi.utils.DEBUG_RECORDS.get(sid))
            ofs += len(data)
        self.urecord = urecord
Exemple #2
0
    def read(self, filename, content):
        if filename:
            filehandle = open(filename)
            cfb = CFBReader(filehandle)
            self.streams = cfb.dirtree
            del cfb

            # Normally, the Workbook will be in a POIFS Stream
            # called "Workbook". However, some XLS generators use "WORKBOOK"
            workbook = None
            for wb in ('Book', 'BOOK', 'WORKBOOK', 'Workbook'):
                if (wb, ) in self.streams:
                    workbook = self.streams.pop((wb, ))
            if not workbook:
                raise IOError('The file does not contain a Workbook-entry')
            content = workbook.data

        loaders = {
            0x0018: self.names.read,
            0x0031: self.fonts.read,
            0x0059: self.read_xct,
            0x005A: self.read_crn,
            0x0085: self.sheets.read,
            0x00e0: self.extendedformats.read,
            0x00fc: self.staticstrings.read,
            0x00ff: Record.ignore,
            0x01ae: self.supbooks.read,
            0x041E: self.numberformats.read,
        }

        urecord = {}
        self.records = Record(0, 0)
        last_record = self.records
        ofs = 0
        for sid, data in record_stream(content):
            if sid == 0x000A:  #EOF
                break
            new_record = loaders.get(sid, Record)(sid, data)
            if new_record:
                last_record.next = new_record
                last_record = new_record
                if sid not in urecord:
                    urecord[sid] = new_record
            #if new_record.__class__==Record:
            #    print '%04x(%08x): %s'%(sid,ofs,poi.utils.DEBUG_RECORDS.get(sid))
            ofs += len(data)
        self.urecord = urecord
        self.last_record = last_record
        pos = len(content)
        for sheet in sorted(self.sheets,
                            key=lambda s: s.position_of_BOF,
                            reverse=True):
            sheet.sheetdata = content[sheet.position_of_BOF:pos]
            pos = sheet.position_of_BOF
        self.numberformats_map = dict(std_format_strings)
        self.numberformats_map.update(
            dict([(nf.index, nf.format) for nf in self.numberformats]))
Exemple #3
0
    def read(self, filename, content):
        if filename:
            filehandle=open(filename)
            cfb = CFBReader(filehandle)
            self.streams = cfb.dirtree
            del cfb

            # Normally, the Workbook will be in a POIFS Stream
            # called "Workbook". However, some XLS generators use "WORKBOOK"
            workbook=None
            for wb in ('Book','BOOK','WORKBOOK','Workbook'):
                if (wb,) in self.streams:
                    workbook = self.streams.pop((wb,))
            if not workbook:
                raise IOError('The file does not contain a Workbook-entry')
            content=workbook.data

        loaders={
            0x0018: self.names.read,
            0x0031: self.fonts.read,
            0x0059: self.read_xct,
            0x005A: self.read_crn,
            0x0085: self.sheets.read,
            0x00e0: self.extendedformats.read,
            0x00fc: self.staticstrings.read,
            0x00ff: Record.ignore,
            0x01ae: self.supbooks.read,         
            0x041E: self.numberformats.read,
        }

        urecord={}
        self.records=Record(0,0)
        last_record=self.records
        ofs=0        
        for sid, data in record_stream(content):
            if sid==0x000A: #EOF
                break
            new_record=loaders.get(sid,Record)(sid,data)
            if new_record:
                last_record.next=new_record
                last_record=new_record
                if sid not in urecord:
                    urecord[sid]=new_record
            #if new_record.__class__==Record:
            #    print '%04x(%08x): %s'%(sid,ofs,poi.utils.DEBUG_RECORDS.get(sid))
            ofs+=len(data)
        self.urecord=urecord
        self.last_record=last_record
        pos=len(content)
        for sheet in sorted(self.sheets,key=lambda s:s.position_of_BOF,reverse=True):
            sheet.sheetdata=content[sheet.position_of_BOF:pos]
            pos=sheet.position_of_BOF
        self.numberformats_map=dict(std_format_strings)
        self.numberformats_map.update(dict([(nf.index,nf.format) for nf in self.numberformats]))
Exemple #4
0
    def __init__(self, parent, data=NEW_WORKSHEET, ofs=0):
        self.columninfo=RecordList(ColumnInfo)
        self.parent=parent
        loaders={
            0x0006: self.add_cell, # Formula
            0x007d: self.columninfo.read,
            0x00bd: self.add_mulcell, # MulRKRecord
            0x00be: self.add_mulcell, # MulBlankRecord
            0x00fd: self.add_cell, #LabelSSTRecord
            0x0200: self.add_dimensions,
            0x0201: self.add_cell, #BlankRecord
            0x0203: self.add_cell, #NumberRecord
            0x0207: self.read_string, # StringRecord
            0x0208: self.add_row,
            0x027e: self.add_cell, #RKRecord
            
            0x00d7: Record.ignore, # DBCell
        }

        urecord={}
        self.rows={}
        self.records=Record(0,0)
        last_record=self.records        
        for sid, data in record_stream(data):
            if sid==0x000A: #EOF
                break
            new_record=loaders.get(sid,Record)(sid,data)
            if new_record:
                last_record.next=new_record
                last_record=new_record
                if sid not in urecord:
                    urecord[sid]=new_record
            #if new_record.__class__==Record:
            #    print '%04x(%08x): %s'%(sid,ofs,poi.utils.DEBUG_RECORDS.get(sid))
            ofs+=len(data)
        self.urecord=urecord