天天看點

Python子產品:win32com大全(I)

     以下是我對win32com的封裝,有寫得不對的希望大家指出,我們共同進步。在一次偶然的機會接觸到這個庫,當時就被它折服,我發現它特别強大,它能處理超大的word文檔,相比于其他庫(docx等)對大的word文檔處理能力有限。我在網上所看到的對win32com的講解不全,有很多方法都沒有提到,特别是對word文檔裡的表格操作,以下代碼每個方法都有解釋。

'''

Created on 2019年8月17日

@author: Fangguiyou

'''

# -*- coding:GB2312 -*-

import os

import win32com

import win32api,time

from win32com.client import Dispatch,constants

from cffi.backend_ctypes import xrange

from Demos.print_desktop import font

from builtins import str

class pyWord:

    def __init__(self):

        '''

        功能:pyWord類:此類中提供操作word的标準接口

        '''

        self.word = win32com.client.DispatchEx('word.Application')

        #self.word.Visible = False #False

        #self.word.DisplayAlerts = False #False

    def open(self,FileName=None,visible=False,displayalert=False):

        '''

        功能:

        @param[in] FileName: 若無檔案名則建立一個新文檔:帶檔案名參數則為打開指定文檔,若指定文檔不存在則退出

        @param[in] visible: 操作文檔時是否可見,True為可見,False為不可見,預設不可見

        @param[in] displayalert: 是否顯示警告資訊,True為顯示,False為不顯示,預設不顯示

        '''

        self.word.Visible = visible #False

        self.word.DisplayAlerts = displayalert #False

        if FileName != None:

            try:

                self.doc = self.word.Documents.Open(FileName)

            except:

                print('file not exsit,please check')

                self.quit()

                os._exit(1)

            else:

                self.range = self.doc.Range(0,0)   #指定檔案指針為檔案頭

                self.levelstack = []

                self.tablenums = len(self.doc.Tables) #擷取文檔中的表格數目

                print('Table numbers',self.tablenums)

        else:

            try:

                self.doc = self.word.Documents.Add()

            except:

                print('Do not creat new File,please check!')

                self.quit()

                os._exit(1)

            else:

                self.range = self.doc.Range(0,0)

                self.levelstack = []

                self.tablenums = 0

    def save(self,FileName=None):

        '''

         功能:儲存檔案

        @param[in] FileName:無參數為直接儲存

        '''

        if FileName:

            self.doc.SaveAs(FileName)

        else:

            self.doc.Save()

    def close(self):

        '''

        功能:關閉檔案并退出

        '''

        self.doc.Close(SaveChanges = True)

        #self.quit()

    def quit(self):

        '''

        功能:退出程序

        '''

        self.word.Quit()

        #del self.word

    def setStyle(self,style):

        '''

        功能:設定樣式

        @param[in]:樣式格式

        '''    

        if style:

            self.range.Select()

            self.range.Style = self.doc.Styles(style)

    def insertTile(self,str,style):

        '''

         功能:添加标題

        @param[in] str: 添加字元串

        @param[in] style: 相應格式,例如“标題 1”,此處格式“标題 1”采用word内置的格式,如格式不符合,請修改word        

        '''

        self.range = self.doc.Range(self.range.End,self.range.End)

        self.range.InsertAfter(str)

        '''

        self.range.Font.name = "宋體"

        self.range.Font.size = 12

        self.range.Font.Bold = 0

        self.range.Font.Italic = 0

        self.range.Font.Underline = 0

        self.range.Font.Shadow = 0

        self.range.Font.Outline = 0

        self.range.Font.Color = 0x000000

        '''

        self.range.Style = style

    def setListFormat(self,listfmt,cont):

        '''

       功能:設定标題格式

        '''

        if listfmt:

            self.range.Select()

            lt = self.word.ListGalleries(2).ListTemplates(1)

            ll = lt.ListLevels(1)

            ll.NumberFormat = listfmt

            self.range.ListFormat.ApplyListTemplate(ListTemplate=lt,ContinuePreviousList=cont)

    def setListLevel(self,level):

        '''

        功能:設定标題等級

        @param[in] level: 标題等級,從1開始

        '''

        if level:

            lsn = len(self.levelstack)

            if level ==lsn:

                self.levelstack[-1] = self.levelstack[-1] + 1

            elif level > lsn:

                for i in xrange(level-lsn):

                    self.levelstack.append(1)

            elif level < lsn:

                for i in xrange(lsn-level):

                    self.levelstack.pop()

                    self.levelstack[-1] = self.levelstack[-1]+1

            self.setListFormat("".join(['%'+str(i)+'.' for i in self.levelstack]), False)

    def writeText(self,str,**keys):

        '''

        功能:寫入文本

        @param[in] str:需寫入的文本

        @param[in] keys:寫入文本的格式:其中包括:

                    font:       字型格式,例如“黑體”

                    size:       字型大小

                    color:      字型顔色,格式:0x000000,排列順序為:藍,綠,紅

                    bold:       是否為粗體

                    italic:     是否為斜體

                    underline:  是否加下劃線

                    shadow:     是否加陰影

                    outline:    字型是否加框

                    align:      對齊格式:left:左對齊   center:居中    right:右對齊   不設定為分散對齊    

        '''

        #insert text

        self.range = self.doc.Range(self.range.End,self.range.End)

        self.range.InsertAfter(str)

        self.range.Font.name = "宋體"

        self.range.Font.size = 12

        self.range.Font.Bold = 0

        self.range.Font.Italic = 0

        self.range.Font.Underline = 0

        self.range.Font.Shadow = 0

        self.range.Font.Outline = 0

        self.range.Font.Color = 0x000000

        #set style

        self.setStyle(keys.get("style"))

        #set list format

        self.setListFormat(keys.get("listfmt"), keys.get("listcont",True))

        #set list level

        self.setListLevel(keys.get("list"))

        #set align

        align =keys.get("align")

        if align:

            ALIGN_DEF = {"left":0,"center":1,"right":2}

            set.range.ParagraphFormat.Alignment = ALIGN_DEF.get(align,0)

        #set font

        font = keys.get("font")

        if font:

            self.range.Font.Name = font

        #set color

        color = keys.get("color")

        if color:

            self.range.Font.Color= color

        #set size

        size = keys.get("size")

        if size:

            self.range.Font.Size = size

        #set bold

        bold = keys.get("bold")

        if bold:

            self.range.Font.Bold = 1

        #set italic

        italic = keys.get("italic")

        if italic:

            self.range.Font.Italic = 1

        #set underline

        underline = keys.get("underline")

        if underline:

            self.range.Font.Underline = 1

        #set shadow

        shadow = keys.get("shadow")

        if shadow:

            self.range.Font.Shadow = 1

        #set outline

        outline = keys.get("outline")

        if outline:

            self.range.Font.Outline = 1

    def writeLine(self,str="",**keys):

        '''

        功能:寫入文本并換行

        @param[in] str: 标題等級

        @param[in] keys: 文字格式

        '''

        self.writeText(str+"\n",**keys)

    def section(self,str,**keys):

        '''

        功能:寫入标題

        @param[in] level: 标題等級

        '''

        lv = keys.get("level",1)

        hd = -1 - lv

        self.writeLine(str,list=lv,style=hd)

    def replaceText(self,oldstr,newstr):

        '''

        功能:替換文本

        @param[in] oldstr: 原文本

        @param[in] oldstr: 原新本

        '''

        self.word.Selection.Find.ClearFormatting()

        self.word.Selection.Find.Replacement.ClearFormatting()

        self.word.Selection.Find.Execute(oldstr,False,False,False,False,False,True,1,True,newstr,2)

    def insertPageHeader(self,str):

        '''

        功能:插入頁眉

        @param[in] str: 頁眉文字     

        '''    

        self.word.ActiveDocument.Sections[0].Headers[0].Range.Find.ClearFormatting()

        self.word.ActiveDocument.Sections[0].Headers[0].Range.Find.Replacement.ClearFormatting()

        self.word.ActiveDocument.Sections[0].Headers[0].Range.InsertAfter(str)

    def ralacePageHeader(self,oldstr,newstr):

        '''

        功能:替換頁眉

        @param[in] oldstr: 原頁眉

        @param[in] oldstr: 新頁眉

        '''

        self.word.ActiveDocument.Sections[0].Headers[0].Range.Find.ClearFormatting()

        self.word.ActiveDocument.Sections[0].Headers[0].Range.Find.Replacement.ClearFormatting()

        self.word.ActiveDocument.Sections[0].Headers[0].Range.Execute(oldstr,False,False,False,False,False,True,1,

         True,newstr,2)

    def insertTable(self,rows,cols):

        '''

        功能:插入一個rows行 cols列的表格

        @param[in] row:行數   cols:列數     

        '''

        self.range = self.doc.Range(self.range.End,self.range.End)

        self.doc.Tables.Add(self.range,rows,cols,DefaultTableBehavior=0)

        self.range = self.doc.Range(self.doc.Tables[self.tablenums].Range.End,self.doc.Tables[self.tablenums].Range.End)

        #self.doc.Tables[self.tablenums].Columns[0].Width = 50

        #self.doc.Tables[self.tablenums].Columns[1].Width = 50

        self.doc.Tables[self.tablenums].Borders.OutsideLineStyle = 1

        self.doc.Tables[self.tablenums].Borders.InsideLineStyle = 1

        #self.doc.Tables[self.tablenums].Style = "網格型"

        row = self.doc.Tables[self.tablenums].Rows.Count

        for index in range(0,row):

            Selection = self.doc.Tables[self.tablenums].Columns[0].Cells[index].Range.Font.Bold = True

        self.range.InsertAfter(" ")

        self.tablenums += 1

    def addRowsAfterTable(self,tab,rows=1):

        '''

        功能:為表格tableN增加rows行

        @param[in] tab: 表格号, 格式:“table1”~“tableN”       

        @param[in] rows: 增加的行數:預設為1行  

        '''

        tmp_range = self.doc.Range(self.range.End,self.range.End)

        for i in range(rows):

            try:

                self.doc.Tables[int(tab.lstrip('table'))-1].Row.Add()

            except IndexError:

                print("Table nuber index out of range,please check!")

        self.range = self.doc.Range(tmp_range.End,tmp_range.End)

    def addRowsInTable(self,tab,rows=1):

        '''

        功能:為表格tableN增加rows行

        @param[in] tab: 表格号, 格式:“table1”~“tableN”       

        @param[in] rows: 增加的行數:預設為1行          

        '''

        tabbcell = self.doc.Tables[int(tab.lstrip('table'))-1].Rows[7].Cells[5]  #這裡的數字表示在第幾行第幾列插入

        tmp_range = self.doc.Range(tabbcell.Range.Start,tabbcell.Range.End)

        for i in range(rows):

            try:

                tmp_range.Rows.Add()

            except IndexError:

                print("Table nuber index out of range,please check!")

        self.range = self.doc.Range(tmp_range.End,tmp_range.End)

    def addColsAfterTable(self,tab,cols=1):

        '''

         功能:為指定表格增加cols列

        @param[in] tab: 表格号, 格式:“table1”~“tableN”       

        @param[in] cols: 增加的列數:預設為1列     

        '''

        tmp_range = self.doc.Range(self.range.End,self.range.End)

        for i in range(cols):

            try:

                self.doc.Tables[int(tab.lstrip('table'))-1].Columns.Add()

            except IndexError:

                print("Table nuber index out of range,please check!")

        self.range = self.doc.Range(tmp_range.End,tmp_range.End)

    def writeTableText(self,tab,rownum,colnum,str):

        '''

        功能:為指定表格的指定單元格寫入文本

        @param[in] tab:表格号, 格式:“table1”~“tableN”

        @param[in] rownum:行号

        @param[in] colnum:列号

        @param[in] str:所要寫入的文本

        '''

        try:

            self.doc.Tables[int(tab.lstrip('table'))-1].Rows[rownum-1].Cells[colnum-1].Range.Text = str

        except IndexError:

            print("index out of table,please check!")

    def setCursorEnd(self):

        self.range = self.doc.Range(self.range.End,self.range.End)

    def mergeCell(self,tabnum,colnum,cellnum):

        MergeTo = self.doc.Tables[int(tabnum.lstrip('table'))-1].Columns[colnum].Cells[cellnum]

        self.doc.Tables[int(tabnum.lstrip('table'))-1].Columns[colnum].Cells[cellnum+1].Merge(MergeTo)

未完,持續更新..................