效图

######################################
#### 程序名称:文件夹照片批量插入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 #######################