《Python编程案例教程》(高登) 11.Python编程案例-项目十一_第1页
《Python编程案例教程》(高登) 11.Python编程案例-项目十一_第2页
《Python编程案例教程》(高登) 11.Python编程案例-项目十一_第3页
《Python编程案例教程》(高登) 11.Python编程案例-项目十一_第4页
《Python编程案例教程》(高登) 11.Python编程案例-项目十一_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目十一办

化项目十一

近年来,Python在办公自动化领域越来越受欢迎,它可以让办公人员快速上手,批量处理数据,摆脱机械性和重复性的烦琐工作。本项目将介绍使用Python处理Excel和Word数据的方法。办公自动化项目导读项目十一掌握使用xlwings库读写、合并和拆分Excel工作表,以及批量处理数据的方法。掌握使用python-docx库读取和批量替换Word文档数据的方法。掌握使用pywin32库将Word文档批量转换为PDF格式,以及在Word文档中批量替换关键词的方法。能使用Python第三方库实现办公自动化。学习目标思政目标增强实现办公自动化的能力,提高办公效率。项目十一办公自动化了解我国办公自动化的发展,增强科技兴国的理念和认真学习的信念。Content项目六批量生成出货清单批量生成合同批量生成出货清单任

一任务一

工作中经常需要将一个Excel工作表中的数据按一定的规则分类填写到多个相同格式的工作表中,如将出货记录按出货日期分类生成多张出货清单。本任务将带领大家编写Python程序,利用xlwings库操作Excel工作表,批量生成出货清单。批量生成出货清单任务描述知识链接一、xlwings库简介

Python提供了多种库操作Excel,如XlsxWriter、xlrd、xlwt、xlutils、openpyxl和xlwings等,其功能对比如表11-1所示。任务一表11-1

操作Excel库的功能对比功能XlsxWriterxlrdxlwtxlutilsopenpyxlxlwings读×√×√√√写√×√√√√修改×××√√√支持xls格式×√√√×√支持xlsx格式√√√×√√支持批量操作×××××√从表11-1可以看出,xlwings库的功能最齐全,它不仅能读、写和修改两种格式的工作簿(xls和xlsx),还能批量处理多个工作簿。此外,xlwings库还可以与pandas库结合使用,实现更强大的数据输入和分析功能。但使用xlwings库时系统必须安装Excel软件。xlwings库的逻辑结构如图11-1所示。其中,App(即应用)表示Excel程序,Book表示工作簿,Sheet表示工作表,Range表示区域,既可以是一个单元格,也可以是单元格区域。从图11-1可以看出,使用xlwings库操作Excel时,可以同时启动多个App,一个App可以打开多个Book,一个Book可以打开多个Sheet,一个Sheet可以对多个Range进行操作。任务一图11-1xlwings库的逻辑结构任务一xlwings库不是Python内置的标准库,使用之前需要安装。

使用xlwings库操作Excel的基本步骤按照xlwings库的逻辑(App→Book→Sheet→Range)操作即可,最后关闭Book和退出App。1.读取Excel工作表任务一二、读写Excel工作表读取Excel工作表,首先须启动Excel程序,可以用下面代码实现。importxlwings #导入xlwings库app=xlwings.App(visible=False,add_book=False)#启动Excel程序其中,app表示App对象;visible表示Excel程序窗口的可见性,如果为True,则显示Excel程序窗口,否则隐藏Excel程序窗口(即后台运行),缺省时为True;add_book表示启动Excel程序后是否新建工作簿,如果为True,则新建一个工作簿,否则不新建工作簿,缺省时为True。任务一启动Excel程序后,须打开工作簿,可以用下面代码实现。workbook=app.books.open(bookname)其中,workbook表示Book对象,bookname表示要打开的工作簿名,即Excel文件名。打开工作簿后,须打开工作表,可以用下面两种方法实现。worksheet=workbook.sheets[index]worksheet=workbook.sheets[sheetname]其中,worksheet表示Sheet对象;index表示工作表在工作簿中的索引,按工作表打开的顺序从后往前排序,最后一个打开的工作表索引为0;sheetname表示工作表名。打开工作表后,就可以使用range()方法读取指定区域内的数据了。例如,读取单元格A1中的数据,可以用下面代码实现。任务一worksheet.range('A1').value如果想要读取单元格区域的数据,如A1到A10一列的数据、A1到G1一行的数据、A1到G10的10行7列的数据,可以用下面代码实现。#读取A1到A10一列的数据value1=worksheet.range('A1:A10').value#读取A1到G1一行的数据value2=worksheet.range('A1:G1').value#读取A1到G10的10行7列的数据value3=worksheet.range('A1:G10').value其中,value1和value2为一维列表,value2为二维列表。如果不能确定工作表中具体区域的范围,可以使用expand()方法读取指定区域后所有的数据。例如,读取整个工作表的数据,可以用下面代码实现。任务一worksheet.range('A1').expand().value读取数据完成后,应通过Book对象调用close()方法关闭工作簿,以及App对象调用quit()方法退出Excel程序。S还可以直接使用单元格名读取区域的数据,上述读取数据的操作也可以用下面的代码实现。worksheet['A1'].valueworksheet['A1:A10'].valueworksheet['A1:G1'].valueworksheet['A1:G10'].value任务一【例11-1】

