使用Python实现对Word的批量操作

Python在平时写写小工具真是方便快捷,Pyhon大法好!

以下所有代码都是找了好多网上的大佬分享的代码按照自己的需求改的。调用的库为Python-docx、win32com、PyPDF2、xlwings(操作excel)。

因为公司的任务要对上千个word文件进行批量操作,手工操作太累了,于是加班加点赶出来了一个自动化脚本,虽然还有很多要优化的地方,但已经可以稳定运行了。

下面记录一下脚本功能。

doc转docx

因为Python-docx库只能对docx文件操作,所以要转格式,直接改后缀不行。

  1. word = wc.Dispatch("Word.Application")

  2. # 不能用相对路径,老老实实用绝对路径

  3. # 需要处理的文件所在文件夹目录

  4. for root, dirs, files in os.walk(rawpath):

  5. for i in files:

  6. # 找出文件中以.doc结尾并且不以~$开头的文件(~$是为了排除临时文件的)

  7. if i.endswith('.doc') and not i.startswith('~$'):

  8. print(i)

  9. doc = word.Documents.Open(root +'\\'+ i)

  10. # # 将文件名与后缀分割

  11. rename = os.path.splitext(i)

  12. # 将文件另存为.docx

  13. doc.SaveAs(root + '\\' +rename[0] + '.docx', 12) # 12表示docx格式

  14. doc.Close()

  15. # time.sleep(1)

  16. word.Quit()

找到特定文件

这个比较简单,只需要循环遍历文件夹,按照队列里的关键字将目标文件添加到队列里即可。

因为转pdf只能是docx,所以要找docx文件,同时过滤~$文件开头的临时文件。

  1. def findfiles():

  2. count = 1

  3. for root, dirs, files in os.walk(path):

  4. for filename in files:

  5. for i in range(len(filenames)):

  6. if (filenames[i] in filename and filename.endswith('docx') and not filename.startswith('~$') :

  7. result.append([count, root + "\\" + filename])

  8. count += 1

  9. break

  10. print(result)

所有字体颜色变为黑色

  1. def change_color(path):

  2. file = Document(path)

  3. for pag in file.paragraphs:

  4. for block in pag.runs:

  5. block.font.color.rgb = RGBColor(0, 0, 0)

  6. for table in file.tables:

  7. for row in table.rows:

  8. for cell in row.cells:

  9. for cell_pag in cell.paragraphs:

  10. for cell_block in cell_pag.runs:

  11. cell_block.font.color.rgb = RGBColor(0, 0, 0)

  12. # 页眉

  13. pag_head = file.sections[0].header

  14. head_pag = pag_head.paragraphs[0]

  15. for run in head_pag.runs:

  16. run.font.color.rgb = RGBColor(0, 0, 0)

  17. # 页脚

  18. pag_foot = file.sections[0].footer

  19. foot_pag = pag_foot.paragraphs[0]

  20. for run in foot_pag.runs:

  21. run.font.color.rgb = RGBColor(0, 0, 0)

  22. file.save(path)

  23. print(path)

  24. print("^"*10 + "颜色切换完成" + "^"*10)

docx转pdf

因为分页操作只能pdf实现。

  1. for i in range(len(result)):

  2. file = result[i][1]

  3. name = file.rsplit('\\', 1)[1]

  4. print(i)

  5. if "关键字" in name: # 跳过不需要截取的关键字文件

  6. outfile = pdf_file_path + name[:-5] + str(i) +'.pdf'

  7. else:

  8. outfile = out_path + name[:-5] + str(i) +'.pdf'

  9. if file.split(".")[-1] == 'docx':

  10. print(file)

  11. convert(file, outfile)

  12. print("^"*10+"PDF转换完成"+"^"*10)

  13. time.sleep(1)

截取特定页面

  1. def split_single_pdf(read_file, start_page, end_page, pdf_file):

  2. # 1. 获取原始pdf文件

  3. fp_read_file = open(read_file, 'rb')

  4. # 2. 将要分割的PDF内容格式化

  5. pdf_input = PdfFileReader(fp_read_file)

  6. # 3. 实例一个 PDF文件编写器

  7. pdf_output = PdfFileWriter()

  8. # 4. 把第一页放到PDF文件编写器

  9. for i in range(start_page, end_page):

  10. pdf_output.addPage(pdf_input.getPage(i))

  11. # 5. PDF文件输出

  12. with open(pdf_file, 'wb') as pdf_out:

  13. pdf_output.write(pdf_out)

  14. print(f'{read_file}分割{start_page}页-{end_page}页完成,保存为{pdf_file}!')

调用打印机打印

  1. def printer_loading(filename):

  2. win32api.ShellExecute(0, "print", filename, '/d:"%s"' % win32print.GetDefaultPrinter(), ".", 0)

对execl特定页面打印

  1. def excel_print(execl_path):

  2. app = xw.App(visible=False, add_book=False)

  3. workbook = app.books.open(execl_path)

  4. worksheet = workbook.sheets['sheet关键字']

  5. area = worksheet.range('A1:D11') # 打印区域

  6. area.api.PrintOut(Copies=1, ActivePrinter='Canon MF260 Series UFRII LT', Collate=True)

  7. workbook.close()

  8. app.quit()

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

  1. 文档获取方式:

  2. 加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

  • 27
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值