当前位置: 首页 > 科技观察

Python办公自动化:从Word到Excel

时间:2023-03-13 01:00:30 科技观察

大家好,今天一个公务员的朋友委托我帮他,大概有这样一份Word(文中具体内容因隐私问题有所修改)文件)有近2600个类似格式的明细栏目,每栏目包含的信息包括:日期、单位、单据号、标题、收据栏目,需要将加粗的三项提取出来存入Excel床单。表格格式如下:需要在指定位置填写收货时间、单据标题、单据编号,同时需要将时间修改成标准格式。如果时间完全是手工复制修改,按照一个条目10秒的时间计算,一分钟可以完成6个条目,那么最需要的也是很快:而这种格式规则的文件组织是非常适合用Python执行。好吧,那就让Python出来吧,我把代码中必要的信息作为注释信息呈现出来。首先用Python导入Word文件#导入需要的库docxfromdocximportDocument#指定文件存放路径path=r'C:\Users\word.docx'#读取文件document=Document(path)#读取所有文件tablesinthewordtables=document.tables把问题一一分解,首先尝试获取第一个表中第一个文件条目的三个所需信息#获取第一个表table0=tables[0]仔细观察可以发现一个fileentry占3行,所以循环迭代表格所有行的时候可以设置步长为3,注意观察表格,根据行和单元格分析清楚需要的内容#全局放一个变量给计数并填入序号n=0foriinrange(0,len(table0.rows)+1,3):#datedate=table0.cell(i,1).text#titletitle=table0.cell(i+1,1).text.strip()#textnumberdfn=tables[j].cell(i,3).text.strip()print(n,date,tite,dfn)接下来要解决的就是时间我们得到的形式是2/1d哎/月。我们需要把它转换成YYYY-MM-DD格式,这就用到了datetime包的strptime和strftime函数:strptime:解析字符串中包含的时间strftime:转换成需要的时间格式importdatetimen=0foriinrange(0,len(table0.rows)+1,3):#Datedate=table0.cell(i,1).text#有些条目时间为空,这里不要过多判断if'/'indate:date=datetime。约会时间。strptime(日期,'%d/%m').strftime('2020-%m-%d')else:date='-'#titletitle=table0.cell(i+1,1).text.strip()#Documentnumberdfn=tables[j].cell(i,3).text.strip()print(n,date,tite,dfn)这样一张表的内容解析就完成了,注意这里使用的是table[0]是第一个表,可以遍历所有的表,加嵌套循环,也可以捕获异常,增加程序的灵活性n=0forjinrange(len(tables)):foriinrange(0,len(tables[j].rows)+1,3):try:#datedate=tables[j].cell(i,1).textif'/'indate:date=datetime.datetime.strptime(date,'%d/%m').strftime('2020-%m-%d')else:date='-'#标题title=tables[j].cell(i+1,1).text.strip()#文字编号dfn=tables[j].cell(i,3).text.strip()n+=1print(n,date,title,dfn)exceptExceptionaserror:#捕获异常,也可以使用log写入日志,方便查看和管理print(error)continue信息分析获取完成后,即可导出。使用的包是openpyxlfromopenpyxlimportWorkbook#Instantiationwb=Workbook()#获取当前sheetsheet=wb.active#设置headerheader=['序列号','receive文档时间','文档编号','文档标题','文档编号','备注']sheet.append(header)在最里面的解析循环末尾添加如下代码row=[n,date,'',title,dfn,'']在sheet.append(row)线程的最后,记得保存wb.save(r'C:\Users\20200420.xlsx')运行时间大概10分钟左右,而且它大概留了一会儿程序执行完毕,最后附上完整代码。代码非常简单。最重要的是理清思路。fromdocximportDocumentimportdatetimefromopenpyxlimportWorkbookwb=Workbook()sheet=wb.activeheader=['序列号','收货时间','文件编号','文件标题','文件编号','备注']sheet.append(header)path=r'C:\Users\word.docx'document=Document(path)tables=document.tablesn=0forjinrange(len(tables)):foriinrange(0,len(tables[j].rows)+1,3):try:#datedate=tables[j].cell(i,1).textif'/'indate:date=datetime.datetime.strptime(date,'%d/%m').strftime('2020-%m-%d')else:date='-'#Titletitle=tables[j].cell(i+1,1).text.strip()#textnumberdfn=tables[j].cell(i,3).text.strip()n+=1print(n,date,title,dfn)row=[n,date,'',title,dfn,'']sheet.append(row)exceptExceptionaserror:#捕获异常,可以也可以使用日志写入日志方便查看和管理print(error)continuewb.save(r'C:\Users\20200420.xlsx')