读取成绩表。【问题分析】本例读取并输出成绩表中序号为3、序号为1~5和所有学生的成绩,以及所有学生的姓名,“初三(1)班成绩表.xlsx”的内容如图11-2所示。从图11-2可以看出,序号为3的学生成绩的区域为第4行,即A4~J4;序号为1~5的学生成绩的区域为第2行到第6行,即A2~J6;所有学生成绩的区域为第1行后的整个表格,即A2后的所有区域;所有学生姓名的区域为第3列,即C2~C11。图11-2“初三(1)班成绩表.xlsx”的内容任务一【参考代码】importxlwings #导入xlwings库app=xlwings.App(visible=False,add_book=False)#启动Excel程序#打开工作簿book=app.books.open('初三成绩表\\初三(1)班成绩表.xlsx')sheet=book.sheets['sheet1'] #打开工作表print('序号为3的学生成绩:\n',sheet.range('A4:J4').value)print('序号为1~5的学生成绩:\n',sheet.range('A2:J6').value)print('所有学生的成绩:\n',sheet.range('A2').expand().value)print('所有学生的姓名:\n',sheet.range('C2:C11').value)book.close() #关闭工作簿app.quit() #退出Excel程序任务一【运行结果】程序运行结果如图11-3所示。图11-3例11-1程序运行结果2.写入Excel工作表将数据写入Excel工作表很简单,只需将数据赋值给对应的区域,然后通过Book对象调用save()方法保存工作簿即可。例如,将列表[1,2,3,4,5]添加到工作表worksheet中的第一行,可以用下面代码实现。任务一worksheet.range('A1').value=[1,2,3,4,5]workbook.save()此外,还可以用add()方法新建工作簿和工作表写入数据,可以用下面代码实现。workbook=app.books.add() #新建工作簿worksheet=workbook.sheets.add(sheetname) #新建工作表workbook.save(bookname) #命名并保存工作簿任务一

这里需要注意的是,使用add()方法新建工作簿时无法命名,须在使用save()方法保存工作簿时命名。此外,新建工作簿时会默认新建一个“Sheet1”工作表。【例11-2】

新建文件并写入成绩表。【问题分析】首先新建工作簿,并在其中新建工作表“初三(1)班”;然后读取“初三(1)班成绩表.xlsx”的内容,将其写入“初三(1)班”工作表中;接着将新建工作簿命名为“成绩表.xlsx”并保存,最后关闭工作簿和退出Excel程序。【参考分析】任务一importxlwings #导入xlwings库app=xlwings.App(visible=False,add_book=False)#启动Excel程序book1=app.books.add() #新建工作簿book1sheet1=book1.sheets.add('初三(1)班') #新建工作表sheet1#打开工作簿book2book2=app.books.open('初三成绩表\\初三(1)班成绩表.xlsx')sheet2=book2.sheets['sheet1'] #打开工作表sheet2#读取sheet2中的内容,并赋值给value_listvalue_list=sheet2.range('A1').expand().value#将value_list写入sheet1sheet1.range('A1').value=value_listbook1.save('成绩表.xlsx') #命名并保存book1book1.close() #关闭book1book2.close() #关闭book2app.quit()

