新的一年,效率满满~(上)
本文作者:张馨月
文字编辑:孙晓玲
技术总编:张 邯
爬虫俱乐部将于2020年1月5日至11日在湖北武汉举行为期一周的Stata编程技术定制培训,此次采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~详细培训大纲及报名方式,请点击《爬虫俱乐部2020第一期Stata编程训练营开始报名啦!》或点击文末阅读原文呦~
新的一年开始,又到了大家高高立起flag的好时候。为了避免“立flag千篇一律,不打脸万里挑一”的局面再次发生,今天小编来和大家分享Python中一个强大的模块——win32com,来帮助大家实现office自动化办公,元气满满地开始工作~
win32com是MS为自动化提供的操作接口,可以直接调用OFFICE办公软件中的API函数,实现对Word、Excel、PPT文档的操作。今天我们就先来看看这个模块在Word当中的应用。
首先,我们先调用win32com并对Word程序进行初始化设置:
import win32com
from win32com.client import Dispatch
app = Dispatch('Word.Application')
app.Visible = 1 # 后台运行,不显示
app.DisplayAlerts = 0 # 不警告
有时我们处理的文档对纸张大小、页眉页脚、段落格式有特定的要求,这时就可以调用win32com来进行设置:
(1)对页面进行初始设置:
#新建文档
doc = app.Documents.Add()
#设置纸张格式
cm_to_points = 28.35
doc.PageSetup.TopMargin = 3.3*cm_to_points # 上边距3.3厘米
doc.PageSetup.BottomMargin = 3.3*cm_to_points # 下边距3.3厘米
doc.PageSetup.LeftMargin = 2.8*cm_to_points # 左边距2.8厘米
doc.PageSetup.RightMargin = 2.6*cm_to_points # 右边距2.8厘米
#设置页眉页脚
app.ActiveWindow.ActivePane.View.SeekView = 9 #9 表示页眉;10 表示页脚
app.Selection.ParagraphFormat.Alignment = 1
app.Selection.Text = 'page1'
app.ActiveWindow.ActivePane.View.SeekView = 0 # 释放焦点,返回主文档
(2)在Word中插入段落
#创建一个函数,用来输入特定格式的一段文字
def para(text=''):
p = doc.Paragraphs.Add()
p.Range.Font.Name = '宋体'
p.Range.Font.Size = 12
p.Range.ParagraphFormat.Alignment = 0 # 012分别代表居左/中/右
p.Range.ParagraphFormat.LineSpacing = 12 # 行间距
p.Range.InsertBefore(text) # 插入内容
para(text='i love python')
运行上述代码,就能得到一个如图所示的Word文档:
我们的文档里有时会存在一些重复出现的错误信息,这个时候,win32com也可以派上用场~
以一个最为简单的例子为例,我们想把下面这个Word里的“研一”改成“研二”:
可以在Python里进行如下操作:
doc=app.Documents.Open(r"C:\Users\asus\Desktop\example\a.docx")
app.Selection.Find.ClearFormatting()
app.Selection.Find.Replacement.ClearFormatting()
app.Selection.Find.Execute('研一', False, False, False, False, False, True, 1, True,'研二', 2)
doc.Save()
Python的docx库是大家操作Word文件时经常用到的一个库,但它的缺陷是只能处理docx文档,而无法对doc格式的文件进行处理。因此我们可以使用win32com来解决这个问题:
from win32com import client
import os
#定义一个函数,用来把指定格式的文件放入一个列表
def find_file(path, ext, file_list=[]):
dir = os.listdir(path)
for i in dir:
i = os.path.join(path, i) #拼接文件路径, 将多个路径组合后返回
if os.path.isdir(i): #用于判断某一对象是否为目录
find_file(i, ext, file_list)
else:
if ext == os.path.splitext(i)[1]:
file_list.append(i)
return file_list
#定义一个函数,把doc转化为docx
def doc_to_docx(path):
if os.path.splitext(path)[1] == ".doc":
word = client.Dispatch('Word.Application') #打开word。
doc = word.Documents.Open(path) # 打开目标路径下的文件
doc.SaveAs(os.path.splitext(path)[0]+".docx", 16) #转化为docx格式
doc.Close()
word.Quit() #退出
比如说我们的文件夹里有这几个文件:
我们在运行上述函数之后执行下面这几步操作,就可以轻松保存成docx了~
dir_path = r"C:\Users\asus\Desktop\example" #批量转换文件夹
ext = ".doc"
file_list = find_file(dir_path, ext)
for file in file_list:
doc_to_docx(file)
结果如图,是不是很方便呢?
后续,小编会分享win32com对Excel的操作,一起来期待一下吧~
“气功”研究哪家强
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。