Difference between revisions of "Python/PrintPagesRanges"

From Apache OpenOffice Wiki
Jump to: navigation, search
([Calc, Python] Print selected sheets and ranges)
(Add steps and some extra documentation)
Line 1: Line 1:
 
{{DISPLAYTITLE:Printing selected sheets and ranges}}
 
{{DISPLAYTITLE:Printing selected sheets and ranges}}
This script was published by Villeroy at the [http://forum.openoffice.org/en/forum/viewtopic.php?f=21&t=62054 Code Snippets Forum]."
+
This script was published by Villeroy at the [http://forum.openoffice.org/en/forum/viewtopic.php?f=21&t=62054 Code Snippets Forum].
 +
;Villeroy quote:
 +
:''The attached Python code provides 2 routines. One prints the current selection of (multiple) cell range(s), the other one prints the used ranges of the selected sheet(s).''
  
 
== Original code ==
 
== Original code ==
Line 14: Line 16:
 
     return oRg.getRangeAddress()
 
     return oRg.getRangeAddress()
  
def clearPrintAreas(doc):
+
def clearPrintAreas(doc):   '''remove all print areas from a Calc document'''   esh = doc.Sheets.createEnumeration()   while esh.hasMoreElements():       sh = esh.nextElement()       sh.setPrintAreas(tuple())
    '''remove all print areas from a Calc document'''
+
 
    esh = doc.Sheets.createEnumeration()
 
    while esh.hasMoreElements():
 
        sh = esh.nextElement()
 
        sh.setPrintAreas(tuple())
 
   
 
 
def getPrintAreasDict(doc):
 
def getPrintAreasDict(doc):
 
     '''return a dict of sheet indices with print areas'''
 
     '''return a dict of sheet indices with print areas'''
Line 99: Line 96:
  
 
== Process of the script ==
 
== Process of the script ==
 +
The script perform the following tasks:
 +
# Loop through the sheets collection and load the print ranges them in a variable.
 +
# Remove them
 +
# Change the selected ranges into print ranges
 +
# Store the ranges into a temporary PDF
 +
# Clear the print ranges
 +
# Restore the original print ranges
 +
 +
== Load print ranges ==
 +
 +
<source lang="Python">
 +
def getUsedAddress(oSheet):
 +
    '''com.sun.star.table.CellRangeAddress of a sheet's used range'''
 +
    oRg = oSheet.createCursor()
 +
    oRg.gotoStartOfUsedArea(False)
 +
    oRg.gotoEndOfUsedArea(True)
 +
    return oRg.getRangeAddress()
 +
</source>
 +
 +
== Clear print ranges ===
 +
 +
<source lang="Python>
 +
def clearPrintAreas(doc):    '''remove all print areas from a Calc document'''    esh = doc.Sheets.createEnumeration()    while esh.hasMoreElements():        sh = esh.nextElement()        sh.setPrintAreas(tuple())</source>
 +
 +
== Create print ranges ==
 +
 +
<source lang="Python>
 +
def getPrintAreasDict(doc):
 +
    '''return a dict of sheet indices with print areas'''
 +
    d = {}
 +
    esh = doc.Sheets.createEnumeration()
 +
    while esh.hasMoreElements():
 +
        sh = esh.nextElement()
 +
        n = sh.RangeAddress.Sheet
 +
        d[n]= sh.getPrintAreas()
 +
    return d
 +
 +
def setPrintAreasByDict(doc, d, bWholeSheet):
 +
    for k,v in d.items():
 +
        sh = doc.Sheets.getByIndex(k)
 +
        if bWholeSheet:
 +
            v = (getUsedAddress(sh),)
 +
        sh.setPrintAreas(v)</source>
 +
 +
== Print as PDF ==
 +
 +
<source lang="Python>
 +
def getTmpURL():
 +
    import unohelper, os
 +
    f = os.tmpnam() +'.pdf'
 +
    return unohelper.systemPathToFileUrl(f)</source>
 +
 +
== Clear the ranges ==
 +
 +
<source lang="Python>
 +
def getDictFromAddresses(tpla):
 +
    '''Split tuple of addresses into dict of sheet indices.'''
 +
    d = {}
 +
    for i in tpla:
 +
        ish = i.Sheet
 +
        if not d.has_key(ish):
 +
            d[ish] = [i,]
 +
        else:
 +
            d[ish].append(i)
 +
 +
    for k,v in d.items():
 +
        d[k] = tuple(v)
  
 +
    return d</source>
  
 +
== Restore print ranges ==
  
 +
<source lang="Python></source>
 
[[Category:Python]]
 
[[Category:Python]]

Revision as of 22:07, 25 August 2013

This script was published by Villeroy at the Code Snippets Forum.

Villeroy quote
The attached Python code provides 2 routines. One prints the current selection of (multiple) cell range(s), the other one prints the used ranges of the selected sheet(s).

Original code

import uno
from com.sun.star.uno import RuntimeException

def getUsedAddress(oSheet):
    '''com.sun.star.table.CellRangeAddress of a sheet's used range'''
    oRg = oSheet.createCursor()
    oRg.gotoStartOfUsedArea(False)
    oRg.gotoEndOfUsedArea(True)
    return oRg.getRangeAddress()

def clearPrintAreas(doc):    '''remove all print areas from a Calc document'''    esh = doc.Sheets.createEnumeration()    while esh.hasMoreElements():        sh = esh.nextElement()        sh.setPrintAreas(tuple())

def getPrintAreasDict(doc):
    '''return a dict of sheet indices with print areas'''
    d = {}
    esh = doc.Sheets.createEnumeration()
    while esh.hasMoreElements():
        sh = esh.nextElement()
        n = sh.RangeAddress.Sheet
        d[n]= sh.getPrintAreas()
    return d

def setPrintAreasByDict(doc, d, bWholeSheet):
    for k,v in d.items():
        sh = doc.Sheets.getByIndex(k)
        if bWholeSheet:
            v = (getUsedAddress(sh),)
        sh.setPrintAreas(v)

def getTmpURL():
    import unohelper, os
    f = os.tmpnam() +'.pdf'
    return unohelper.systemPathToFileUrl(f)

def getDictFromAddresses(tpla):
    '''Split tuple of addresses into dict of sheet indices.'''
    d = {}
    for i in tpla:
        ish = i.Sheet
        if not d.has_key(ish):
            d[ish] = [i,]
        else:
            d[ish].append(i)

    for k,v in d.items():
        d[k] = tuple(v)

    return d

def printSelectedCells():
    '''Print current selection of (multiple) cell range(s)'''
    printSomething(False)

def printSelectedSheets():
    '''Print used ranges of currently selected sheets'''
    printSomething(True)

def printSomething(bWholeSheet):
    doc = XSCRIPTCONTEXT.getDocument()
    sel = doc.getCurrentSelection()

    # Let's support c.s.s.sheet.SheetCellRanges collection.
    # The intersection of a range with its own address
    # gives a collection having that single range
    if sel.supportsService('com.sun.star.sheet.SheetCellRange'):
        sel = sel.queryIntersection(sel.getRangeAddress())
    elif sel.supportsService('com.sun.star.sheet.SheetCellRanges'):
        a = sel.getRangeAddresses()
    else:
        raise(Exception, 'NO RANGE SELECTION')

    # back up current print areas
    d1 = getPrintAreasDict(doc)
    clearPrintAreas(doc)

    d2 = getDictFromAddresses(a)
    setPrintAreasByDict(doc, d2, bWholeSheet)

    p = uno.createUnoStruct('com.sun.star.beans.PropertyValue')
    p.Name = 'FileName'
    p.Value = getTmpURL()
    doc.com_sun_star_view_XPrintable_print((p,))
    
    clearPrintAreas(doc)
    setPrintAreasByDict(doc, d1, False)

g_exportedScripts = printSelectedCells, printSelectedSheets,

Process of the script

The script perform the following tasks:

  1. Loop through the sheets collection and load the print ranges them in a variable.
  2. Remove them
  3. Change the selected ranges into print ranges
  4. Store the ranges into a temporary PDF
  5. Clear the print ranges
  6. Restore the original print ranges

Load print ranges

def getUsedAddress(oSheet):
    '''com.sun.star.table.CellRangeAddress of a sheet's used range'''
    oRg = oSheet.createCursor()
    oRg.gotoStartOfUsedArea(False)
    oRg.gotoEndOfUsedArea(True)
    return oRg.getRangeAddress()

Clear print ranges =

def clearPrintAreas(doc):    '''remove all print areas from a Calc document'''    esh = doc.Sheets.createEnumeration()    while esh.hasMoreElements():        sh = esh.nextElement()        sh.setPrintAreas(tuple())

Create print ranges

def getPrintAreasDict(doc):
    '''return a dict of sheet indices with print areas'''
    d = {}
    esh = doc.Sheets.createEnumeration()
    while esh.hasMoreElements():
        sh = esh.nextElement()
        n = sh.RangeAddress.Sheet
        d[n]= sh.getPrintAreas()
    return d

def setPrintAreasByDict(doc, d, bWholeSheet):
    for k,v in d.items():
        sh = doc.Sheets.getByIndex(k)
        if bWholeSheet:
            v = (getUsedAddress(sh),)
        sh.setPrintAreas(v)

Print as PDF

def getTmpURL():
    import unohelper, os
    f = os.tmpnam() +'.pdf'
    return unohelper.systemPathToFileUrl(f)

Clear the ranges

def getDictFromAddresses(tpla):
    '''Split tuple of addresses into dict of sheet indices.'''
    d = {}
    for i in tpla:
        ish = i.Sheet
        if not d.has_key(ish):
            d[ish] = [i,]
        else:
            d[ish].append(i)

    for k,v in d.items():
        d[k] = tuple(v)

    return d

Restore print ranges

Personal tools