#退出Excel程序任务一【运行结果】运行程序,将会在当前文件夹中生成“成绩表.xlsx”文件,其内容如图11-4所示。图11-4“成绩表.xlsx”文件的内容任务一三、批量处理数据利用Python可以更高效地对多个Excel工作簿进行批量操作,如批量替换单元格数据、批量计算行或列数据的和等。批量处理数据时,可以先将工作簿中的所有数据提取出来进行处理,然后再将结果写入工作表,避免频繁读取,降低效率。【例

11-3】批量计算每个班级的成绩表中每个学生的总成绩,并写入成绩表中。【问题分析】“初三成绩表”文件夹中只包含3个文件,分别为“初三(1)班成绩表.xlsx”“初三(2)班成绩表.xlsx”和“初三(3)班成绩表.xlsx”(内容见图11-2)。想要计算每个工作簿中每个学生总成绩,须首先获取该文件夹中的文件列表;然后遍历文件列表,判断文件扩展名是否不为“.xlsx”或文件名是否以“~$”开头,如果是,则结束本次循环,否则读取该文件中的成绩,返回二维成绩列表,计算每个一维数据的和(即总成绩),添加到列表中;最后将成绩列表写入该文件。任务一因为Excel程序在打开一个工作簿时会生成一个文件名以“~$”开头的临时文件,如果Excel程序非正常退出,该临时文件会在文件夹中保留下来,所以须判断文件名是否以“~$”开头,避免处理此类临时文件。批量处理数据任务一【参考代码】importxlwings #导入xlwings库importos #导入os库app=xlwings.App(visible=False,add_book=False)#启动Excel程序path=os.chdir('初三成绩表') #设置当前工作路径folder=os.listdir(path) #获取当前工作路径下所有文件列表forfileinfolder: #遍历文件列表#如果文件扩展名不为“.xlsx”或文件名以“~$”开头if('.xlsx'notinfile)or(file.startswith('~$')):continue #结束本次循环任务一book=app.books.open(file) #打开工作簿sheet=book.sheets['Sheet1'] #打开工作表sheet.range('K1').value='总分' #在单元格K1写入“总分”#获取单元格A2后所有数据,并返回二维成绩列表score_list=sheet.range('A2').expand().valueforindex,scoreinenumerate(score_list): #遍历二维成绩列表total=sum(score[3:]) #计算总成绩#将总成绩添加到每个学生一维成绩列表中score_list[index].append(total)sheet.range('A2').value=score_list #将二维成绩列表写入工作表book.save() #保存工作簿book.close() #关闭工作簿

app.quit() #退出Excel程序任务一【运行结果】运行程序,“初三成绩表”文件夹中的3个文件都会添加一列,即总分。其中,“初三(1)班成绩表.xlsx”的内容如图11-5所示。图11-5“初三(1)班成绩表.xlsx”添加总分后的内容任务一四、合并多个Excel工作表Python可以将多个工作簿中的数据快速合并为一个工作表。【例

11-4】合并班级成绩表,并按总成绩降序排名。【问题分析】“本例题将“初三成绩表”文件夹中的3个文件“初三(1)班成绩表.xlsx”“初三(2)班成绩表.xlsx”和“初三(3)班成绩表.xlsx”合并,并按总成绩排名保存到新建的“年级排名表.xlsx”的“初三排名表”工作表中。首先获取“初三成绩表”文件夹中的文件列表;接着遍历文件列表,判断文件扩展名是否不为“.xlsx”或文件名是否以“~$”开头,如果是,则结束本次循环,否则读取文件第一行表头header,以及该文件中的成绩,并将返回的二维成绩列表添加到年级成绩列表all_list中;然后对all_list按总成绩进行降序排序,并循环在每个学生成绩中添加年级排名;再新建工作簿和工作表,将header、all_list和序号列表写入新建的工作表;最后保存和关闭工作簿,以及退出Excel程序。任务一【参考代码】importxlwings #导入xlwings库importos #导入os库app=xlwings.App(visible=False,add_book=False)#启动Excel程序path=os.chdir('初三成绩表') #设置当前工作目录folder=os.listdir(path) #获取当前工作目录下所有文件列表all_list=[] #定义年级成绩列表forfileinfolder: #遍历文件列表#如果文件扩展名不为“.xlsx”或文件名以“~$”开头if('.xlsx'notinfile)or(file.startswith('~$')):continue

