以下是我对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)
未完,持续更新..................