[ooo-build-commit] scratch/mso-dumper

Kohei Yoshida kohei at kemper.freedesktop.org
Mon Jan 4 19:21:26 PST 2010


 scratch/mso-dumper/src/xlsmodel.py  |   27 ++++++++++++++++++++++-----
 scratch/mso-dumper/src/xlsrecord.py |   24 ++++++++++++++++--------
 scratch/mso-dumper/xls-dump.py      |    2 +-
 3 files changed, 39 insertions(+), 14 deletions(-)

New commits:
commit 99b563c15d0a00d1143bc583e2bf29db9d504e9d
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Mon Jan 4 22:18:16 2010 -0500

    [xls-dump] Display used area for each sheet in cXML mode.
    
    Used area is stored in each sheet.  Turns out that this data affects
    how row flags are processed when the sheets are displayed.
    
    * scratch/mso-dumper/src/xlsmodel.py:
    * scratch/mso-dumper/src/xlsrecord.py:
    
    * scratch/mso-dumper/xls-dump.py: added a new dump mode option 'cxml'
      which equals 'canonical-xml', just to save some typing.

diff --git a/scratch/mso-dumper/src/xlsmodel.py b/scratch/mso-dumper/src/xlsmodel.py
index 17fe776..b1c3a33 100644
--- a/scratch/mso-dumper/src/xlsmodel.py
+++ b/scratch/mso-dumper/src/xlsmodel.py
@@ -166,7 +166,15 @@ class Worksheet(SheetBase):
         SheetBase.__init__(self, SheetBase.Type.Worksheet)
         self.__rows = {}
         self.__autoFilterArrows = []
-        self.sheetID = sheetID
+        self.__sheetID = sheetID
+        self.__firstDefinedCell = None
+        self.__firstFreeCell = None
+
+    def setFirstDefinedCell (self, col, row):
+        self.__firstDefinedCell = formula.CellAddress(col, row)
+
+    def setFirstFreeCell (self, col, row):
+        self.__firstFreeCell = formula.CellAddress(col, row)
 
     def setAutoFilterArrowSize (self, arrowSize):
         arrows = []
@@ -202,6 +210,13 @@ class Worksheet(SheetBase):
                 rowNode.appendChild(cellNode)
                 cellNode.setAttr('col', col)
 
+        # table dimension
+        if self.__firstDefinedCell != None:
+            nd.setAttr('first-defined-cell', self.__firstDefinedCell.getName())
+
+        if self.__firstFreeCell != None:
+            nd.setAttr('first-free-cell', self.__firstFreeCell.getName())
+
         # autofilter (if exists)
         self.__appendAutoFilterNode(wb, nd)
 
@@ -213,7 +228,7 @@ class Worksheet(SheetBase):
             return
 
         wbg = wb.getWorkbookGlobal()
-        tokens = wbg.getFilterRange(self.sheetID)
+        tokens = wbg.getFilterRange(self.__sheetID)
         parser = formula.FormulaParser2(None, tokens, False)
         parser.parse()
         tokens = parser.getTokens()
@@ -226,13 +241,14 @@ class Worksheet(SheetBase):
         cellRange = tk.cellRange
 
         elem = baseNode.appendElement('autofilter')
-        elem.setAttr('range', "(col=%d,row=%d)-(col=%d,row=%d)"%(cellRange.firstCol, cellRange.firstRow, cellRange.lastCol, cellRange.lastRow))
+        elem.setAttr('range', cellRange.getName())
 
         for i in xrange(0, len(self.__autoFilterArrows)):
             arrowObj = self.__autoFilterArrows[i]
             if arrowObj == None:
                 arrow = elem.appendElement('arrow')
-                arrow.setAttr('pos', "(col=%d,row=%d)"%(cellRange.firstCol+i,cellRange.firstRow))
+                cell = formula.CellAddress(cellRange.firstCol+i, cellRange.firstRow)
+                arrow.setAttr('pos', cell.getName())
             else:
                 elem.appendChild(arrowObj.createDOM(wb, cellRange))
 
@@ -299,7 +315,8 @@ class AutoFilterArrow(object):
         nd = node.Element('arrow')
         col = self.filterID + filterRange.firstCol
         row = filterRange.firstRow
-        nd.setAttr('pos', "(col=%d,row=%d)"%(col,row))
+        cell = formula.CellAddress(col, row)
+        nd.setAttr('pos', cell.getName())
         nd.setAttr('active', self.isActive)
         eqStr = ''
         if self.equalString1 != None:
diff --git a/scratch/mso-dumper/src/xlsrecord.py b/scratch/mso-dumper/src/xlsrecord.py
index 1dc1d44..34e375d 100644
--- a/scratch/mso-dumper/src/xlsrecord.py
+++ b/scratch/mso-dumper/src/xlsrecord.py
@@ -454,16 +454,24 @@ class BoundSheet(BaseRecordHandler):
 
 class Dimensions(BaseRecordHandler):
 
+    def __parseBytes (self):
+        self.rowMin = self.readUnsignedInt(4)
+        self.rowMax = self.readUnsignedInt(4)
+        self.colMin = self.readUnsignedInt(2)
+        self.colMax = self.readUnsignedInt(2)
+
     def parseBytes (self):
-        rowMic = self.readUnsignedInt(4)
-        rowMac = self.readUnsignedInt(4)
-        colMic = self.readUnsignedInt(2)
-        colMac = self.readUnsignedInt(2)
+        self.__parseBytes()
+        self.appendLine("first defined row: %d"%self.rowMin)
+        self.appendLine("last defined row plus 1: %d"%self.rowMax)
+        self.appendLine("first defined column: %d"%self.colMin)
+        self.appendLine("last defined column plus 1: %d"%self.colMax)
 
-        self.appendLine("first defined row: %d"%rowMic)
-        self.appendLine("last defined row plus 1: %d"%rowMac)
-        self.appendLine("first defined column: %d"%colMic)
-        self.appendLine("last defined column plus 1: %d"%colMac)
+    def fillModel (self, model):
+        self.__parseBytes()
+        sh = model.getCurrentSheet()
+        sh.setFirstDefinedCell(self.colMin, self.rowMin)
+        sh.setFirstFreeCell(self.colMax, self.rowMax)
 
 
 class FilePass(BaseRecordHandler):
diff --git a/scratch/mso-dumper/xls-dump.py b/scratch/mso-dumper/xls-dump.py
index 71c2874..3f2d69a 100755
--- a/scratch/mso-dumper/xls-dump.py
+++ b/scratch/mso-dumper/xls-dump.py
@@ -141,7 +141,7 @@ def main ():
         dumper.dump()
     elif options.dump_mode == 'xml':
         dumper.dumpXML()
-    elif options.dump_mode == 'canonical-xml':
+    elif options.dump_mode == 'canonical-xml' or options.dump_mode == 'cxml':
         dumper.dumpCanonicalXML()
     else:
         error("unknown dump mode: '%s'\n"%options.dump_mode)


More information about the ooo-build-commit mailing list