项目办公自动化工具-文件夹照片批量插入word·

效图

#
##################################### #### 程序名称:文件夹照片批量插入word ### ###################################### ''' 需求:野外调查照片按日期进行了归档,并存储到pic文件夹中;需要将照片导入word,其中照片所在的日期文件夹名字作为一级索引;按4*3标准表格插入word,照片下面 是照片的名字,不需要后缀名;插入word表格中的照片应该按照片生成的修改日期排序插入,以便更原始记录表对应。 思路: 1.利用os.listdir(path)生成日期文件夹路径列表 2. 设计照片管理word封面内容 2.1 默认word 页面是竖排,需要横排时应插入连续分页符后设置方向。如果恢复竖排,则也插入连续分节符后设置竖向。 3. 封面后插入表格,表格内容插入照片和照片名称,照片名称居中;日期文件夹名称设为一级标题 3.1 定义函数,当照片文件夹里照片个数,是表格4*3里可插入照片数6个的整数倍或整除6时候 3.2 定义函数,当照片文件夹里照片个数,不是表格4*3里可插入照片数6个的整数倍或整除6时候 3.3 定义按照片的修改时间排序函数 3.4 每个照片文件夹进行循环插入信息 3.4.1先插入日期,设为一级标题 3.4.2 整除情况插入照片信息 3.4.3 非整除情况插入照片信息,又可以分两种情况 3.4.3.1 非整除情况插入照片信息,又可以分两种情况:(1)照片个数小于6,插入一个表就可以 3.4.3.2 非整除情况插入照片信息,又可以分两种情况:(2)照片个数大于6,插入表格数量是整除的个数,后插入余数情况的一个表就可以 4.最后保存为word 文件。 5.编译为exe文件,cmd: pyinstaller.exe -F F:python_2020 est工具-照片导入word工具-照片导入word照片批量导入word归档系统V3.py 使用方法: 1.照片统一为jpg格式,路径为 ./pic/日期/*.jpg 2.程序文件拷贝到pic文件夹当前路径中。 3.照片统一为横排,比例诶4:3 4.生成的word删除首页空白,页面两侧间距建议改为20mm,根据项目修改封面内容 研发信息: 研发团队:广核监测科技创新研发小组 研发组长:bison 研发日期:2020年8月16日 ''' ###################################### msg=''' ###################################### #### 程序名称:文件夹照片批量插入word ### ###################################### 需求:野外调查照片按日期进行了归档,并存储到pic文件夹中;需要将照片导入word,其中照片所在的日期文件夹名字作为一级索引;按4*3标准表格插入word,照片下面 是照片的名字,不需要后缀名;插入word表格中的照片应该按照片生成的修改日期排序插入,以便更原始记录表对应。 ###################################### 使用方法: 1.照片统一为jpg格式,路径为 ./pic/日期/*.jpg 2.程序文件拷贝到pic文件夹当前路径中。 3.照片统一为横排,比例诶4:3 4.生成的word删除首页空白,页面两侧间距建议改为20mm,根据项目修改封面内容 ###################################### 研发信息: 研发团队:广核监测科创小组 研发组长:bison 研发日期:2020年8月16日 ###################################### ''' print(msg) ok=str(input("是否已按要求整理待归档照片文件,如果是,按回车执行程序:")) #引入库 import os, sys, os.path,time,datetime,docx from docx import Document from docx.enum.text import WD_PARAGRAPH_ALIGNMENT #用作设置段落对齐 WD_ALIGN_PARAGRAPH from docx.enum.table import WD_TABLE_ALIGNMENT #表格内容居中 from docx.shared import Pt #磅数 from docx.shared import Inches #图片尺寸 from docx.oxml.ns import qn #中文格式 from docx.enum.section import WD_ORIENTATION, WD_SECTION_START # 导入节方向和分解符类型 ############# main ######################### # 1. 利用os.listdir(path)生成日期文件夹路径列表 path="./pic" #当前路径 father_paths=os.listdir(path) print("father_paths:",father_paths) #father_paths: ['2020年8月13日', '2020年8月14日', '2020年8月15日'] fps=[] for i in range(len(father_paths)): fps.append(os.path.join(path,father_paths[i])) print("所有照片文件夹包括:",fps) # ['./pic\2020年8月13日', './pic\2020年8月14日', './pic\2020年8月15日'] # doc = Document("./照片管理模板.docx") #打开word文件 doc = Document() #新建word文件 ###################################### # 2. 设计照片管理word封面内容 #2.1 默认word 页面是竖排,需要横排时应插入连续分页符后设置方向。如果恢复竖排,则也插入连续分节符后设置竖向。 #原计划的新建word封面模板,后来发现无法添加一级标题,故改为程序新建doc文件后保存 doc.add_paragraph() # 添加一个空白段落 section = doc.add_section(start_type=WD_SECTION_START.CONTINUOUS) # 添加横向页的连续节 section.orientation = WD_ORIENTATION.LANDSCAPE # 设置横向 page_h, page_w = section.page_width, section.page_height section.page_width = page_w # 设置横向纸的宽度 section.page_height = page_h # 设置横向纸的高度 #如下方式无法修改段落格式,不采用 doc.add_paragraph("") doc.add_paragraph("") doc.add_paragraph("") #采用run方式可以修改格式,采用 p1=doc.add_paragraph() run1=p1.add_run("广东省***************监测") run1.font.name=u"宋体" run1.font.size=Pt(20) p1.paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER #居中 p2=doc.add_paragraph() run2=p2.add_run("***铅锌矿野外调查照片图册") run2.font.name=u"宋体" run2.font.size=Pt(20) p2.paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER #居中 doc.add_paragraph("") doc.add_paragraph("") doc.add_paragraph("") doc.add_paragraph("") doc.add_paragraph("") doc.add_paragraph("") doc.add_paragraph("") doc.add_paragraph("") p3=doc.add_paragraph() run3=p3.add_run("广东省******中心") run3.font.name=u"宋体" run3.font.size=Pt(20) p3.paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER #居中 #封面底下输入打印日期 import time today=time.strftime("%Y-%m-%d",time.localtime()) date_para=doc.add_paragraph() # date_run=date_para.add_run(today) #2020-08-13 # print(today[0:5]) date_run=date_para.add_run("%s年%s月%s日"%(today[0:4],today[6:7],today[8:11])) date_run.font.name=u"宋体" date_run.font.size=Pt(20) date_para.paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER #日期居中 # doc.add_page_break() #插入分页符 ################################# # 3. 封面后插入表格,表格内容插入照片和照片名称,照片名称居中;日期文件夹名称设为一级标题 ''' 问题:如何插入表格,表格里如何插入照片和信息 1.先插入日期,设为一级标题 2.插入表格6 2.1 日期文件夹里照片文件个数x整除6,插入表格数y=x/6 照片文件进行每组为一个列表,进行标准化插入 2.2 不整除6,y=int(x/6)+1 3.标准化出入内容 4.调试 ''' ###################################### # 3.1 定义函数,当照片文件夹里照片个数,是表格4*3里可插入照片数6个的整数倍或整除6时候 # 标准表格里插入照片和信息的函数, def InfoToTable(filelist,table,pathi,tip='整除倍数4*3标准表格情况'): #jpglist=os.listdir(fps[0]) jpglist[0]='1.JPG', jpglist[1]='FKQXK-r-01-01-0.jpg' z=len(filelist) # if z%6==0: ########开始 # 1. strip() 清除两边的空格 # 2. rstrip() 清除右边的空格 # 3. lstrip() 清除左边的空格 table.cell(1, 0).text = filelist[0].rstrip('.jpgJPGpngPNGtifTIF') table.cell(1, 1).text = filelist[1].rstrip('.jpgJPGpngPNGtifTIF') # '第2张照片' .JPG table.cell(1, 2).text = filelist[2].rstrip('.jpgJPGpngPNGtifTIF') # '第3张照片' table.cell(3, 0).text = filelist[3].rstrip('.jpgJPGpngPNGtifTIF')# '第4张照片' table.cell(3, 1).text = filelist[4].strip('.jpgJPGpngPNGtifTIF')# '第5张照片' table.cell(3, 2).text = filelist[5].strip('.jpgJPGpngPNGtifTIF') # '第6张照片' # table.cell(3, 2).text = filelist[5].strip('.jpg' or '.JPG') # '第6张照片' w = float(8 / 2.54) # cm转为英寸 h = float(6 / 2.54) # cm转为英寸 run = table.cell(0, 0).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[0]), width=Inches(w), height=Inches(h)) run = table.cell(0, 1).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[1]), width=Inches(w), height=Inches(h)) run = table.cell(0, 2).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[2]), width=Inches(w), height=Inches(h)) run = table.cell(2, 0).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[3]), width=Inches(w), height=Inches(h)) run = table.cell(2, 1).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[4]), width=Inches(w), height=Inches(h)) run = table.cell(2, 2).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[5]), width=Inches(w), height=Inches(h)) # 设置表格内容居中 for r in range(4): # 循环将每一行,每一列都设置为居中 for c in range(3): table.cell(r, c).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER # else: # pass ###结束 ###################################### # 3.2 定义函数,当照片文件夹里照片个数,不是表格4*3里可插入照片数6个的整数倍或整除6时候 def InfoToTable_yushu(filelist,table,pathi,tip='不整除倍数x*3标准表格情况'): #jpglist=os.listdir(fps[0]) jpglist[0]='1.JPG', jpglist[1]='FKQXK-r-01-01-0.jpg' z=len(filelist) if z%6==1: ########开始 table.cell(1, 0).text = filelist[0].strip('.jpgJPGpngPNGtifTIF') # '第1张照片' # jpglist[0]='1.JPG' w = float(8 / 2.54) # cm转为英寸 h = float(6 / 2.54) # cm转为英寸 run = table.cell(0, 0).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[0]), width=Inches(w), height=Inches(h)) # 设置表格内容居中 for r in range(4): # 循环将每一行,每一列都设置为居中 for c in range(3): table.cell(r, c).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER ###结束 elif z%6==2: ########开始 table.cell(1, 0).text = filelist[0].strip('.jpgJPGpngPNGtifTIF') # '第1张照片' # jpglist[0]='1.JPG' table.cell(1, 1).text = filelist[1].strip('.jpgJPGpngPNGtifTIF') # '第2张照片' w = float(8 / 2.54) # cm转为英寸 h = float(6 / 2.54) # cm转为英寸 run = table.cell(0, 0).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[0]), width=Inches(w), height=Inches(h)) run = table.cell(0, 1).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[1]), width=Inches(w), height=Inches(h)) # 设置表格内容居中 for r in range(4): # 循环将每一行,每一列都设置为居中 for c in range(3): table.cell(r, c).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER ###结束 elif z%6==3: ########开始 table.cell(1, 0).text = filelist[0].strip('.jpgJPGpngPNGtifTIF') # '第1张照片' # jpglist[0]='1.JPG' table.cell(1, 1).text = filelist[1].strip('.jpgJPGpngPNGtifTIF') # '第2张照片' table.cell(1, 2).text = filelist[2].strip('.jpgJPGpngPNGtifTIF') # '第3张照片' w = float(8 / 2.54) # cm转为英寸 h = float(6 / 2.54) # cm转为英寸 run = table.cell(0, 0).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[0]), width=Inches(w), height=Inches(h)) run = table.cell(0, 1).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[1]), width=Inches(w), height=Inches(h)) run = table.cell(0, 2).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[2]), width=Inches(w), height=Inches(h)) # 设置表格内容居中 for r in range(4): # 循环将每一行,每一列都设置为居中 for c in range(3): table.cell(r, c).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER ###结束 elif z%6==4: ########开始 table.cell(1, 0).text = filelist[0].strip('.jpgJPGpngPNGtifTIF') # '第1张照片' # jpglist[0]='1.JPG' table.cell(1, 1).text = filelist[1].strip('.jpgJPGpngPNGtifTIF') # '第2张照片' table.cell(1, 2).text = filelist[2].strip('.jpgJPGpngPNGtifTIF') # '第3张照片' table.cell(3, 0).text = filelist[3].strip('.jpgJPGpngPNGtifTIF') # '第4张照片' w = float(8 / 2.54) # cm转为英寸 h = float(6 / 2.54) # cm转为英寸 run = table.cell(0, 0).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[0]), width=Inches(w), height=Inches(h)) run = table.cell(0, 1).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[1]), width=Inches(w), height=Inches(h)) run = table.cell(0, 2).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[2]), width=Inches(w), height=Inches(h)) run = table.cell(2, 0).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[3]), width=Inches(w), height=Inches(h)) # 设置表格内容居中 for r in range(4): # 循环将每一行,每一列都设置为居中 for c in range(3): table.cell(r, c).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER ###结束 elif z%6==5: ########开始 table.cell(1, 0).text = filelist[0].strip('.jpgJPGpngPNGtifTIF') # '第1张照片' # jpglist[0]='1.JPG' table.cell(1, 1).text = filelist[1].strip('.jpgJPGpngPNGtifTIF') # '第2张照片' table.cell(1, 2).text = filelist[2].strip('.jpgJPGpngPNGtifTIF') # '第3张照片' table.cell(3, 0).text = filelist[3].strip('.jpgJPGpngPNGtifTIF') # '第4张照片' table.cell(3, 1).text = filelist[4].strip('.jpgJPGpngPNGtifTIF') # '第5张照片' w = float(8 / 2.54) # cm转为英寸 h = float(6 / 2.54) # cm转为英寸 run = table.cell(0, 0).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[0]), width=Inches(w), height=Inches(h)) run = table.cell(0, 1).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[1]), width=Inches(w), height=Inches(h)) run = table.cell(0, 2).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[2]), width=Inches(w), height=Inches(h)) run = table.cell(2, 0).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[3]), width=Inches(w), height=Inches(h)) run = table.cell(2, 1).paragraphs[0].add_run() run.add_picture(os.path.join(pathi, filelist[4]), width=Inches(w), height=Inches(h)) # 设置表格内容居中 for r in range(4): # 循环将每一行,每一列都设置为居中 for c in range(3): table.cell(r, c).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER else: pass ###结束 ###################################### # 3.3 定义按照片的修改时间排序函数 def sort_file_by_time(file_path): # 定义按时间排序的函数 files = os.listdir(file_path) if not files: return else: files = sorted(files, key=lambda x: os.path.getmtime( os.path.join(file_path, x))) # 格式解释:对files进行排序.x是files的元素,:后面的是排序的依据. x只是文件名,所以要带上join. return files # f = sort_file_by_time(fps[i]) # 按修改时间排序后的文件名称列表 # print("f时间排序后的文件列表:", f) # 打印是否成功排序 f时间排序后的文件列表: ['5.jpg', '6.jpg', '7.jpg', # # '8.jpg', '10.jpg', '11.jpg', '12.jpg', '13.jpg', '14.jpg', '15.jpg', '16.jpg', # # '9.jpg', '17.jpg', '18.jpg', '19.jpg', '20.jpg', '21.jpg', '22.jpg', '23.jpg', '24.jpg', # # '1.JPG', '2.JPG', '3.JPG', '4.JPG'] # print("fps[0]);", fps[0]) # ./pic2020年8月13日 ###################################### #3.4 每个照片文件夹进行循环插入信息 for i in range(len(father_paths)): # 3.4.1先插入日期,设为一级标题 doc.add_heading(father_paths[i], 1) print(os.listdir(fps[i])) x=len(os.listdir(fps[i])) # 3.4.2 整除情况插入照片信息 if x%6==0: y= int(x/6) #插入表格数 count = 0 #定位插入照片的位置,是第几张表格 for l in range(y): # table = doc.add_table(rows=4, cols=3, style="Normal Table") #插入y个4*3表格 # 调用函数 # jpglist = os.listdir(fps[i]) #调用按修改日期排序函数 jpglist = sort_file_by_time(fps[i]) jpglist = jpglist[count * 6 + 0:int(x / 6) * 6 + count * 6] #count * 6 用于定位插入第count占表格的照片新起点位置 # 插入一种4*3的标准表格 table = doc.add_table(rows=4, cols=3, style="Normal Table") # 调用整除情况插入照片的函数 InfoToTable(jpglist, table, fps[i], tip='整除倍数4*3标准表格情况') count += 1 #定位到下一个表格位置 # 3.4.3 非整除情况插入照片信息,又可以分两种情况 elif x%6!=0: # 3.4.3.1 非整除情况插入照片信息,又可以分两种情况:(1)照片个数小于6,插入一个表就可以 if int(x / 6)==0: #说明照片个数小于6,插入一个表就可以 #调用时间排序函数 jpglist = sort_file_by_time(fps[i]) # jpglist = os.listdir(fps[i]) #插入表格 table = doc.add_table(rows=4, cols=3, style="Normal Table") #调用不整除情况插入表格信息函数 InfoToTable_yushu(jpglist, table, fps[i], tip='不整除倍数x*3标准表格情况') # 3.4.3.2 非整除情况插入照片信息,又可以分两种情况:(2)照片个数大于6,插入表格数量是整除的个数,后插入余数情况的一个表就可以 elif int(x / 6)!=0: #说明照片个数大于6,插入整除的个数,插入余数情况的一个表就可以 #插入整除的个数 y = int(x / 6) # 插入表格数 count = 0 #用于定位第几张表格 # 先循环插入整除倍数情况的表格信息 for l in range(y): # table = doc.add_table(rows=4, cols=3, style="Normal Table") #插入y个4*3表格 # 调用照片按修改时间排序函数 jpglist = sort_file_by_time(fps[i]) # jpglist = os.listdir(fps[i]) jpglist = jpglist[count*6+0:int(x / 6)*6+count*6] # 插入表格 table = doc.add_table(rows=4, cols=3, style="Normal Table") #调用整除情况插入照片信息 InfoToTable(jpglist, table, fps[i], tip='整除倍数4*3标准表格情况') count +=1 #定位到下一个整除表格 # 后调用插入不整除情况的信息 #插入余数情况的一个表就可以 #调用照片按修改时间排序的函数 jpglist = sort_file_by_time(fps[i]) # jpglist = os.listdir(fps[i]) jpglist =jpglist[int(x / 6)*6:] #定位到依次第几个照片需要插入 #添加表格 table = doc.add_table(rows=4, cols=3, style="Normal Table") #调用非整除情况 InfoToTable_yushu(jpglist, table, fps[i], tip='不整除倍数x*3标准表格情况') else: pass # 每个日期文件夹名字插入完后插入分页符 doc.add_page_break() #4.最后保存为word 文件。 doc.save('result.docx') print("succed") os.system('pause') ############### end #######################
因为不懂,所以要学; 因为平凡,所以努力。 因为有为,所以有位。 因为执着,所以精彩。
原文地址:https://www.cnblogs.com/quezesheng/p/13513600.html