中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用python將word文檔合并

發布時間:2022-03-04 10:40:20 來源:億速云 閱讀:365 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“怎么用python將word文檔合并”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“怎么用python將word文檔合并”這篇文章吧。

設計思路:

        首先,整個腳本實現兩個功能:

查看各目錄下未提交word文檔的名單合并各目錄下的word文檔查看各目錄未提交名單:

        對于這個需求,首先是讀一個寫有所有人姓名等信息的Excel文件,有格式要求。然后通過遍歷Excel的信息,獲取到所有人的姓名。遍歷各目錄下,是否有對應姓名的文件存在,如果沒有,則輸出沒有提交文件的姓名。

合并word文件:

        合并word文件和上一個需求有類似的地方。首先我們都需要讀Excel文件,得到姓名信息,然后在各目錄下獲取到這個人所提交的所有word文件的文件路徑,然后通過合并word的操作實現文件合并,合并后最終輸出到指定的目錄下。

腳本環境說明:

        腳本對第三方包有依賴,執行前必須先安裝對應的第三方包

pip install python-docx pywin32 xlrd

        首先,目錄結構必須是如下圖所示,所有需要遍歷的目錄名稱都必須是【實訓+數字】,因為腳本中涉及多處正則匹配。

怎么用python將word文檔合并

        其次,Excel文件必須遵循下圖所示的格式,首行是標題行,遍歷的時候會自動跳過,遍歷時會遍歷C列和D列,其中C列是人員編號,D列是人員姓名

 怎么用python將word文檔合并

        接著,python腳本必須要根目錄下

        最后,執行腳本的時候,必須帶有傳參,傳遞的參數就是那個Excel表

Microsoft Windows [版本 10.0.19043.1415]
(c) Microsoft Corporation。保留所有權利。
 
C:\Windows\system32>python tools.py 花名冊.xlsx

完整代碼:

#! /usr/bin env python
# -*- coding:utf-8 -*-
 
"""
============================
======Power By Python3======
====== Author Task138 ======
============================
"""
 
import sys
import xlrd, os, re
from docx import Document
from docxcompose.composer import Composer
from win32com import client as wc
 
 
# 讀Excel表獲取學生的學號和姓名
def read_excel(excel_file):
    workbook = xlrd.open_workbook(excel_file)
    sheet = workbook.sheet_by_index(0)
    name_list = []
    name_dict = []
 
    Sno_list = sheet.col_values(2)[1::]
    Sname_list = sheet.col_values(3)[1::]
    for i in range(len(Sno_list)):
        try:
            Sno = str(int(Sno_list[i]))
        except:
            Sno = Sno_list[i]
        dict = {}
        dict['Sno'] = Sno
        dict['Sname'] = Sname_list[i]
        name_list.append(Sname_list[i])
        name_dict.append(dict)
 
    return name_list, name_dict
 
# 合并文檔
def merge_doc(source_file_path_list,target_file_path):
    #填充分頁符號文檔
    page_break_doc = Document()
    page_break_doc.add_page_break()
    #定義新文檔
    target_doc = Document(source_file_path_list[0])
    target_composer = Composer(target_doc)
    for i in range(len(source_file_path_list)):
        #跳過第一個作為模板的文件
        if i==0:
            continue
        #填充分頁符文檔
        target_composer.append(page_break_doc)
        #拼接文檔內容
        f = source_file_path_list[i]
        target_composer.append(Document(f))
    #保存目標文檔
    target_composer.save(target_file_path)
    print('[ %s ]保存成功' % target_file_path)
 
 