#结束本次循环book=app.books.open(file)

#打开工作簿booksheet=book.sheets['Sheet1']

#打开工作表sheetheader=sheet.range('A1:K1').value

#获取表头任务一all_list[i].append(i+1)book_new=app.books.add() #新建工作簿book_newsheet_new=book_new.sheets.add('初三排名表')#新建工作表sheet_newheader.append('年级排名') #在表头中添加“年级排名”#将表头写入sheet_newsheet_new.range('A1').value=header#将年级成绩列表写入sheet_newsheet_new.range('A2').value=all_list#生成1~len(all_list)+1的数字列表num_list=list(range(1,len(all_list)+1))#将数字列表作为序号列写入sheet_newsheet_new.range('A2').options(transpose=True).value=num_listbook_new.save('年级排名表.xlsx') #保存book_newbook_new.close() #关闭book_newbook.close() #关闭bookapp.quit() #退出Excel程序任务一【运行结果】运行程序,将会在“初三成绩表”文件夹中创建“年级排名表.xlsx”文件,其内容如图11-6所示。图11-6“年级排名表.xlsx”文件的内容任务一五、拆分Excel工作表Python还可以将一个工作表按一定的规则快速拆分为多个工作表。【例

11-5】拆分年级排名表,按班级保存每个班学生成绩。【问题分析】本例题将“初三成绩表”文件夹中“年级排名表.xlsx”按班级拆分为3个文件,分别为“初三(1)班排名表.xlsx”“初三(2)班排名表.xlsx”和“初三(3)班排名表.xlsx”。首先打开“年级排名表.xlsx”中的“初三排名表”工作表,获取表头header和二维年级成绩列表score_list;接着遍历score_list,根据学号(“202101”开头的为一班学生,“202102”开头的为二班学生,“202103”开头的为三班学生)按班级将学生成绩添加到二维班级成绩列表class_list中;然后循环3次,在循环中新建工作簿和工作表,并将header、class_list中对应的元素和序号列表写入新建的工作表,并命名、保存和关闭新建的工作簿;最后关闭“年级排名表.xlsx”工作簿,以及退出Excel程序。任务一【参考代码】importxlwings #导入xlwings库importos #导入os库app=xlwings.App(visible=False,add_book=False)#启动Excel程序path=os.chdir('初三成绩表') #设置当前工作目录folder=os.listdir(path)

#获取当前工作目录下所有文件列表book=app.books.open('年级排名表.xlsx') #打开工作簿booksheet=book.sheets['初三排名表'] #打开工作表sheetheader=sheet.range('A1:L1').value #获取表头#获取二维年级成绩列表score_listscore_list=sheet.range('A2').expand().valueclass_list=[[],[],[]]

#定义二维班级成绩列表class_list#遍历score_list,根据学号按班级将学生成绩添加到class_list中任务一【参考代码】forscoreinscore_list:num=str(score[1])if'202101'innum:class_list[0].append(score)elif'202102'innum:class_list[1].append(score)elif'202103'innum:class_list[2].append(score)foriinrange(3): #循环3次book_new=app.books.add() #新建工作簿book_new#打开默认新建的工作表sheet_newsheet_new=book_new.sheets['Sheet1']#将表头写入sheet_new任务一【参考代码】sheet_new.range('A1').value=header#将class_list的第i个元素写入sheet_newsheet_new.range('A2').value=class_list[i]num_list=list(range(1,len(class_list[i])+1))#将数据列表作为序号列写入sheet_newsheet_new.range('A2').options(transpose=True).value=num_list#定义新建的工作簿名filename='初三({})班排名表.xlsx'.format(i+1)book_new.save(filename) #命名并保存book_newbook_new.close() #关闭book_newbook.close() #关闭bookapp.quit() #退出Excel程序任务一【运行结果】运行程序,将会在“初三成绩表”文件夹中创建3个文件,分别为“初三(1)班排名表.xlsx”“初三(2)班排名表.xlsx”和“初三(3)班排名表.xlsx”。其中,“初三(1)班排名表.xlsx”的内容如图11-7所示。图11-7“初三(1)班排名表.xlsx”的内容任务实施本任务根据出货清单模板,将水果出货记录按日期分类生成多个水果出货清单。完成本任务,须首先打开“水果出货记录.xlsx”工作簿book中的“Sheet1”工作表sheet,读取出货信息,并保存到列表info_list中,遍历info_list,将信息保存到以出货日期为键,其他信息的列表(包括计算的金额)为值的字典data中;然后打开“水果出货清单.xlsx”工作簿book_day中的“模板”工作表sheet_sample,遍历data的键,使用copy()方法复制sheet_sample并以出货日期命名赋给sheet_new,再循环将data中以出货日期为键的值写入sheet_new相应的区域;最后保存并关闭book_day,关闭book,以及退出Excel程序。批量生成合同任

