效圖

######################################
#### 程序名稱:文件夾照片批量插入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\test\工具-照片導入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]) # ./pic\2020年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 #######################