对于对word、excel输出结果的格式要求较高的工作来说,
win32com这个库操作office真的挺好用。
注意中途不要手动打开你的word excel,不然会报错。
一、导入库
import win32com
from win32com.client import Dispatch, constants
二、打开进程
w = win32com.client.Dispatch('Word.Application')
xlApp=win32com.client.Dispatch('Excel.Application')
# 或者
# w = win32com.client.DispatchEx('Word.Application')
排坑1:
1、有时会出现win32com.client.Dispatch('Word.Application')报错,好像是某个文档进程被占用时,就会报错。
解决方案: DispatchEx(使用启动独立的进程)
三、设置不可见不警告
# 0或者False都可以
w.Visible = 0 ## 不显示
w.DisplayAlerts = 0 ## 不警告
四、打开新的文件
doc = w.Documents.Open( FileName = “blablablabla” ) ## 绝对路径要在引号前加r
# worddoc = w.Documents.Add() # 创建新的文档
#打开excel:
exc = xlApp.Workbooks.Open(r"blabla.xlsx")
排坑2:docx.Documents.Open()报错,可能是因为docx内的模板文件default.docx不在.py当前目录;或者文档无内容。将模板文件default.docx拷贝到.py的同一目录,手动打开模板文件default.docx,再关闭;或者向空文档写入任意内容
五、编辑(word部分)
# 插入文字
myRange = doc.Range(0,0)
myRange.InsertBefore('Hello from Python!')
# 使用样式
wordSel = myRange.Select()
wordSel.Style = constants.wdStyleHeading1
# 正文文字替换
w.Selection.Find.ClearFormatting()
w.Selection.Find.Replacement.ClearFormatting()
w.Selection.Find.Execute(OldStr, False, False, False, False, False, True, 1, True, NewStr, 2)
# 页眉文字替换
w.ActiveDocument.Sections[0].Headers[0].Range.Find.ClearFormatting()
w.ActiveDocument.Sections[0].Headers[0].Range.Find.Replacement.ClearFormatting()
w.ActiveDocument.Sections[0].Headers[0].Range.Find.Execute(OldStr, False, False, False, False, False, True, 1, False, NewStr, 2)
# 表格操作
doc.Tables[0].Rows[0].Cells[0].Range.Text ='123123'
worddoc.Tables[0].Rows.Add() # 增加一行
# 打印
doc.PrintOut()
# 关闭
w.Documents.Close(SaveChanges=0)
del w
w.Quit()
排坑3:使用del w 没有用,使用 w.Quit() 时可以清除进程,但Excel会弹出一个停止工作的窗口。通过下面的办法,查找程序进程ID,直接关闭进程。
def close_excel_by_force(excel):
import win32process
import win32api
import win32con
# Get the window's process id's
hwnd = excel.Hwnd
t, p = win32process.GetWindowThreadProcessId(hwnd)
# Ask window nicely to close
try:
handle = win32api.OpenProcess(win32con.PROCESS_TERMINATE, 0, p)
if handle:
win32api.TerminateProcess(handle, 0)
win32api.CloseHandle(handle)
except:
pass
xlApp = client.Dispatch('Excel.Application')
....
....
close_excel_by_force(xlApp)
del xlApp
六、编辑(excel部分)
打开excel
xlBook_1=xlApp.Workbooks.Open(Filename=path,
UpdateLinks=0,ReadOnly=False,Format=None,
Password=open_password,WriteResPassword=write_password
打开第1个表,把1变为"aaa"就可以打开名为aaa的sheet
xlSheet_1 = xlBook_1.Worksheets(1)
#获取某个Sheet页数据(页数从1开始)
sheet_data=xlBook_1.Worksheets(1).UsedRange.Value
sheet_data[行][列]
#关于sheet名字,新建sheet,取sheet名字列表,重命名
xlBook_1.Worksheets.Add().Name = 'AAA'
sht_names = [sht.Name for sht in xlbook.Worksheets]
xlBook_1.Worksheets(3).Name = 'BBB'
#获取行列范围
row = xlSheet_1.UsedRange.Rows.Count
col = xlSheet_1.UsedRange.Columns.Count
##删除行列
xlSheet_1.Rows(row).Delete()#删除行
xlSheet_1.Columns(row).Delete()#删除列
#预览单元格或者区域的值
print(xlSheet_1.Cells(2,1).Value)
print(xlSheet_1.Range('A1:K1').Value)
## A1:K1可以更换为xlSheet_1.Cells(1,1),xlSheet_1.Cells(1,11),这样可以输入行列数,可灵活使用
##输入数值
xlSheet_1.Cells(4, 2).Value= 5
##获取数据,打入DataFrame
# 获取所有数据
xlSheet1_value = list(xlSheet_1.Range(xlSheet_1.Cells(1,1),xlSheet_1.Cells(row,col)).Value)
# 把value传入Pandas
xlSheet1_df = pd.DataFrame(data=xlSheet1_value[1:],columns=xlSheet1_value[0])
#保存,另存为
xlwb.SaveAs('xxx.xls')
#关闭Excel
xlwb.Close(Flase) # True就是关闭该文件,并保存。不保存就是False
xlApp.Quit()
标签:解决办法,False,##,Cells,excel,xlSheet,win32com,大全
From: https://www.cnblogs.com/dige1993/p/16790485.html