二任务二

在工作中经常会处理一些主要内容相同,只有部分数据变化的文档,如邀请函、成绩单、合同、通知等。如果可以按照模板批量处理,将会大大减少工作量,提高工作效率。本任务将带领大家编写Python程序,利用python-docx库和pywin32库操作Word文档,批量处理合同。批量生成合同任务描述知识链接

Python提供了两个常用的库操作Word文档,分别为python-docx库和pywin32库。python-docx库不依赖操作系统,可跨平台操作Word文档,但只支持docx格式;pywin32库直接对Word程序进行操作,可以操作不同格式的文档,但只支持Windows系统,且必须安装Word软件。python-docx库处理Word文档的方式是面向对象的,它会把文档中的段落、文本、字体、表格等都看作对象,对对象进行处理就是对Word文档的内容进行处理。下面简单介绍利用python-docx库读取和替换Word文档中内容的方法,有关python-docx库的更多介绍可访问https://python-docx.readthedocs.io/en/latest/。python-docx库对文档中的文本和表格是分开处理的,其逻辑结构如图11-11所示。任务二一、python-docx库python-docx库(1)Document对象表示一个Word文档。(2)paragraph对象表示Word文档中的一个文本段落,可以通过Document.paragraphs(paragraph对象的集合)获取。它的text属性表示段落中的文本内容,可以通过paragraph.text获取。(3)run对象表示具有相同样式的一段连续文本,可以通过paragraph.runs(run对象的集合)获取。它的text属性表示具有相同样式的一段连续文本的内容,可以通过run.text获取。此外,run对象还包含font(字体)、color(颜色)、size(字号)等属性。(4)table对象表示Word文档中的一个表格,可以通过Document.tables(table对象的集合)获取。任务二(5)row对象表示表格中的一行,可以通过table.rows(row对象的集合)获取。(6)column对象表示表格中的一列,可以通过table.columns(column对象的集合)获取。(7)cell对象表示行或列的一个单元格,可以通过row.cells或column.cells(cell对象的集合)获取。它的text属性表示单元格的内容,可以通过cell.text获取。。任务二python-docx库不是Python内置的标准库,使用之前需要安装。安装python-docx库时,使用“python-docx”名称,但导入库时则使用“docx”名称。读取Word文档,首先须打开文档,可以用下面代码实现。任务二1.读取Word文档中的内容其中,doc表示Document对象,docname表示Word文档名。fromdocximportDocument #导入docx库中的Document模块doc=Document(docname) #打开Word文档,生成Document对象【例11-6】读取学生成绩通知书。【问题分析】本例读取“学生成绩通知书.docx”中文本和表格的内容,其内容如图11-12所示。首先打开文档,返回Document对象;然后遍历paragraph对象集合,通过paragraph对象的text属性提取每个段落的文本内容并输出;最后依次遍历table对象集合、table对象的row对象集合和row对象的cell对象集合,通过cell对象的text属性提取表格中每个单元格的内容并输出。任务二图11-12“学生成绩通知书.docx”的内容任务二【参考代码】fromdocximportDocument #导入docx库中的Document模块doc=Document('初三成绩通知书\\学生成绩通知书.docx') #打开文档forparaindoc.paragraphs: #遍历所有段落print(para.text) #输出每个段落的文本fortableindoc.tables: #遍历所有表格forrowintable.rows: #遍历每个表格中的所有行forcellinrow.cells:

#遍历每行中的所有单元格print(cell.text,end='')

