前言
在经历了VBA提取word批注:
和python后处理与图形化:
两步处理之后,终于可以进行实用性的探索:word批注批量提取器V2实用版!
实用演示
批注提取器演示
关键技术
python调用VBA
这段代码是从网上找的,思路就是通过win32com.client库来打开word文档,执行宏指令,再关闭word。因此这段代码是有缺陷的,如果当前word已经打开了那么就会执行出错(下个版本一定修复这个问题)。如果打开没有问题,就会执行'exportWordComments_Click'宏。
1. def update_content(url): #打开word,执行宏命令 2. ret = "" 3. docApp = win32com.client.DispatchEx('Word.Application') 4. try: 5. doc = docApp.Documents.Open(url) 6. #print("打开文档") 7. doc.Application.Run('exportWordComments_Click') 8. #print("执行宏完成") 9. doc.Save() 10. ret = url + " 处理成功" 11. except Exception as e: 12. print(e + ", 执行失败") 13. ret = url + " 处理失败" 14. docApp.Quit() 15. return ret 16. pass
最开始我的写法是doc.Application.Run('.\vba.docm!exportWordComments_Click'),含义是调用脚本同目录下vba.docm这个里面的宏。之后我发现word之间的宏是共享的,所以是不需要指定文件的,所以这段代码就改成这样了。
python写excel
python写excel使用的是xlsxwriter库,以标题栏的写入为例:
1. output = excel_name #"D:\MyWork\python\get_comments_v2\log\Date_20220602_173646.xlsx" 2. workbook = xw.Workbook(output) 3. worksheet1 = workbook.add_worksheet("sheet1") 4. worksheet1.activate() 5. title = ['文件名', 6. '批注内容', 7. '原文', 8. '是否解决', 9. '批注者', 10. '页', 11. '行', 12. '日期', 13. '文件路径'] 14. bold = workbook.add_format({ 15. 'bold': True, # 字体加粗 16. 'border': 1, # 单元格边框宽度 17. 'align': 'left', # 水平对齐方式 18. 'valign': 'vcenter', # 垂直对齐方式 19. 'fg_color': '#F4B084', # 单元格背景颜色 20. 'text_wrap': True, # 是否自动换行 21. }) 22. worksheet1.write_row('A1', title, bold)
就搞定了:
打开excel
脚本内打开excel还是用win32com,在这里做了保护,如果检测到excel已经打开了就不再打开,如果没打开的话就把excel打开,用xl_app.Visible = 1来显式的显示界面:
1. def open_xlsx(): 2. already_open = 0 3. xl_app = win32com.client.DispatchEx("Excel.Application") 4. xl_app.Visible = 1 5. for wb in xl_app.Workbooks: 6. if(wb.Name == excel_name): #wb.Name只返回文件的名字,不包含路径 7. already_open = 1 8. break 9. if(already_open==0):#需要新打开文件 10. my_wb = xl_app.Workbooks.Open(excel_name) 11. pass
独立线程
在测试的过程我就发现了(其实早就知道),开始检查 按键按下后,由于执行检查的时间太长了,这个按键就卡在这抬不起来,exe也动不了。所以说需要把按键对应的操作做成独立线程,也就是 按键 -> 提起处理的线程 ->按键抬起(回到了主线程) -> 子线程自己跑着去。所以实际的操作是open_xlsx(),后面的操作是:
1. def thread_open_xlsx(): 2. t2 = threading.Thread(target=open_xlsx,args=()) 3. t2.start() 4. pass 5. 6. button2 = Button(f3, text='开始检查', command=thread_start_check)
然后按键就和操作解依赖了~
资源链接
链接:https://pan.baidu.com/s/1kC5yYDkXvAmX7deLpXltWA
提取码:ou0k
--来自百度网盘超级会员V5的分享