天天看点

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)

未完,持续更新..................