[python-win32] How to use OpenOffice with win32com - saving andevent handling?

Michel Claveau mc at mclaveau.com
Mon Jan 14 17:30:28 CET 2008


Hi!

I have a class (not finished, but run OK), for drive OOo from PyWin32.
See below.

@+

Michel Claveau

#--------------------------------------------------------------------
# -*- coding: cp1252 -*-

#
# by Michel Claveau Informatique
# http://mclaveau.com
#



import types
import time
import os
from win32com.client import Dispatch


GlobalPVersion='0.913'


class word(object):

    wdReplaceNone=0
    wdReplaceOne=1
    wdReplaceAll=2
    wdFindContinue=1

    #pour close/save :
    wdDoNotSaveChanges=0
    wdSaveChanges=-1

    wdCharacter=1
    wdCell=12
    wdLine=5

    wdAlignLeft=0
    wdAlignCenter=1
    wdAlignRight=2



    def __init__(self, fichier=None, visible=True):
        import win32com.client
        import time,os,types
        self.objServiceManager = 
win32com.client.Dispatch("com.sun.star.ServiceManager")

        #self.propert=self.objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")

        self.w = 
self.objServiceManager.CreateInstance("com.sun.star.frame.Desktop")

        if fichier!=None:
            time.sleep(1)
            self.open(fichier, visible)


    def u1252(self, chu):
        try:
            if type(chu) is unicode:
                return chu.encode('cp1252','replace')
            else:
                return chu
        except:
            return repr(chu)


    def open(self, fichier, visible=True):
        """Ouvre un document word
        """
        self.doc=self.w.loadComponentFromURL("file:///"+fichier, "_blank", 
0, [])
        #self.visible(visible)


    def wnew(self, visible=True):
        """Nouveau document writer
        """
        self.doc=self.w.loadComponentFromURL("private:factory/swriter", 
"_blank", 0, [])
        self.visible(True)


    def close(self):
        """ferme le document, en sauvegardant, sans demander
        """
        #---
        print"close"
        self.w.store()
        self.w.Terminate(1)


    def docclose(self):
        """ferme le document, en sauvegardant, sans demander
        """
        self.doc.Close(True)  #True ?  False ?


    def saveas(self,fichier, typ=0):
        """Appel de 'Enregistrer sous', avec le nom du fichier
        """#---
        self.doc.storeAsURL("file:///"+fichier, [])


    def savepdf(self):

        def createStruct(nom):
            objCoreReflection= 
self.objServiceManager.createInstance("com.sun.star.reflection.CoreReflection")
            classSize = objCoreReflection.forName(nom)
            aStruct=[1,2]
            classSize.createObject(aStruct)
            return aStruct

        par=createStruct("com.sun.star.beans.PropertyValue")
        par.append([])
        par[0].Name = "URL"
        par[0].Value = "file:///C:/let01.odt"

        par=["FilterName", "writer_pdf_Export"]
        self.prop = 
self.objServiceManager.CreateInstance("com.sun.star.beans.PropertyValue")
        self.prop[0].Name = "URL"
        self.prop[0].Value = "file:///C:/let01.odt"
        self.prop[1].Name = "FilterName"
        self.prop[1].Value = "writer_pdf_Export"
        self.doc.storeAsURL("file:///C:/let01.pdf", self.prop)


    def saveas2(self,fichier, typ=0):

        def createStruct(nom):
            objCoreReflection= 
self.objServiceManager.createInstance("com.sun.star.reflection.CoreReflection")
            classSize = objCoreReflection.forName(nom)
            aStruct=[]
            classSize.createObject(aStruct)
            return aStruct

        #args1= 
self.objServiceManager.createInstance("com.sun.star.beans.PropertyValue")
        #args1 = createStruct("com.sun.star.beans.NamedValue")
        #print args1

        print "Titre :",self.doc.getDocumentInfo()

        args1=["file:///c:/titi.rtf"]

        self.doc.storeAsURL("",0,args1)


        """
        #args1= 
self.objServiceManager.createInstance("com.sun.star.beans.PropertyValue")
        #dispatcher = 
self.objServiceManager.createInstance('com.sun.star.frame.DispatchHelper')
        args1=createStruct("com.sun.star.beans.PropertyValue")
        print len(args1)
        prop.Name='Pages'
        prop.Value='3-5'
        args[0]=prop

        args1[0].Name = "URL"
        args1[0].Value = "file:///c:/titi.rtf"
        args1[1].Name = "FilterName"
        args1[1].Value = "Rich Text Format"
        args1[4].Name = "SelectionOnly"
        args1[4].Value = true
        """
        #sel=self.doc.SaveAs("",0,args1)

    def quit(self):
        """Ferme OOoW
        """
        self.w.Terminate()


    def quitSaveChange(self):
        """Ferme OooW, en sauvant les changements
        """
        self.w.store()
        self.w.Terminate()


    def quitCancel(self):
        """Ferme word, SANS sauver les changements
        """
        self.doc.storeAsURL("file:///C:/null__.odt", [])
        self.w.Terminate()
        os.remove("C:/null__.odt")


    def visible(self, par=True):
        """Rend Word visible (True), ou invisible (False) ; True par défaut
        Note : c'est plus rapide en invisible
        """
        """
        if par:
            self.objServiceManager.Visible(True)
        else:
            self.objServiceManager.Visible=False
        """
        win = self.doc.CurrentController.Frame.ContainerWindow
        if par:
            win.Visible = True
        else:
            win.Visible = False


    def hide(self):
        """Cache Word
        """
        win = self.doc.CurrentController.Frame.ContainerWindow
        win.Visible = False


    def show(self):
        """Montre la fenêtre
        """
        win = self.doc.CurrentController.Frame.ContainerWindow
        win.Visible = True


    def wprint(self):
        """Imprime le document
        """
        warg=[]
        self.doc.Print(warg)


    def wprint2(self,printer='PDFCreator'):
        """Imprime le document
        """
        warg=['Name','PDFCreator']
        self.doc.Print(warg)

