1. 程式人生 > 實用技巧 >專案辦公自動化工具-資料夾照片批量插入word·

專案辦公自動化工具-資料夾照片批量插入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\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 #######################