win32com操作大全(含常见错误解决办法)

对于对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

row1 =
xlSheet_1.Range("A1").End(-4121).Row #模拟ctrl + ↓,从此单元格往下读到空行
row2 = xlSheet_1.Range("A100").End(-4162).Row  #模拟ctrl + ↑,从此单元格往上读到空行
 

##删除行列

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()
posted @ 2022-10-14 09:03  Levice  阅读(4831)  评论(0编辑  收藏  举报