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
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]))
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]))
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