查看: 660|回复: 5

[python] Word 表格汇总到Excel

[复制链接]
发表于 2021-2-2 21:07 | 显示全部楼层 |阅读模式
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。

Word 表格汇总到Excel
Word 表格汇总到Excel
Word 表格汇总到Excel

具体使用看Word 表格汇总 Excel成品。

别再发看不懂了,看不懂的麻烦Ctrl+W关闭此贴,
别浪费你我的时间,别发无意义的评论,谢谢。


昨天发了Word 表格汇总 Excel,看评论大家还是需要源码,这样可以根据自己需求进行修改,所以还是上传上来吧,不过本人也是业余的,很多地方有改进的地方。

本来我是用的tkinter,没有图形界面的,想根据自己需要修改的只需要下这个就行了:

[mw_shl_code=python,true]# -*- coding: UTF-8 -*-
import tkinter as tk
import win32com.client as wc
import os, re, glob, time, shutil
from tkinter import filedialog
from bs4 import BeautifulSoup
from pydocx import PyDocX

class Doc2Xlsx(object):
        """docstring for Doc2Xlsx"""
        def __init__(self):
                super(Doc2Xlsx, self).__init__()

        # doc2docx
        def doc2docx(self, path, file):
                word = wc.Dispatch("Word.Application")
                doc = word.Documents.Open(path + "/" + file)
                doc.SaveAs(path + "/%sx"%file, 12)  #12代表转换后为docx文件
                doc.Close
                word.Quit()   #结束后台进程


        # Del doc
        def delDoc(self, path, file):
                time_start=time.time()
                while True:
                        time_end=time.time()
                        wmi = wc.GetObject("winmgmts:")
                        proCodeCov = wmi.ExecQuery('select * from Win32_Process where Name="WINWORD.EXE"')
                        if len(proCodeCov) <= 0:
                                os.remove(path + "/" + file)
                                return
                        time.sleep(3)
                        if time_end - time_start > 20:
                                print('删除 【%s】 文档超时'%file)
                                return


        # docx path
        def getPath(self):
                root = tk.Tk()
                root.withdraw()
                path = filedialog.askdirectory(title = "选择Word登记表所在目录")
                docs = [i for i in os.listdir(path) if i.endswith(".doc")]
                if docs:
                        print("==================Doc2Docx==================")
                        for doc in docs:
                                self.doc2docx(path, doc)
                                self.delDoc(path, doc)
                                print("%s 已转换为: %s"%(doc, doc+"x"))
                        print("==================Doc2Docx==================\n")
                docxs = [i for i in os.listdir(path) if i.endswith(".docx")]
                return path, docxs


        # 根据html tr&td 标签分类
        def docxCategory(self, path, docxs):
                docx_cate = {}

                for docx in docxs:
                        html = PyDocX.to_html(path + "/%s"%docx)
                        soup = BeautifulSoup(html, 'html.parser')
                        elem = soup.find_all("tr")                              #每个tr标签对应表格的一行                     
                        elem1 = re.sub(r"(?<=<td).+?(?=</td>)", "", str(elem))  #去除单元格标签td之间的内容

                        if elem1 in docx_cate.keys():
                                e = docx_cate[elem1]
                                e.append(docx)
                                docx_cate[elem1] = e
                        else:
                                docx_cate[elem1] = [docx]

                print("==================docxCategory==================")
                for c, docx in enumerate(docx_cate.values()):
                        path_cate = path + "/_cate/类别%d"%(c+1)

                        if not os.path.exists(path_cate):
                                os.makedirs(path_cate)

                        print("类别%d: "%(c+1))
                        for i in docx:
                                print(i, end=" ")
                                # shutil.move("%s/%s"%(path, i), "%s/%s"%(path_cate, i))        #移动
                                shutil.copyfile("%s/%s"%(path, i), "%s/%s"%(path_cate, i))    #复制
                        print()
                print("==================docxCategory==================")


        # docx2xlsx. 模板命名model.docx,与word放置相同文件夹
        def docx2xlsx(self, path, docxs):
                docxs.remove("model.docx")

                # 获取模板文件所需数据的位置
                html = PyDocX.to_html(path + "/model.docx")
                soup = BeautifulSoup(html, 'html.parser')
                elem = soup.find_all("tr")
                data = {}
                for row, tr in enumerate(elem):
                        if tr.text:                           #该行有需要的数据
                                val = {}
                                units = tr.find_all("td")         #获取需要的单元格序号
                                for unit, td in enumerate(units):
                                        if td.text:
                                                val[unit] = td.text
                                data[row] = val
                # 创建xlsx
                xl = wc.Dispatch('Excel.Application')
                xl.Visible = True
                xl.Workbooks.Add()
                xlBook = xl.Workbooks(1)
                xlSheet = xl.Sheets(1)
                # 数据汇总
                try:
                        for c, docx in enumerate(docxs):
                                html = PyDocX.to_html(path + "/%s"%docx)
                                soup = BeautifulSoup(html, 'html.parser')
                                elem = soup.find_all("tr")
                                for r in data.keys():
                                        for u in data[r].keys():
                                                xlSheet.Cells(c+1, int(data[r])).Value = elem[r].find_all("td")[int(u)].text.strip()
                except:
                        print(docx,"出错!")
                xlBook.SaveAs(path.replace(r"/", "\\") + "\\result.xlsx")  #实际单\才能正常保存
                # xl.Quit() #关闭


if __name__ == '__main__':
        d2x = Doc2Xlsx()
        path, docxs = d2x.getPath()
        d2x.docx2xlsx(path, docxs)
        classNeeded = 0
        if classNeeded:
                d2x.docxCategory(path, docxs)[/mw_shl_code]



如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2021-2-2 21:13 | 显示全部楼层

感谢分享,谢谢提供分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-2-2 22:11 | 显示全部楼层
多谢楼主分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-2-2 22:22 | 显示全部楼层

支持楼主,谢谢分享。
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-2-3 08:51 | 显示全部楼层
一定支持,感谢大佬的分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-2-3 11:40 | 显示全部楼层
谢谢大佬
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖
关注公众号
返回顶部