[Libreoffice-commits] .: src/xlsrecord.py src/xlsstream.py

Kohei Yoshida kohei at kemper.freedesktop.org
Fri Dec 14 18:37:17 PST 2012


 src/xlsrecord.py |   87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/xlsstream.py |    5 +--
 2 files changed, 90 insertions(+), 2 deletions(-)

New commits:
commit e1b72c670823b0eb998427bace6570fada423ff2
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Fri Dec 14 21:38:13 2012 -0500

    Handler for SxRule record.
    
    This record is a part of PivotTable records.

diff --git a/src/xlsrecord.py b/src/xlsrecord.py
index b81af59..90cb699 100644
--- a/src/xlsrecord.py
+++ b/src/xlsrecord.py
@@ -3301,6 +3301,93 @@ class SXStreamID(BaseRecordHandler):
         self.strmData.appendPivotCacheId(strmId)
         self.appendLine("pivot cache stream ID in SX DB storage: %4.4X"%strmId)
 
+class SxRule(BaseRecordHandler):
+
+    viewAreaTypes = [
+        "does not refer to any area.",
+        "refers to one or more pivot fields specified by SxFilt records that follow this record.",
+        "refers to cells displaying values of data items specified by SxFilt records that follow this record.",
+        "refers to the entire PivotTable view.",
+        "refers to the cells at the top-left of the PivotTable view, or at the top-right for a right-to-left sheet. For more information about this area, see Location and Body.",
+        "refers to a cell displaying a pivot field caption. The pivot field is specified by isxvd.",
+        "refers to the cells at the top-right of the PivotTable view, or at the top-left for a right-to-left sheet. For more information about this area, see Location and Body."
+    ]
+
+    def __parseBytes (self):
+        self.iDim = self.readUnsignedInt(1)
+        self.isvxd = self.readUnsignedInt(1)
+
+        flag = self.readUnsignedInt(2)
+        self.sxaxisRw   = (flag & 0x0001) != 0
+        self.sxaxisCol  = (flag & 0x0002) != 0
+        self.sxaxisPage = (flag & 0x0004) != 0
+        self.sxaxisData = (flag & 0x0008) != 0
+        self.sxrType    = (flag & 0x00F0) / (2**4)
+
+        flag /= 2**8 # shift 8 bits
+
+        self.fPart        = (flag & 0x01) != 0
+        self.fDataOnly    = (flag & 0x02) != 0
+        self.fLabelOnly   = (flag & 0x04) != 0
+        self.fGrandRw     = (flag & 0x08) != 0
+        self.fGrandCol    = (flag & 0x10) != 0
+        self.fGrandRwSav  = (flag & 0x20) != 0
+        self.fCacheBased  = (flag & 0x40) != 0
+        self.fGrandColSav = (flag & 0x80) != 0
+
+        self.readBytes(2) # 2 bytes reserved
+
+        self.csxFilt = self.readUnsignedInt(2)
+
+        if not self.fPart:
+            return
+
+        # following should exist only when fPart is true
+        self.irwFirst  = self.readUnsignedInt(1)
+        self.irwLast   = self.readUnsignedInt(1)
+        self.icolFirst = self.readUnsignedInt(1)
+        self.icolLast  = self.readUnsignedInt(1)
+
+    def parseBytes (self):
+        self.__parseBytes()
+        self.appendLineInt("pivot field position", self.iDim)
+        if self.isvxd <= 0xFD:
+            if self.fCacheBased:
+                self.appendLineInt("cache field index", self.isvxd)
+            else:
+                self.appendLineInt("pivot field index", self.isvxd)
+        elif self.isvxd == 0xFE:
+            self.appendLine("this record refers to data field")
+        elif self.isvxd == 0xFF:
+            if self.fCacheBased:
+                self.appendLine("cache fields specified by SxFilt records.")
+            else:
+                self.appendLine("pivot fields specified by SxFilt records.")
+
+        self.appendLineBoolean("references row axis", self.sxaxisRw)
+        self.appendLineBoolean("references column axis", self.sxaxisCol)
+        self.appendLineBoolean("references page axis", self.sxaxisPage)
+        self.appendLineBoolean("references value axis", self.sxaxisData)
+        self.appendMultiLine("view area type: " + globals.getValueOrUnknown(SxRule.viewAreaTypes, self.sxrType))
+        self.appendLineBoolean("this rule includes data cells only", self.fDataOnly)
+        self.appendLineBoolean("this rule includes labels only", self.fDataOnly)
+        self.appendLineBoolean("this rule includes grand total row", self.fGrandRw)
+        self.appendLineBoolean("this rule includes grand total column", self.fGrandCol)
+        self.appendLineBoolean("this rule previosly included grand total row", self.fGrandRwSav)
+        self.appendLineBoolean("this rule previosly included grand total column", self.fGrandColSav)
+
+        self.appendLineInt("number of SxFilt records", self.csxFilt)
+
+        if not self.fPart:
+            return
+
+        # following should exist only when fPart is true
+        self.appendLineInt("offset to first row", self.irwFirst)
+        self.appendLineInt("offset to last row", self.irwLast)
+        self.appendLineInt("offset to first column", self.icolFirst)
+        self.appendLineInt("offset to last column", self.icolLast)
+
+
 
 class SXView(BaseRecordHandler):
 
diff --git a/src/xlsstream.py b/src/xlsstream.py
index 322582d..d47e121 100644
--- a/src/xlsstream.py
+++ b/src/xlsstream.py
@@ -168,10 +168,11 @@ recData = {
     0x00EC: ["MSODRAWING", "Microsoft Office Drawing", xlsrecord.MSODrawing],
     0x00ED: ["MSODRAWINGSELECTION", "Microsoft Office Drawing Selection", xlsrecord.MSODrawingSelection],
     0x00EF: ["PHONETIC", "Asian Phonetic Settings", xlsrecord.PhoneticInfo],
-    0x00F0: ["SXRULE", "PivotTable Rule Data"],
+    0x00F0: ["SXRULE", "PivotTable Rule Data", xlsrecord.SxRule],
     0x00F1: ["SXEX", "PivotTable View Extended Information", xlsrecord.SXEx],
     0x00F2: ["SXFILT", "PivotTable Rule Filter"],
-    0x00F4: ["SxDXF", "PivotTable Differential Formatting", xlsrecord.SxDXF],
+    0x00F4: ["SXDXF", "PivotTable Differential Formatting", xlsrecord.SxDXF],
+    0x00F5: ["SXITM", "PivotTable Referenced Items"],
     0x00F6: ["SXNAME", "PivotTable Name"],
     0x00F7: ["SXSELECT", "PivotTable Selection Information"],
     0x00F8: ["SXPAIR", "PivotTable Name Pair"],


More information about the Libreoffice-commits mailing list