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