批量读取docx文件中的excel表格格式数据

批量读取docx文件中的excel表格格式数据

  • 写在最前面
  • 代码展示
  • 遇到的问题

写在最前面

批量读取docx文件中的excel表格格式数据

代码思路:
docx库只能操作docx文件,因此批量处理doc文件,将其保存为docx文件
然后读取docx文件中的excel表格格式数据

递归保存所有文件

代码展示

import os
import pandas as pd
from docx import Document
from win32com import client as wc
import numpy as np

# 读取docx文件中的excel表格格式数据
def read_word_table(file_path):
    doc = Document(file_path)
    tables = []
    for table in doc.tables:
        data = []
        keys = None
        for i, row in enumerate(table.rows):
            text = [cell.text for cell in row.cells]
            if i == 0:
                keys = text
            else:
                data.append(text)
        if keys:
            df = pd.DataFrame(data, columns=keys)
            tables.append(df)
#     print(tables)
    return tables

# 将doc文件转换为docx文件,因为docx库只能操作docx文件
def doc2docx(doc_files):
    word = wc.Dispatch("Word.Application")  # 打开word应用程序
    for doc_file in doc_files:
#         print(doc_file)
        doc = word.Documents.Open(doc_file)  # 打开word文件
        doc.SaveAs("{}x".format(doc_file), 12)  # 另存为后缀为".docx"的文件,其中参数12指docx文件
        doc.Close()  # 关闭原来word文件
    word.Quit()

# 批量处理doc文件,将其保存为docx文件
def transform(directory_path):
    file_paths = []
    # 递归保存所有文件
    for root, dirs, files in os.walk(directory_path):
        for file in files:
            # 判断当前目录是否为二级目录
            if root.count(os.sep) - directory_path.count(os.sep) == 1:
                if "推荐" in file.lower() and file.lower().endswith('.doc'):
                    file_path = os.path.join(root, file)
#                     print(file_path)
                    file_paths.append(file_path)
    doc2docx(file_paths)
    print("全部doc文件转docx完成")

# 删除字符串值末尾的空行
def remove_trailing_empty_lines(value):
    if isinstance(value, str):
        return value.rstrip()
    return value

# 遍历DataFrame中的每个元素,并对字符串值应用remove_trailing_empty_lines函数来删除末尾的空行
def remove_trailing_spaces(df):
    return df.applymap(remove_trailing_empty_lines)
                                      
def main(directory_path, output_file):
    all_tables = []
    # 递归保存所有文件
    for root, dirs, files in os.walk(directory_path):
        for file in files:
            # 判断当前目录是否为二级目录
            if root.count(os.sep) - directory_path.count(os.sep) == 1:
            # file.lower().startswith('附件1:推荐社会责任根植项目汇总表') 
                if "推荐" in file.lower() and file.lower().endswith('.docx'):
                    file_path = os.path.join(root, file)
                    print(file_path)
                    tables = read_word_table(file_path)
                    all_tables.extend(tables)                   
                    print(type(tables),type(all_tables))
    if all_tables:
        all_data = pd.concat(all_tables, ignore_index=False)
        # 删除excel文件中的重复行
        all_data.drop_duplicates(inplace=True)
        # 删除所有值的末尾空格
        all_data = all_data.applymap(lambda x: x.strip() if isinstance(x, str) else x)
        # 调用删除函数,删除所有值的末尾空格和空行
        cleaned_df = remove_trailing_spaces(all_data)
        all_data["项目名称"] = all_data["项目名称"].replace(['\n',' '],'')
        all_data.to_excel(output_file, index=False)
        print("Excel文件汇总完成!")
    else:
        print("目录下没有符合条件的Word文件。")
        
if __name__ == "__main__":
#     directory_path = "D:\\电网材料\\2022根植项目"  # 替换为包含Word文件的目录路径
#     output_file = "2022output.xlsx"  # 输出Excel文件的路径和名称
#     directory_path = "D:\\电网材料\\2021根植项目"  # 替换为包含Word文件的目录路径
#     output_file = "2021output.xlsx"  # 输出Excel文件的路径和名称
    directory_path = "D:\\电网材料\\2020根植项目"  # 替换为包含Word文件的目录路径
    output_file = "2020output.xlsx"  # 输出Excel文件的路径和名称
    transform(directory_path)
    main(directory_path, output_file)

遇到的问题

就这个问题,chatgpt给我道歉了一下午。。。最后发现是docx文件中的表格不规范,太不容易了害

最终解决
根据pycharm里面的控制台运行,然后在变量台中找到all_tables属性,检查一下是哪个docx文件的表格读取有问题
我的是表格不连续导致的,即应该是一个完整的表格,但那个docx文件中存在多个分节的表格。

你可能感兴趣的:(实践,excel,开发语言,python,数学建模,笔记,word)