Difference between revisions of "Python/PrintPagesRanges"
From Apache OpenOffice Wiki
< Python
(→Clear print ranges =) |
(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).
Contents
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