Difference between revisions of "Python/PrintPagesRanges"
From Apache OpenOffice Wiki
< Python
(Fixed python source tag) |
|||
Line 122: | Line 122: | ||
== Create print ranges == | == Create print ranges == | ||
− | <source lang="Python> | + | <source lang="Python"> |
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 142: | Line 142: | ||
== Print as PDF == | == Print as PDF == | ||
− | <source lang="Python> | + | <source lang="Python"> |
def getTmpURL(): | def getTmpURL(): | ||
import unohelper, os | import unohelper, os | ||
Line 150: | Line 150: | ||
== Clear the ranges == | == Clear the ranges == | ||
− | <source lang="Python> | + | <source lang="Python"> |
def getDictFromAddresses(tpla): | def getDictFromAddresses(tpla): | ||
'''Split tuple of addresses into dict of sheet indices.''' | '''Split tuple of addresses into dict of sheet indices.''' | ||
Line 168: | Line 168: | ||
== Restore print ranges == | == Restore print ranges == | ||
− | <source lang="Python></source> | + | <source lang="Python"></source> |
[[Category:Python]] | [[Category:Python]] |
Revision as of 22:11, 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:
- 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
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