if __name__ == '__main__':
    if len(sys.argv) < 2:
        print('缺乏必要的參數,請輸入學生Excel表作為參數')
        print('程序終止')
        exit()
 
    excel_file = sys.argv[1]
 
 
    print('請選擇需要執行的功能:')
    print('[ 0 ] 查看各實訓目錄下未提交的學生名單')
    print('[ 1 ] 合并實訓文件')
    cmd = input('請選擇: ')
 
    while cmd not in ['0','1']:
        print('輸入有誤,請重新輸入,按 Ctrl+C 可退出程序')
        print('請選擇需要執行的功能:')
        print('[ 0 ] 查看各實訓目錄下未提交的學生名單')
        print('[ 1 ] 合并實訓文件')
        cmd = input('請選擇: ')
 
    try:
        name_list, name_dict = read_excel(excel_file)
    except Exception as e:
        print('Excel讀取失敗,程序終止,錯誤如下:')
        print(e)
        print()
        exit()
    else:
        if cmd == '0':
            # 實訓目錄的數列
            file_list = []
            for i in os.listdir():
                if os.path.isdir(i):
                    if re.match(r'實訓\d', i):
                        file_list.append(i)
 
            for i in range(1, len(file_list) + 1):
                dir_name = '實訓%s' % i
                # 進入該實訓目錄
                os.chdir(dir_name)
                file_list = os.listdir()
                submit_list = []
                for x in file_list:
                    for j in name_list:
                        if j in x and j not in submit_list:
                            submit_list.append(j)
                result = list(set(submit_list) ^ set(name_list))
                if result:
                    print(dir_name, result)
                os.chdir('../')
 
        if cmd == '1':
            if not os.path.exists('實訓匯總'):
                os.mkdir('實訓匯總')
                print('目錄[ 實訓匯總 ]創建成功')
 
            # 實訓目錄的數列
            file_list = []
            for i in os.listdir():
                if os.path.isdir(i):
                    if re.match(r'實訓\d',i):
                        file_list.append(i)
 
 
            for i in name_dict:
                doc_list = []
                for j in range(1,len(file_list)+1):
                    dir_name = '實訓%s' % j
                    # 進入該實訓目錄
                    os.chdir(dir_name)
 
                    tmp = []
                    for x in os.listdir():
                        # 判斷文件尾綴
                        fname,fext = os.path.splitext(x)
                        # 如果是.doc,則轉換為.docx
                        if fext == '.doc' and not x.startswith('~$'):
                            w = wc.Dispatch('Word.Application')
                            doc = w.Documents.Open(os.path.abspath(x))
                            doc.SaveAs(os.path.join(os.getcwd(),'%s.docx' % fname), 16)
                            doc.Close()
                            os.remove(x)
                            print('轉換文件[ %s ]類型為.docx' % x)
                        elif fext == '.docx':
                            if (i['Sname'] in x) and (len(tmp) == 0):
                                # 只有一個文件
                                tmp.append(x)
                            elif (i['Sname'] in x) and (len(tmp) != 0):
                                # 有多個文件,按照最新的修改時間進行替換
                                tmp_file = tmp.pop()
                                old_file_mtime = os.path.getmtime(tmp_file)
                                new_file_mtime = os.path.getmtime(x)
                                if new_file_mtime > old_file_mtime:
                                    # 新文件比較新,以新的為準
                                    tmp.append(x)
                                else:
                                    # 老文件比較新,以老文件為準
                                    tmp.append(tmp_file)
                        else:
                            # 其它文件類型,直接跳過
                            # print('當前文件[ %s ]類型不是.doc或者.docx,跳過此文件的合并' % os.path.abspath(x))
                            continue
 
                    if tmp:
                        # 如果這次實訓有這位同學的文件
                        doc_list.append(os.path.join(dir_name,tmp.pop()))
                    # 返回父目錄
                    os.chdir('../')
                if doc_list:
                    # 有內容,進行文檔合并
                    try:
                        merge_file_name = i['Sno'] + '-' + i['Sname'] + '-' + '實訓匯總' + '.docx'
                        merge_doc(doc_list, './實訓匯總/' + merge_file_name)
                    except Exception as e:
                        print()
                        print('[ %s ]學生信息有誤,程序中斷' % i['Sname'])
                        print(e)
                        print()

功能執行效果圖:

怎么用python將word文檔合并

怎么用python將word文檔合并

以上是“怎么用python將word文檔合并”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

富民县| 界首市| 高淳县| 绥芬河市| 左云县| 北海市| 兰坪| 布拖县| 河南省| 忻州市| 色达县| 白城市| 乳源| 龙口市| 舟曲县| 日照市| 太白县| 鲜城| 青岛市| 宁明县| 永寿县| 文化| 五家渠市| 绥芬河市| 尤溪县| 兴国县| 砀山县| 瑞金市| 辉南县| 大连市| 沙田区| 西华县| 涞源县| 山丹县| 固始县| 滨海县| 汽车| 宝鸡市| 茂名市| 晋城| 江源县|