批量打印参考文章:https://blog.csdn.net/weixin_44102434/article/details/85006593

代码

相对原作者做了一点修改,因为我这里需要更改打印缩放和页边距

  1. #coding=UTF-8
  2. #-*-conding : gb2312 -*-
  3. import os
  4. import win32com.client
  5. import win32api
  6. import time
  7. dir_name = r'E:\邮件附件\绩效评价' #文件路径
  8. file_name=os.listdir(dir_name) #路径下文件名称
  9. file_dir =[os.path.join(dir_name,x) for x in file_name] #得到文件路径
  10. def centimetersToPoints(num):
  11. return format(num*28.346,'3f')
  12. #厘米转成磅数,1cm = 28.346磅
  13. #保留三位小数,其实这样会有问题,因为去掉了尾数,在excel中显示的就不是原来的厘米
  14. #比如0.76就会变成0.8
  15. b=len(file_dir)
  16. i = 0
  17. for i in range(len(file_dir)):
  18. xlApp = win32com.client.Dispatch('Excel.Application') #打开 EXCEL ,这里不需改动
  19. xlApp.Visible = 0 #不在后台运行
  20. xlApp.EnableEvents = False
  21. xlApp.DisplayAlerts = False #显示弹窗
  22. xlBook = xlApp.Workbooks.Open(file_dir[i])
  23. xlApp.ActiveWorkbook.Sheets(1).PageSetup.Zoom = 60 #设置缩放
  24. xlApp.ActiveWorkbook.Sheets(1).PageSetup.TopMargin = centimetersToPoints(0.76)
  25. xlApp.ActiveWorkbook.Sheets(1).PageSetup.BottomMargin = centimetersToPoints(0.76)
  26. xlApp.ActiveWorkbook.Sheets(1).PageSetup.HeaderMargin = centimetersToPoints(1.91)
  27. xlApp.ActiveWorkbook.Sheets(1).PageSetup.FooterMargin = centimetersToPoints(1.91)
  28. xlApp.ActiveWorkbook.Sheets(1).PageSetup.LeftMargin = centimetersToPoints(1.5)
  29. xlApp.ActiveWorkbook.Sheets(1).PageSetup.RightMargin = centimetersToPoints(0.2)
  30. #上面几行设置打印边距
  31. xlApp.ActiveWorkbook.Sheets(1).PageSetup.Orientation = 1
  32. #0是横向,1是纵向;不能用微软VBA文档的xlLandscape和xlPortrait
  33. xlBook.Save() #保存
  34. ename = xlApp.ActiveWorkbook.name #获取打开工作表名称
  35. #xlBook.PrintOut() #打印
  36. xlApp.quit() #退出
  37. print(ename,"%d%%" %(((i+1.0)/b)*100.0)) #打印出打开工作表名称和当前百分比进度
  38. #time.sleep(2)
  39. time.sleep(2)

打印格式设置参考

https://docs.microsoft.com/zh-cn/office/vba/api/excel.pagesetup.zoom
win32com相当于调用VBA吧?

pywintypes.com_error: (-2147352567

使用win32com处理excel时遇到的错误。问题的出现原因并不是接入的方式或者其他什么原因,而是一个很简单的原因:当前程序没有对目标文件的支配权限。其中一个的原因是,文件读写速度较快,上一个excel的关闭操作未完成,就开始下一个文件的读取。一般的解决办法是用time.sleep等程序完成关闭操作。
我这里的情况是已经运行了一次py脚本,再运行就会报这个错误,报错的文件双击点开显示有时有问题有时没有,关闭后再运行就没问题了。
非常奇怪,再次运行还是没有问题。这两次唯一的区别就是我运行的时候,没有在文件资源管理器点击选中相应的文件(没有打开),所以说,在我单击选中的时候,系统就已经开始预加载了?以至于脚本不能读取文件。
上面的判断错了,经过多次测试,原因是代码运行时发生错误,修改后,由于发生错误时直接切断程序,没有调用quit()方法,导致文件实际上没有关闭。点击右上角的三角按钮Ctrl+Alt+N运行时就会这样,正常F5运行不会。
这是搜到的那位博主的解释:https://www.cnblogs.com/vhills/p/8098715.html

奇奇怪怪的bug和问题

openpyxl sheet_index起始为0
为什么载入表格后,用sheet_index访问工作表,ws[0]访问不了

运行代码的时候,不知道为什么,会打开excel操作,按理说操作在桌面是隐藏的,之前已经设置了。想来想去,唯一的原因可能是我运行前已经打开了一张表,尽管这张表不是要操作的表。