[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py
msodumper/xlsrecord.py | 42 ++ 1 file changed, 42 insertions(+) New commits: commit cfff9e0d3f73405d7992d6ec825503ea41de7d5a Author: Tamás ZolnaiDate: Wed Aug 30 21:01:36 2017 +0200 XLS dumper: SXCView dump improvements diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py index f87187f..1103e2c 100644 --- a/msodumper/xlsrecord.py +++ b/msodumper/xlsrecord.py @@ -3114,10 +3114,12 @@ class XLUnicodeStringSegmentedSXAddl(object): def __init__ (self, strm): self.cchTotal = strm.readUnsignedInt(4) strm.readBytes(2) # ignored +self.viewName = strm.readXLUnicodeString() def appendLines (self, hdl): if self.cchTotal <= 65535: hdl.appendLineInt("cchTotal", self.cchTotal) +hdl.appendLineString("Referenced pivot table view", self.viewName) class DConName(BaseRecordHandler): @@ -3232,6 +3234,7 @@ class SXAddlInfo(BaseRecordHandler): } def __parseBytes (self): +self.rt = self.readUnsignedInt(2) # ignored self.flags = FrtFlags(self) # ignored self.sxc = self.readUnsignedInt(1) self.sxd = self.readUnsignedInt(1) @@ -3244,10 +3247,32 @@ class SXAddlInfo(BaseRecordHandler): if self.sxd == 0x00: # sxdId self.__parseSxcViewSxdId() +elif self.sxd == 0x19: +# sxdVer12Info +self.__parseSxcViewsxdVer12Info() def __parseSxcViewSxdId (self): self.stName = XLUnicodeStringSegmentedSXAddl(self) +def __parseSxcViewsxdVer12Info (self): +versionflags = self.readUnsignedInt(4) +self.fDefaultCompact = (versionflags & 0x0001) != 0 +self.fDefaultOutline = (versionflags & 0x0002) != 0 +self.fOutlineData = (versionflags & 0x0004) != 0 +self.fCompactData = (versionflags & 0x0008) != 0 +self.fNewDropZones = (versionflags & 0x0010) != 0 +self.fPublished = (versionflags & 0x0020) != 0 +self.fTurnOffImmersive = (versionflags & 0x0040) != 0 +self.fSingleFilterPerField = (versionflags & 0x0080) != 0 +self.fNonDefaultSortInFlist = (versionflags & 0x0100) != 0 +self.fDontUseCustomLists = (versionflags & 0x0400) != 0 +self.fHideDrillIndicators = (versionflags & 0x0010) != 0 +self.fPrintDrillIndicators = (versionflags & 0x0020) != 0 +self.fMemPropsInTips = (versionflags & 0x0040) != 0 +self.fNoPivotTips = (versionflags & 0x0080) != 0 +self.fNoHeaders = (versionflags & 0x8000) != 0 +self.readUnsignedInt(2) # ignored + def parseBytes (self): self.__parseBytes() self.appendLineString("classs name", globals.getValueOrUnknown(SXAddlInfo.SxcClassList, self.sxc)) @@ -3257,6 +3282,23 @@ class SXAddlInfo(BaseRecordHandler): if self.sxd == 0x00: # sxdId self.stName.appendLines(self) +elif self.sxd == 0x19: +# sxdVer12Info +self.appendLineBoolean("fDefaultCompact", self.fDefaultCompact) +self.appendLineBoolean("fDefaultOutline", self.fDefaultOutline) +self.appendLineBoolean("fOutlineData", self.fOutlineData) +self.appendLineBoolean("fCompactData", self.fCompactData) +self.appendLineBoolean("fNewDropZones", self.fNewDropZones) +self.appendLineBoolean("fPublished", self.fPublished) +self.appendLineBoolean("fTurnOffImmersive", self.fTurnOffImmersive) +self.appendLineBoolean("fSingleFilterPerField", self.fSingleFilterPerField) +self.appendLineBoolean("fNonDefaultSortInFlist", self.fNonDefaultSortInFlist) +self.appendLineBoolean("fDontUseCustomLists", self.fDontUseCustomLists) +self.appendLineBoolean("fHideDrillIndicators", self.fHideDrillIndicators) +self.appendLineBoolean("fPrintDrillIndicators", self.fPrintDrillIndicators) +self.appendLineBoolean("fMemPropsInTips", self.fMemPropsInTips) +self.appendLineBoolean("fNoPivotTips", self.fNoPivotTips) +self.appendLineBoolean("fNoHeaders", self.fNoHeaders) class SXDb(BaseRecordHandler): ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py
msodumper/xlsrecord.py |5 - 1 file changed, 4 insertions(+), 1 deletion(-) New commits: commit 9e28ecdd0d41f60f431ff4db9a30920d15da631b Author: Tamás ZolnaiDate: Tue Aug 29 18:54:13 2017 +0200 XLS dumper: add newer excel versions diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py index 5370e83..f87187f 100644 --- a/msodumper/xlsrecord.py +++ b/msodumper/xlsrecord.py @@ -4126,7 +4126,10 @@ class PivotQueryTableEx(BaseRecordHandler): 'Excel 2000', 'Excel XP', 'Excel 2003', -'Excel 2007' +'Excel 2007', +'Excel 2010', +'Excel 2013', +'Excel 2016' ] class TableType: ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py
msodumper/xlsrecord.py |5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) New commits: commit 1523a605f4ea7e8d3ef8e1242a91b19c51e1f9b2 Author: Andras Timar andras.ti...@collabora.com Date: Thu Nov 27 14:50:58 2014 +0100 add build id of Excel 2010 diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py index 8c2a607..5370e83 100644 --- a/msodumper/xlsrecord.py +++ b/msodumper/xlsrecord.py @@ -737,7 +737,8 @@ class BOF(BaseRecordHandler): buildId = { 0x0DBB: 'Excel 97', 0x0EDE: 'Excel 97', -0x2775: 'Excel XP' +0x2775: 'Excel XP', +0x3267: 'Excel 2010' } def getBuildIdName (self, value): @@ -778,7 +779,7 @@ class BOF(BaseRecordHandler): self.betaAny = 0 self.riscAny = 0 self.lowestExcelVer = 0 - + def parseBytes (self): self.__parseBytes() # BIFF version ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py
msodumper/xlsrecord.py | 18 ++ 1 file changed, 18 insertions(+) New commits: commit 4d583770dd9dfb6ee16b9864d97adedad0833292 Author: Kohei Yoshida kohei.yosh...@gmail.com Date: Tue Sep 16 15:30:44 2014 -0400 Bit more on parsing FEATURE11 record. I'll leave the rest for later. diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py index c3f5588..8c2a607 100644 --- a/msodumper/xlsrecord.py +++ b/msodumper/xlsrecord.py @@ -2845,6 +2845,16 @@ class TableFeatureType(object): self.lem = strm.readUnsignedInt(4) # table edit mode self.rgbHashParam = strm.readBytes(16) self.rgbName = strm.readXLUnicodeString() +self.cFieldData = strm.readUnsignedInt(2) +if self.fLoadCSPName: +self.cSPName = strm.readXLUnicodeString() +if self.fLoadEntryId: +self.entryId = strm.readXLUnicodeString() + +# TODO : fieldData +# TODO : idDeleted +# TODO : idChanged +# TODO : cellInvalid def appendLines (self, hdl): hdl.appendLineString(source type, SourceType.toString(self.lt)) @@ -2879,6 +2889,14 @@ class TableFeatureType(object): # TODO : dump more data hdl.appendLineString(table name, self.rgbName) +hdl.appendLineInt(column count, self.cFieldData) + +if self.fLoadCSPName: +hdl.appendLineString(cryptographic service provider name, self.cSPName) +if self.fLoadEntryId: +hdl.appendLineString(unique table identifier, self.entryId) + + class FeatureHeader(BaseRecordHandler): Beginning of a collection of records. ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py msodumper/xlsstream.py
msodumper/xlsrecord.py | 318 ++--- msodumper/xlsstream.py |4 2 files changed, 228 insertions(+), 94 deletions(-) New commits: commit ff0dc534560702f5af16a1a15f368f6c6e083d54 Author: Kohei Yoshida kohei.yosh...@gmail.com Date: Fri Jul 11 18:51:21 2014 -0400 Handle change cell and ins/del rows/columns records in change tracking. The change cell record is a redo of my previous handler code, to get more details. This is still work-in-progress. diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py index 463e783..181a2a8 100644 --- a/msodumper/xlsrecord.py +++ b/msodumper/xlsrecord.py @@ -15,6 +15,32 @@ class RecordError(Exception): pass # --- # record handler classes +class ColRelU(object): + +def __init__ (self, strm): +self.col = strm.readUnsignedInt(2) +self.colRelative = (self.col 0x4000) != 0 +self.rowRelative = (self.col 0x8000) != 0 +self.col = self.col 0x3FFF + + +class RgceLoc(object): + +def __init__ (self, strm): +self.row = strm.readUnsignedInt(2) +self.column = ColRelU(strm) + +def toString (self): +s = '' +if not self.column.colRelative: +s += '$' +s += formula.toColName(self.column.col) +if not self.column.rowRelative: +s += '$' +s += %d%(self.row+1) +return s + + class Ref8(object): def __init__ (self, strm): @@ -58,6 +84,14 @@ class Ref8U(object): self.col1 = strm.readUnsignedInt(2) self.col2 = strm.readUnsignedInt(2) +def toString (self): +rge = formula.CellRange() +rge.firstRow = self.row1 +rge.firstCol = self.col1 +rge.lastRow = self.row2 +rge.lastCol = self.col2 +return rge.toString() + class RKAuxData(object): Store auxiliary data for RK value @@ -4010,100 +4044,200 @@ class SXRng(BaseRecordHandler): # --- # CT - Change Tracking -class CTCellContent(BaseRecordHandler): - -EXC_CHTR_TYPE_MASK = 0x0007 -EXC_CHTR_TYPE_FORMATMASK = 0xFF00 -EXC_CHTR_TYPE_EMPTY = 0x -EXC_CHTR_TYPE_RK = 0x0001 -EXC_CHTR_TYPE_DOUBLE = 0x0002 -EXC_CHTR_TYPE_STRING = 0x0003 -EXC_CHTR_TYPE_BOOL = 0x0004 -EXC_CHTR_TYPE_FORMULA= 0x0005 - -def parseBytes (self): -size = globals.getSignedInt(self.readBytes(4)) -id = globals.getSignedInt(self.readBytes(4)) -opcode = globals.getSignedInt(self.readBytes(2)) -accept = globals.getSignedInt(self.readBytes(2)) -tabCreateId = globals.getSignedInt(self.readBytes(2)) -valueType = globals.getSignedInt(self.readBytes(2)) -self.appendLine(header: (size=%d; index=%d; opcode=0x%2.2X; accept=%d)%(size, id, opcode, accept)) -self.appendLine(sheet creation id: %d%tabCreateId) - -oldType = (valueType/(2*2*2) CTCellContent.EXC_CHTR_TYPE_MASK) -newType = (valueType CTCellContent.EXC_CHTR_TYPE_MASK) -self.appendLine(value type: (old=%4.4Xh; new=%4.4Xh)%(oldType, newType)) -self.readBytes(2) # ignore next 2 bytes. - -row = globals.getSignedInt(self.readBytes(2)) -col = globals.getSignedInt(self.readBytes(2)) -cell = formula.CellAddress(col, row) -self.appendLine(cell position: %s%cell.getName()) - -oldSize = globals.getSignedInt(self.readBytes(2)) -self.readBytes(4) # ignore 4 bytes. - -fmtType = (valueType CTCellContent.EXC_CHTR_TYPE_FORMATMASK) -if fmtType == 0x1100: -self.readBytes(16) -elif fmtType == 0x1300: -self.readBytes(8) - -self.readCell(oldType, old cell type) -self.readCell(newType, new cell type) - -def readCell (self, cellType, cellName): - -cellTypeText = 'unknown' - -if cellType == CTCellContent.EXC_CHTR_TYPE_FORMULA: -cellTypeText, formulaBytes, formulaText = self.readFormula() -self.appendLine(%s: %s%(cellName, cellTypeText)) -self.appendLine(formula bytes: %s%globals.getRawBytes(formulaBytes, True, False)) -self.appendLine(tokens: %s%formulaText) +class RRD(object): + +RevType = { +0x: insert row, # REVTINSRW +0x0001: insert column, # REVTINSCOL +0x0002: delete row, # REVTDELRW +0x0003: delete column, # REVTDELCOL +0x0004: cell move, # REVTMOVE +0x0005: insert sheet,# REVTINSERTSH +0x0007: sort,# REVTSORT +0x0008: cell change, # REVTCHANGECELL +0x0009: rename sheet,# REVTRENSHEET +0x000A: defined name change, # REVTDEFNAME +0x000B:
[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py
msodumper/xlsrecord.py | 95 + 1 file changed, 95 insertions(+) New commits: commit 15cd2bd8ff914a764bf0c6b5f0d39da5b58b2b03 Author: Kohei Yoshida kohei.yosh...@gmail.com Date: Fri Jul 11 20:53:21 2014 -0400 Handle boolean, error, string, and formula values in cell change record. Still for change tracking. diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py index 181a2a8..81c42f1 100644 --- a/msodumper/xlsrecord.py +++ b/msodumper/xlsrecord.py @@ -15,6 +15,46 @@ class RecordError(Exception): pass # --- # record handler classes +class Bes(object): +Boolean or error value + +ErrorValues = { +0x00: #NULL!, +0x07: #DIV/0!, +0x0F: #VALUE!, +0x17: #REF!, +0x1D: #NAME?, +0x24: #NUM!, +0x2A: #N/A, +0x2B: #GETTING_DATA +} + +def __init__ (self, strm): +self.bBoolErr = strm.readUnsignedInt(1) +self.fError = strm.readUnsignedInt(1) != 0 + +def toString (self): +if self.fError: +return (error:%s)%globals.getValueOrUnknown(Bes.ErrorValues,self.bBoolErr,???) +elif self.bBoolErr: +return (boolean:true) +else: +return (boolean:false) + + +class CellParsedFormula(object): + +def __init__ (self, strm): +cce = strm.readUnsignedInt(2) +bytes = strm.readBytes(cce) +parser = formula.FormulaParser(strm.header, bytes) +parser.parse() +self.text = parser.getText() + +def toString (self): +return self.text + + class ColRelU(object): def __init__ (self, strm): @@ -417,6 +457,37 @@ Like parseBytes(), the derived classes must overwrite this method. def readXLUnicodeStringNoCch (self, cch): return self.readUnicodeString(cch) +def readXLUnicodeRichExtendedString (self): +cch = self.readUnsignedInt(2) +flags = self.readUnsignedInt(1) +fHighByte = (flags 0x01) != 0 # double byte string +fExtSt= (flags 0x04) != 0 # phonetic string data +fRichSt = (flags 0x08) != 0 # rich text + +cRun = 0 +if fRichSt: +cRun = self.readUnsignedInt(2) # number of elemetns in rgRun + +cbExtRst = 0 +if fExtSt: +cbExtRst = self.readSignedInt(4) # byte count of ExtRst + +if fHighByte: +rgb = unicode(self.readBytes(2*cch), 'UTF-16LE', errors='replace') +elif globals.params.utf8: +# Compressed Unicode- latin1 +rgb = self.readBytes(cch).decode('cp1252') +else: +# Old behaviour with hex dump +rgb = self.readBytes(cch) + +# optional FormatRun array. Ignore this for now. +self.readBytes(cRun*4) # Each FormatRun is 4-byte long. + +# optional ExtRst. Ignore this for now. +self.readBytes(cbExtRst) +return rgb + def readLongRGB (self): r = self.readUnsignedInt(1) g = self.readUnsignedInt(1) @@ -4164,6 +4235,12 @@ class RRDChgCell(BaseRecordHandler): self.rkOld = decodeRK(self.readUnsignedInt(4)) elif self.vtOld == RRDChgCell.CellType.Xnum: self.numOld = self.readDouble() +elif self.vtOld == RRDChgCell.CellType.XLUnicodeRichExtendedString: +self.stOld = self.readXLUnicodeRichExtendedString() +elif self.vtOld == RRDChgCell.CellType.Bes: +self.besOld = Bes(self) +elif self.vtOld == RRDChgCell.CellType.CellParsedFormula: +self.xpeOld = CellParsedFormula(self) else: # TODO : Handle other value types. return @@ -4174,6 +4251,12 @@ class RRDChgCell(BaseRecordHandler): self.rk = decodeRK(self.readUnsignedInt(4)) elif self.vt == RRDChgCell.CellType.Xnum: self.num = self.readDouble() +elif self.vt == RRDChgCell.CellType.XLUnicodeRichExtendedString: +self.st = self.readXLUnicodeRichExtendedString() +elif self.vt == RRDChgCell.CellType.Bes: +self.bes = Bes(self) +elif self.vt == RRDChgCell.CellType.CellParsedFormula: +self.xpe = CellParsedFormula(self) else: # TODO : Handle other value types. return @@ -4208,6 +4291,12 @@ class RRDChgCell(BaseRecordHandler): self.appendLine(old value: %g%self.rkOld) elif self.vtOld == RRDChgCell.CellType.Xnum: self.appendLine(old value: %g%self.numOld) +elif self.vtOld == RRDChgCell.CellType.XLUnicodeRichExtendedString: +self.appendLineString(old value, self.stOld) +elif self.vtOld == RRDChgCell.CellType.Bes: +self.appendLineString(old value, self.besOld.toString()) +elif self.vtOld == RRDChgCell.CellType.CellParsedFormula: +self.appendLineString(old value,
[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py
msodumper/xlsrecord.py | 14 -- 1 file changed, 4 insertions(+), 10 deletions(-) New commits: commit 74da3c1eb42590856f286091b55ce13dd7c03fc3 Author: Kohei Yoshida kohei.yosh...@gmail.com Date: Fri Jul 11 20:58:24 2014 -0400 Bit of cleanup. diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py index 81c42f1..b41be00 100644 --- a/msodumper/xlsrecord.py +++ b/msodumper/xlsrecord.py @@ -4229,6 +4229,7 @@ class RRDChgCell(BaseRecordHandler): # TODO : Parse DXFN return +# old value if self.vtOld == RRDChgCell.CellType.Blank: pass elif self.vtOld == RRDChgCell.CellType.RKNumber: @@ -4241,10 +4242,8 @@ class RRDChgCell(BaseRecordHandler): self.besOld = Bes(self) elif self.vtOld == RRDChgCell.CellType.CellParsedFormula: self.xpeOld = CellParsedFormula(self) -else: -# TODO : Handle other value types. -return +# new value if self.vt == RRDChgCell.CellType.Blank: pass elif self.vt == RRDChgCell.CellType.RKNumber: @@ -4257,9 +4256,6 @@ class RRDChgCell(BaseRecordHandler): self.bes = Bes(self) elif self.vt == RRDChgCell.CellType.CellParsedFormula: self.xpe = CellParsedFormula(self) -else: -# TODO : Handle other value types. -return def parseBytes (self): self.__parseBytes() @@ -4285,6 +4281,7 @@ class RRDChgCell(BaseRecordHandler): # TODO : Parse DXFN. return +# old value if self.vtOld == RRDChgCell.CellType.Blank: self.appendLine(old value: blank) elif self.vtOld == RRDChgCell.CellType.RKNumber: @@ -4297,9 +4294,8 @@ class RRDChgCell(BaseRecordHandler): self.appendLineString(old value, self.besOld.toString()) elif self.vtOld == RRDChgCell.CellType.CellParsedFormula: self.appendLineString(old value, self.xpeOld.toString()) -else: -return +# new value if self.vt == RRDChgCell.CellType.Blank: self.appendLine(new value: blank) elif self.vt == RRDChgCell.CellType.RKNumber: @@ -4312,8 +4308,6 @@ class RRDChgCell(BaseRecordHandler): self.appendLineString(new value, self.bes.toString()) elif self.vt == RRDChgCell.CellType.CellParsedFormula: self.appendLineString(new value, self.xpe.toString()) -else: -return class RRDInsDel(BaseRecordHandler): ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py
msodumper/xlsrecord.py |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) New commits: commit f16ae8babbffcae3feb61246f416c8a15adecacb Author: Eike Rathke er...@redhat.com Date: Tue Apr 8 11:26:08 2014 +0200 bit 0 is bit 0 They say they use big-endian bit diagrams, but just to confuse you. diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py index 59e748a..463e783 100644 --- a/msodumper/xlsrecord.py +++ b/msodumper/xlsrecord.py @@ -2743,7 +2743,7 @@ class FeatureData(BaseRecordHandler): self.appendLine(A and reserved: 0x%8.8X%Areserved) self.appendLine(wPassword: 0x%8.8X%wPassword) self.appendLine(stTitle: %s%stTitle) -if Areserved 0x8000 == 0x8000: +if Areserved 0x0001 == 0x0001: # SDContainer cbSD = self.readUnsignedInt(4) self.appendLine(cbSD: %d%cbSD) ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py
msodumper/xlsrecord.py |2 ++ 1 file changed, 2 insertions(+) New commits: commit 8471bc70365c4aa03296be6ddafe07e65c6c0327 Author: Eike Rathke er...@redhat.com Date: Mon Mar 24 18:06:10 2014 +0100 dump Areserved and wPassword of FEAT FeatProtection structure diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py index 781d848..59e748a 100644 --- a/msodumper/xlsrecord.py +++ b/msodumper/xlsrecord.py @@ -2740,6 +2740,8 @@ class FeatureData(BaseRecordHandler): Areserved = self.readUnsignedInt(4) wPassword = self.readUnsignedInt(4) stTitle = self.readXLUnicodeString() +self.appendLine(A and reserved: 0x%8.8X%Areserved) +self.appendLine(wPassword: 0x%8.8X%wPassword) self.appendLine(stTitle: %s%stTitle) if Areserved 0x8000 == 0x8000: # SDContainer ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py
msodumper/xlsrecord.py | 25 - 1 file changed, 16 insertions(+), 9 deletions(-) New commits: commit c4192de229ceb549b0a7bc26fa1b1fc38972d83d Author: Eike Rathke er...@redhat.com Date: Tue Mar 18 11:11:57 2014 +0100 partly implemented FEAT FeatProtection structure diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py index b3cbece..1a0f336 100644 --- a/msodumper/xlsrecord.py +++ b/msodumper/xlsrecord.py @@ -2717,17 +2717,24 @@ class FeatureData(BaseRecordHandler): self.appendLine(feature type: %d (%s)%(featureTypeId, featureTypeText)) self.appendLine(size of feature data: %d (%s)%(cbFeatData, cbFeatDataText)) -# http://msdn.microsoft.com/en-us/library/dd911261.aspx -# Documentation isn't very clear on this, for cbFeatData it says must -# be 0 if 'isf' (featureTypeId) is not ISFFEC2 (type 3) but for rgbFeat -# (the variable data field) lists structures for each of the possible -# types. However, so far there was no FeatProtection structure data for -# ISFPROTECTION encountered. - -if featureTypeId == 3 and cbFeatData 0: +if featureTypeId == 2: +# enhanced protection, ISFPROTECTION, FeatProtection structure +Areserved = self.readUnsignedInt(4) +wPassword = self.readUnsignedInt(4) +stTitle = self.readXLUnicodeString() +self.appendLine(stTitle: %s%stTitle) +if Areserved 1 == 1: +# SDContainer +cbSD = self.readUnsignedInt(4) +self.appendLine(cbSD: %d%cbSD) +self.readBytes(cbSD) +elif featureTypeId == 3 and cbFeatData 0: # ignored formula errors, ISFFEC2, FeatFormulaErr2 structure self.readBytes(cbFeatData) -self.appendLine(FeatFormulaErr2 yet not handled) +self.appendLine(FeatFormulaErr2 not handled) +elif featureTypeId == 4: +# smart tag, ISFFACTOID, FeatSmartTag structure +self.appendLine(FeatSmartTag not handled) for ref in refs: self.appendLine(applied to range: (col=%d,row=%d) - (col=%d,row=%d)% ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py msodumper/xlsstream.py
msodumper/xlsrecord.py | 35 +++ msodumper/xlsstream.py |2 +- 2 files changed, 36 insertions(+), 1 deletion(-) New commits: commit 71d45a05919029845fe0a20e36b8bddc9236f427 Author: Eike Rathke er...@redhat.com Date: Tue Mar 18 11:18:30 2014 +0100 implemented MergeCells diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py index 1a0f336..e908067 100644 --- a/msodumper/xlsrecord.py +++ b/msodumper/xlsrecord.py @@ -15,6 +15,24 @@ class RecordError(Exception): pass # --- # record handler classes +class Ref8(object): + +def __init__ (self, strm): +self.row1 = strm.readUnsignedInt(2) +self.row2 = strm.readUnsignedInt(2) +self.col1 = strm.readUnsignedInt(2) +self.col2 = strm.readUnsignedInt(2) + +def toString (self): +string = ((col=%d,row=%d) - (col=%d,row=%d)% +(self.col1, self.row1, self.col2, self.row2)) +if self.col1 == 0 and self.col2 == 0xFF: +string += , entire column +if self.row1 == 0 and self.row2 == 0x: +string += , entire row +return string + + class RefU(object): def __init__ (self, strm): @@ -3533,6 +3551,23 @@ class SXViewSource(BaseRecordHandler): self.appendLine(data source type: %s%srcType) +class MergeCells(BaseRecordHandler): + +def __parseBytes (self): +self.cmcs = self.readUnsignedInt(2) +self.rgref = [] +for i in xrange(0, self.cmcs): +self.rgref.append(Ref8(self)) + +def parseBytes (self): +self.__parseBytes() +self.appendLine(%d merge ranges:%self.cmcs) +i = 0 +for ref in self.rgref: +i += 1 +self.appendLine(%d: %s%(i,ref.toString())) + + class Sxvd(BaseRecordHandler): def __parseBytes (self): diff --git a/msodumper/xlsstream.py b/msodumper/xlsstream.py index 0f514ee..a034a4c 100644 --- a/msodumper/xlsstream.py +++ b/msodumper/xlsstream.py @@ -143,7 +143,7 @@ recData = { 0x00E1: [INTERFACEHDR, Beginning of User Interface Records], 0x00E2: [INTERFACEEND, End of User Interface Records], 0x00E3: [SXVS, PivotCache Source Data Type, xlsrecord.SXViewSource], -0x00E5: [MERGECELLS, Merged cells in the document], +0x00E5: [MERGECELLS, Merged cells in the document, xlsrecord.MergeCells], 0x00EA: [TABIDCONF, Sheet Tab ID of Conflict History], 0x00EB: [MSODRAWINGGROUP, Microsoft Office Drawing Group, xlsrecord.MSODrawingGroup], 0x00EC: [MSODRAWING, Microsoft Office Drawing, xlsrecord.MSODrawing], ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py
msodumper/xlsrecord.py |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) New commits: commit e0c64ff72711d7861362507870076dd4c49fa9b9 Author: Eike Rathke er...@redhat.com Date: Tue Mar 18 23:33:10 2014 +0100 MS-XLS documentation uses big-endian bit diagrams ... so if it says leftmost bit 0 then test for hight bit. diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py index e908067..e56602b 100644 --- a/msodumper/xlsrecord.py +++ b/msodumper/xlsrecord.py @@ -2741,7 +2741,7 @@ class FeatureData(BaseRecordHandler): wPassword = self.readUnsignedInt(4) stTitle = self.readXLUnicodeString() self.appendLine(stTitle: %s%stTitle) -if Areserved 1 == 1: +if Areserved 0x7000 == 0x7000: # SDContainer cbSD = self.readUnsignedInt(4) self.appendLine(cbSD: %d%cbSD) ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py
msodumper/xlsrecord.py |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) New commits: commit f2d5d0c6e156aa1f8a3ebbb59f49f47759d75fdd Author: Eike Rathke er...@redhat.com Date: Tue Mar 18 23:35:27 2014 +0100 ONE bit, geez ... diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py index e56602b..781d848 100644 --- a/msodumper/xlsrecord.py +++ b/msodumper/xlsrecord.py @@ -2741,7 +2741,7 @@ class FeatureData(BaseRecordHandler): wPassword = self.readUnsignedInt(4) stTitle = self.readXLUnicodeString() self.appendLine(stTitle: %s%stTitle) -if Areserved 0x7000 == 0x7000: +if Areserved 0x8000 == 0x8000: # SDContainer cbSD = self.readUnsignedInt(4) self.appendLine(cbSD: %d%cbSD) ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] mso-dumper.git: msodumper/xlsrecord.py msodumper/xlsstream.py
msodumper/xlsrecord.py | 51 - msodumper/xlsstream.py | 21 ++-- 2 files changed, 69 insertions(+), 3 deletions(-) New commits: commit f0e8c8fea614960d28cc2e52fd32d02dbdebd01f Author: Eike Rathke er...@redhat.com Date: Mon Mar 17 23:06:02 2014 +0100 added some record IDs and implemented FeatureData for 0x0868 FEAT FEAT actually is a collection of records of which FEATHDR specifies the common data, for example enhanced protection. FEAT contains sequences of ranges the feature is applied to. Also, FEAT was wrongly named RANGEPROTECTION (probably from the OOo documentation). Added names of IDs in the range 0x086? to 0x088? See http://msdn.microsoft.com/en-us/library/dd945945.aspx http://msdn.microsoft.com/en-us/library/dd907085.aspx http://msdn.microsoft.com/en-us/library/dd911261.aspx diff --git a/msodumper/xlsrecord.py b/msodumper/xlsrecord.py index 9a51fc7..b3cbece 100644 --- a/msodumper/xlsrecord.py +++ b/msodumper/xlsrecord.py @@ -2636,6 +2636,8 @@ class FeatureHeader(BaseRecordHandler): featureTypeText = 'unknown' if featureTypeId == 2: featureTypeText = 'enhanced protection' +elif featureTypeId == 3: +featureTypeText = 'ignored formula errors' elif featureTypeId == 4: featureTypeText = 'smart tag' featureHdr = self.readUnsignedInt(1) # must be 1 @@ -2649,7 +2651,7 @@ class FeatureHeader(BaseRecordHandler): self.appendLine(size of header data: %d (%s)%(sizeHdrData, sizeHdrDataText)) if featureTypeId == 2 and sizeHdrData == -1: -# enhanced protection optionsss +# enhanced protection options flags = self.readUnsignedInt(4) self.appendLine(enhanced protection flag: 0x%8.8X%flags) @@ -2686,6 +2688,53 @@ class FeatureHeader(BaseRecordHandler): return +class FeatureData(BaseRecordHandler): + +def parseBytes (self): +recordType = self.readUnsignedInt(2) +frtFlag = self.readUnsignedInt(2) # currently 0 +self.readBytes(8) # reserved (currently all 0) +featureTypeId = self.readUnsignedInt(2) +featureTypeText = 'unknown' +if featureTypeId == 2: +featureTypeText = 'enhanced protection' +elif featureTypeId == 3: +featureTypeText = 'ignored formula errors' +elif featureTypeId == 4: +featureTypeText = 'smart tag' +self.readBytes(1) # reserved1, must be 0 +self.readBytes(4) # reserved2, must be 0 +cref = self.readUnsignedInt(2) +cbFeatData = self.readUnsignedInt(4) +cbFeatDataText = 'byte size' +self.readBytes(2) # reserved3, must be 0 + +refs = [] +for i in xrange(0, cref): +refs.append(Ref8U(self)) + +self.appendLine(record type: 0x%4.4X (must match the header)%recordType) +self.appendLine(feature type: %d (%s)%(featureTypeId, featureTypeText)) +self.appendLine(size of feature data: %d (%s)%(cbFeatData, cbFeatDataText)) + +# http://msdn.microsoft.com/en-us/library/dd911261.aspx +# Documentation isn't very clear on this, for cbFeatData it says must +# be 0 if 'isf' (featureTypeId) is not ISFFEC2 (type 3) but for rgbFeat +# (the variable data field) lists structures for each of the possible +# types. However, so far there was no FeatProtection structure data for +# ISFPROTECTION encountered. + +if featureTypeId == 3 and cbFeatData 0: +# ignored formula errors, ISFFEC2, FeatFormulaErr2 structure +self.readBytes(cbFeatData) +self.appendLine(FeatFormulaErr2 yet not handled) + +for ref in refs: +self.appendLine(applied to range: (col=%d,row=%d) - (col=%d,row=%d)% +(ref.col1, ref.row1, ref.col2, ref.row2)) + +return + class ShrFmla(BaseRecordHandler): def __parseBytes (self): diff --git a/msodumper/xlsstream.py b/msodumper/xlsstream.py index 945c5a8..0f514ee 100644 --- a/msodumper/xlsstream.py +++ b/msodumper/xlsstream.py @@ -143,6 +143,7 @@ recData = { 0x00E1: [INTERFACEHDR, Beginning of User Interface Records], 0x00E2: [INTERFACEEND, End of User Interface Records], 0x00E3: [SXVS, PivotCache Source Data Type, xlsrecord.SXViewSource], +0x00E5: [MERGECELLS, Merged cells in the document], 0x00EA: [TABIDCONF, Sheet Tab ID of Conflict History], 0x00EB: [MSODRAWINGGROUP, Microsoft Office Drawing Group, xlsrecord.MSODrawingGroup], 0x00EC: [MSODRAWING, Microsoft Office Drawing, xlsrecord.MSODrawing], @@ -215,10 +216,26 @@ recData = { 0x0862: [SHEETLAYOUT, Tab Color below Sheet Name], 0x0863: [BOOKEXT, Extra Book Info], 0x0864: [SXADDL, Pivot Table Additional Info, xlsrecord.SXAddlInfo], -0x0867: [FEATHEADR, Shared Feature Header,