#输出每个单元格中的内容任务二【运行结果】程序运行结果如图11-13所示。图11-13例11-6程序运行结果读取文档中的内容后,可以根据需求查找和替换文档中的内容,然后保存并生成新的文档。任务二2.批量替换Word文档中的内容【例11-6】根据学生的年级排名表和成绩通知书模板,批量生成每个学生的成绩通知书。【问题分析】本例题将学生成绩通知书模板中的姓名、成绩和排名等内容对应替换为“年级排名表.xlsx”(见图11-6)中的内容。“学生成绩通知书模板.docx”的内容如图11-14所示。首先定义info_update(doc,old_info,new_info)函数查找Word文档中的文本和表格的内容,并使用replace()方法将old_info替换成new_info;接着打开“年级排名表.xlsx”中的“初三排名表”,读取姓名、成绩和排名等内容保存到成绩列表score_list中;然后定义列表replace_info(模板中需替换的内容),并遍历score_list,打开“学生成绩通知书模板.docx”后,循环调用info_update()函数(循环次数为replace_info的长度),循环结束后,以学生姓名定义每个通知书文件名,并使用save()方法将通知书保存到“成绩通知书”文件夹中;最后关闭工作簿,退出Excel程序。任务二图11-14“学生成绩通知书模板.docx”的内容任务二【参考代码】importxlwings #导入xlwings库fromdocximportDocument #导入docx库中的Document模块importos #导入os库#定义函数读取并替换指定的内容definfo_update(doc,old_info,new_info):#替换文本中的内容forparaindoc.paragraphs:

#遍历所有段落forruninpara.runs:#替换每个段落的文本中指定的内容run.text=run.text.replace(old_info,new_info)#替换表格中的内容

任务二fortableindoc.tables: #遍历所有表格forrowintable.rows: #遍历每个表格中的所有行forcellinrow.cells: #遍历每行中的所有单元格forparaincell.paragraphs:para.text=para.text.replace(old_info,new_info)app=xlwings.App(visible=False,add_book=False)#启动Excel程序#打开工作簿bookbook=app.books.open('初三成绩通知书\\年级排名表.xlsx')sheet=book.sheets['初三排名表'] #打开工作表sheet#读取sheet中的内容,并赋值给score_listscore_list=sheet.range('C2').expand().value#定义需替换的内容列表replace_info=['【1】','【2】','【3】','【4】','【5】','【6】','【7】','【8】','【9】','【10】']forscoreinscore_list: 任务二

#遍历#打开文档doc=Document('初三成绩通知书\\学生成绩通知书模板.docx')foriinrange(len(replace_info)):

#循环#如果数据为float型,转换为int型ifisinstance(score[i],float):score[i]=int(score[i])#调用info_update()函数info_update(doc,replace_info[i],str(score[i]))path='初三成绩通知书\\成绩通知书' #定义文件夹#判断文件夹是否存在,如果不存在则新建ifnotos.path.exists(path):os.mkdir(path)#定义替换后的文档名fiename=path+'\\{}成绩通知书.docx'.format(score[0])doc.save(fiename) #保存文档book.close() #关闭bookapp.quit()

#退出Excel程序任务二【运行结果】运行程序,如果没有“成绩通知书”文件夹则会新建,在该文件夹中将根据“年级排名表.xlsx”生成所有学生的成绩通知书(内容见图11-12),“成绩通知书”文件夹视图如图11-15所示。图11-15“成绩通知书”文件夹视图使用pywin32库操作Word文档实际是直接操作Word程序,它几乎可以实现Word程序的所有功能。下面简单介绍利用pywin32库将Word文档批量转换为PDF格式,以及在Word文档中批量替换关键词的方法。有关pywin32库的更多介绍可访问/zh-cn/office/vba/api/overview/word。任务二二、pywin32库