# prop.Name='Name'
# prop.Value='PDFCreator'
# args[2]=prop


    def preview(self):
        """Pré-visualise le document
        """
        self.doc.PrintPreview()


    def previewclose(self):
        """Ferme la prévisdualisation du document
        """
        self.doc.ClosePrintPreview()


    def text(self, txt):
        """Remplace le texte sélectionné, par le paramètre
        """
        newchaine=txt.replace('\n','\r')
        self.position.Text = newchaine


    def TypeText(self, chaine):
        """ 'Tape' le texte à la position courante
        """
        self.position.TypeText(chaine)


    def chExist(self, chaine):
        """Cherche l'existence d'une chaine dans le document.
        Retourne True ou False, selon le résultat.
        """
        och=self.doc.createSearchDescriptor()
 och.SearchString=chaine
 och.SearchWords = False  #mots entiers seulement ?
 position=self.doc.findFirst(och)
 if position:
     return True
 else:
     return False


    def chSelect(self, chchaine):
        """Sélectionne (recherche) la chaine passée en paramètre
        """
        och=self.doc.createSearchDescriptor()
 och.SearchString=chaine
 och.SearchWords = False  #mots entiers seulement ?
 self.sel=self.doc.findFirst(och)
 if position:
     return True
 else:
     return False


    def macroRun(self, name):
        """Lance la macro-word (VBA) 'name'
        """
        print "Non supporté _ àcf"
        print "Non supporté _ àcf"
        print "Non supporté _ àcf"


    def language(self):
        """Retourne la langue de Writer
        """
        print "Non supporté _ àcf"
        print "Non supporté _ àcf"
        print "Non supporté _ àcf"


    def filterTxt(self):
        """Interne - Convertit une sélection en texte
        """
        ss=self.u1252(self.doc.GetText().String)
 ss=ss.replace(chr(7)+chr(13),'   ')
        ss=ss.replace(chr(13),'\r\n')
 ss=ss.replace(chr(7),' ')
 ss=ss.replace(chr(9),'')
 ss=ss.replace(chr(26),'')
 return ss


    def eSelAll(self):
        """sélectionne, et retourne, tout le document
        """
        sel=self.doc.GetText()
        return self.filterTxt()


    def eSelWord(self, nb=1):
        """étend la sélection aux nb mots à droite, et retourne la sélection
        """
        self.w.Selection.WordRightSel(self.wdWord, nb, self.wdExtend)
        return self.filterTxt()


    def eSelLine(self, nb=1):
        """étend la sélection aux nb lignes en-dessous, et retourne la 
sélection
        """
        args2= self.doc.createInstance("com.sun.star.beans.PropertyValue")
        args2[0].Name= "Count"
        args2[0].Value= 1
        args2[1].Name= "Select"
        args2[1].Value= False

        self.doc.GoDown("", 0, args2)
        return self.filterTxt()


    def eSelEndLine(self):
        """étend la sélection jusqu'à la fin de la ligne, et retourne la 
sélection
        """
        self.w.Selection.EndKey(self.wdLine, self.wdExtend)
        return self.filterTxt()


    def chRemplAll(self, oldchaine, newchaine=''):
        """
        oldchaine = chaine a remplacer / string to replace
        newchaine = chaine de remplacement / string for replace
        """
        orempl=self.doc.createReplaceDescriptor()
        orempl.SearchString=oldchaine
        orempl.ReplaceString=newchaine
        orempl.SearchWords = False  #mots entiers seulement ?
        orempl.SearchCaseSensitive = True    #sensible à la casse ?
        nb = self.doc.replaceAll(orempl)


    def chRemplLstAll(self, lst=[[]]):
        """
        oldchaine = chaine a remplacer / string to replace
        newchaine = chaine de remplacement / string for replace
        """
        nb=0
        for oldchaine, newchaine in lst:
            orempl=self.doc.createReplaceDescriptor()
            orempl.SearchString=oldchaine
            orempl.ReplaceString=newchaine
            orempl.SearchWords = False  #mots entiers seulement ?
            orempl.SearchCaseSensitive = True    #sensible à la casse ?
            nb += self.doc.replaceAll(orempl)


    def chRemplOne(self, oldchaine, newchaine=''):
        """
        oldchaine = chaine a remplacer / string to replace
        newchaine = chaine de remplacement / string for replace
        """
        sel = self.w.Selection
        #sel.ClearFormatting()
        sel.Find.Text = oldchaine
        sel.Find.Forward = True
        newchaine=newchaine.replace('\n','\r')
        sel.Find.Execute( 
oldchaine,False,False,False,False,False,True,self.wdFindContinue,False,newchaine,self.wdReplaceOne)
        self.position=sel


    def chRemplClipboard(self, oldchaine):
        """
        oldchaine = chaine a remplacer / string to replace
        """
        sel = self.w.Selection
        #sel.ClearFormatting()
        sel.Find.Text = oldchaine
        sel.Find.Forward = True

        sel.Find.Execute( 
oldchaine,False,False,False,False,False,True,self.wdFindContinue,False,'XXX',self.wdReplaceOne)
        sel.Paste()
        self.position=sel


    def chRemplGraf(self, oldchaine, fichier):
        """
        oldchaine = chaine a remplacer / string to replace
        """
        sel = self.w.Selection
        #sel.ClearFormatting()
        sel.Find.Text = oldchaine
        sel.Find.Forward = True

        sel.Find.Execute( 
oldchaine,False,False,False,False,False,True,self.wdFindContinue,False,'',self.wdReplaceOne)
        sel.InlineShapes.AddPicture(fichier, False, True)
        self.position=sel


    def TableauInsLigApres(self, oldchaine, nblig=1):
        """
        oldchaine = chaine a remplacer / string to replace
        """
        sel = self.w.Selection
        #sel.ClearFormatting()
        sel.Find.Text = oldchaine
        sel.Find.Forward = True

        sel.Find.Execute( 
oldchaine,False,False,False,False,False,True,self.wdFindContinue,False,'',self.wdReplaceOne)
        sel.InsertRowsBelow(nblig)


    def TableauDelLig(self, oldchaine):
        """
        oldchaine = chaine a remplacer / string to replace
        """
        sel = self.w.Selection
        #sel.ClearFormatting()
        sel.Find.Text = oldchaine
        sel.Find.Forward = True

        sel.Find.Execute( 
oldchaine,False,False,False,False,False,True,self.wdFindContinue,False,'',self.wdReplaceOne)
        sel.Rows.Delete()


    def MoveRight(self, nb=1):
        self.position.MoveRight(self.wdCharacter, nb)


    def MoveLeft(self, nb=1):
        self.position.MoveLeft(self.wdCharacter, nb)


    def TableauMoveRight(self, nb=1):
        sel = self.w.Selection
        sel.MoveRight(self.wdCell, nb)


    def TableauMoveLeft(self, nb=1):
        sel = self.w.Selection
        sel.MoveLeft(self.wdCell, nb)


    def TableauMoveLine(self, nb=1):
        sel = self.w.Selection
        if nb>0:
            sel.MoveDown(self.wdLine, nb)
        else:
            sel.MoveUp(self.wdLine, -nb)


    def TableauCellule(self, lig=1, col=1, txt='', align=0):
        tbl = self.doc.Tables[0]
        cellule = tbl.Cell(lig, col)
        cellule.Range.Text = txt
        cellule.Range.ParagraphFormat.Alignment = align  #0,1,2, left, 
center, right


    def landscape(self):
        """Met le document en mode paysage
        """
        self.wdOrientLandscape=1
        self.wdOrientPortrait=0
        self.w.ActiveDocument.PageSetup.Orientation = self.wdOrientLandscape


    def portrait(self):
        """Met le document en mode portrait
        """
        self.wdOrientLandscape=1
        self.wdOrientPortrait=0
        self.w.ActiveDocument.PageSetup.Orientation = self.wdOrientPortrait


    def changePrinter(self, printerName):
        """Change l'imprimante active de Word
        """
        self.w.ActivePrinter = printerName





if __name__=='__main__':
    pass

    """
    w=word('C:\\LET01.odt')
    w.chRemplAll('.NOM.','Tartempion')
    w.wprint2()
    w.quitCancel()
    """


    """
    contenu=w.eSelAll()
    #w.wprint()
    print w.chExist("Monsieur")
    time.sleep(1)
    w.saveas('C:/tutu.odt')
    w.quit()
    #w.quitCancel()


    #print
    #print contenu

    #copyToClipboard and pasteFromClipboard
    """
#--------------------------------------------------------------------




More information about the python-win32 mailing list