Printing selected sheets and ranges
From Apache OpenOffice Wiki
< Python
Revision as of 21:19, 25 August 2013 by Marcoagpinto (talk | contribs) (How to print selected sheets or selected cells only.)
The Print selected sheet script was published by Villeroy at the Code Snippets Forum."
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,