pywin32库不是Python内置的标准库,使用之前需要安装。安装pywin32库时,使用“pywin32”名称,但导入库时则使用“win32com”名称。使用pywin32库操作Word文档首先须启动Word程序,可以用下面代码实现。任务二1.将Word文档批量转换为PDF格式导入win32com库中的client模块,并设置别名为win32importwin32com.clientaswin32#启动Word程序word=win32.gencache.EnsureDispatch('Word.Application')word.Visible=False #设置Word程序窗口隐藏其中,word表示Word程序;Visible表示Word程序窗口的可见性,如果为True,则显示Word程序窗口,否则隐藏Word程序窗口(即后台运行),缺省时为True。启动Word程序后,须打开文档,可以用下面代码实现。doc=word.Documents.Open(abspath)其中,doc表示Document对象,abspath表示文档的绝对路径。pywin32库提供了ExportAsFixedFormat()方法用于将Word文档转换为PDF或XPS格式,它包含的参数较多,此处只对必需的两个参数进行说明。OutputFileName参数表示新文件的路径和文件名,必须是绝对路径;ExportFormat参数指定新文件的格式,如果为17,表示将文档转换为PDF格式,如果为18,表示将文档转换为XPS格式。任务二【例11-8】将学生成绩通知书转换为PDF格式。。【问题分析】本例题将例11-7生成的所有学生的成绩通知书转换为PDF格式。首先启动Word程序,并设置为隐藏状态;接着将“成绩通知书”文件夹设置为当前工作目录,并获取该目录下的文件列表;然后遍历文件列表,判断该文件扩展名是否不为“.docx”或文件名是否以“~$”开头,如果是,则结束本次循环,否则获取文件的绝对路径,打开该文件后,使用ExportAsFixedFormat()方法将文件转换为PDF格式,并关闭该文档;最后退出Word程序。任务二【参考代码】#导入win32com库中的client模块,并设置别名为win32importwin32com.clientaswin32importos #导入os库#启动Word程序word=win32.gencache.EnsureDispatch('Word.Application')word.Visible=False #设置Word程序窗口为隐藏状态path=os.chdir('初三成绩通知书\\成绩通知书') #设置当前工作目录folder=os.listdir(path) #获取当前工作目录下所有文件列表forfileinfolder: #遍历#如果文件扩展名不为“.docx”或文件名以“~$”开头任务二#如果文件扩展名不为“.docx”或文件名以“~$”开头if('.docx'notinfile)or(file.startswith('~$')):continue #结束本次循环abspath=os.path.abspath(file) #获取文件的绝对路径doc=word.Documents.Open(abspath) #打开文件#定义PDF文件的文件名new_file=os.path.splitext(abspath)[0]+'.pdf'doc.ExportAsFixedFormat(new_file,17) #将文件转换为PDF格式doc.Close() #关闭文件word.Quit()

#退出Word程序

任务二【运行结果】运行程序,“成绩通知书”文件夹中所有Word格式的学生成绩通知书都将另存为PDF格式,PDF文件视图如图11-16所示。图11-16“成绩通知书”文件夹中PDF文件视图pywin32库可以通过Find对象和Replacement对象替换Word文档中的关键词,还可以对替换的关键词进行格式设置,如加粗、斜体、下划线和颜色等。任务二2.在Word文档中批量替换关键词【例11-9】替换学生成绩通知书模板中的关键词。【问题分析】本例题将“学生成绩通知书模板.docx”中的某些词进行替换,如“上学期”“寒假”“3月”“2月”分别替换为“下学期”“暑假”“9月”“7月”。首先启动Word程序,设置为隐藏状态,并将Word开发接口提供的预设常量集合赋给cs;接着定义替换的关键词字典,并将“初三成绩通知书”文件夹设置为当前工作目录,获取通知书模板文档的绝对路径后,打开文档;然后遍历关键词字典,创建Find对象(Word.Selection.Find),将其Text属性赋值为需要替换的词,再创建Replacement对象(Find.Replacement),将其Text属性赋值为替换的词,并通过其Font对象(Replacement.Font)设置文字格式,设置完成后通过Find对象的Excute()方法执行替换;最后定义新文件名,并另存和关闭文档,以及退出Word程序。任务二pywin32库中constants模块包含Word开发接口提供的预设常量集合,可提供颜色常量,如wdRed(红色)、wdYellow(黄色)、wdBlue(蓝色)等。使用Find对象的Execute()方法执行替换操作时,Replace参数用于设置替换的方式,当设置为wdReplaceAll常量(包含在constants模块中)时,表示一次性全部替换。Font对象通过设置其属性值的真或假来设置文字格式,如Bold(加粗)、Italic(斜体)、Underline(下划线)、ColorIndex(颜色)等。任务二【参考代码】#导入win32com库中的client模块,并设置别名为win32im

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论