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)

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

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硅油

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值