在openoffice.org中使用python宏...
时间:2010-08-12 来源:vnsoft
因為公司降低成本,所有辦公軟件全部使用OpenOffice.org替代原有的MS Office.
從操作介面來看,兩者基本差不多,不過感覺效率上有比較大的差異.
使用OpenOffice.org處理表格明顯會有滯后的情況.
而且原來MS Office中的VBA也無法直接在OpenOffice.org中使用.
但OpenOffice.org支持使用python來進行宏操作,剛好自己也在學習python,
如是就查閱了一些資料,試著使用python宏來處理OpenOffice.
OpenOffice是通過UNO的方式來代替原MS中的OLE操作.
所以針對python的應用,有定義一個專用的Module(UNO).
在編寫的腳本中需要使用如下命令導入.
import uno
在python宏腳本中,有一個對象XSCRIPTCONTEXT是用來表示腳本所以在的OpenOffice環境.
其中還需要使用到uno一些函數,如下是我寫的一個腳本,可以參考其中的作業方法.
並以此為記.
import os import uno import re import datetime import string def aisversion(): Doc = XSCRIPTCONTEXT.getDocument() displayDir = os.path.dirname(Doc.getURL()) ctx = uno.getComponentContext() smgr = ctx.ServiceManager folderPicker = smgr.createInstanceWithContext('com.sun.star.ui.dialogs.FolderPicker', ctx) folderPicker.setDisplayDirectory(displayDir) result = folderPicker.execute() SelectPath = uno.pyuno.fileUrlToSystemPath(folderPicker.getDirectory()) if result: files = os.listdir(SelectPath) else: files = [] sheets = Doc.getSheets() sheet = Doc.getCurrentController().getActiveSheet() cell=0 rows = 3 for i in files: fs = SelectPath+'\\'+i if os.path.isdir(fs.replace('\\','\\\\')): continue filename = i.split('.') if filename[-1].upper() !='SQL': continue xSearchDescr = sheet.createSearchDescriptor() xSearchDescr.SearchString = filename[-2] xSearchDescr.SearchCaseSensitive = False xSearchDescr.SearchWords = True xFound = sheet.findFirst( xSearchDescr ) mark='' if xFound: xCell = xFound.CellAddress firstver = sheet.getCellByPosition(xCell.Column +1,xCell.Row).getFormula() f=open(fs.replace('\\','\\\\')) s = f.readlines() for i in range(0,s.__len__()): s[i] = s[i].replace('\n','\r\n') str = '\n\r'.join(s) f.close() r = re.search('/\*( )*V[0-9]{10,10} ',str) if r: day = datetime.date.today().strftime("%Y%m%d") if firstver.rstrip()==r.group()[-12:].rstrip(): if firstver[1:9]==day: ser=int(firstver.rstrip()[-2:])+1 serstr=ser.__str__().zfill(2) firstver=firstver[:9] firstver=firstver+serstr else: firstver='V'+day+'01' sheet.getCellByPosition(xCell.Column + 1,xCell.Row).setFormula(firstver) fsbak = fs.replace('.sql','.bak') try: os.remove(fsbak.replace('\\','\\\\')) except Exception: None os.rename(fs.replace('\\','\\\\'),fsbak.replace('\\','\\\\')) fw=open(fs.replace('\\','\\\\'),'wb') newstr = re.split('/\*( )*V[0-9]{10,10} ',str) fw.writelines((newstr[0]+'/* '+firstver.encode('ASCII')+' '+newstr[2]).split('\n\r')) fw.close() mark='OK' else: mark='Not Match:'+firstver+'--'+r.group()[-12:] sheet.getCellByPosition(xCell.Column + 3,xCell.Row).setFormula(mark) else: sheet.getCellByPosition(xCell.Column + 3,xCell.Row).setFormula('Not Version NO') else: sheet.getCellByPosition(5,rows).setString(filename[-2].upper()) rows = rows + 1 #sheet.getCellByPosition(xFound.getstart()+3, xFound.getRows()).setString(i)