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

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

写在最前面

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

代码思路

docx库只能操作docx文件,因此批量处理doc文件,将其保存为docx文件

然后读取docx文件中的excel表格格式数据

递归保存所有文件

原文发布时间:2023-09-20 17:06:22

原文质量分太低,因此进行完善更新

对原代码进行解释说明,方便根据需要进行调整,以适应不同的文件结构和数据提取需求。希望这篇文章对你有所帮助!

参考:番茄跑了的《Python自动办公(五)批量提取word信息至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文件中存在多个分节的表格。

完善

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

在日常工作和研究中,我们经常会遇到需要从不同文档中提取数据的需求。有时候,这些数据嵌套在Word文档中的Excel表格中,而且需要大量处理。本文将介绍如何使用Python编写一个脚本,批量读取包含Excel表格的.docx文件,并将数据提取到一个Excel文件中。

背景

我们需要处理一批Word文档,这些文档中包含了各种Excel表格,这些表格中包含了有用的数据。我们的任务是批量读取这些.docx文件中的Excel表格,并将这些数据整理到一个统一的Excel文件中。

工具准备

为了实现这个任务,我们需要使用以下工具和库:

  1. Python:我们将使用Python编写脚本来自动化这个任务。
  2. pandas库:用于处理和操作数据。
  3. python-docx库:用于读取.docx文件中的文本和表格数据。
  4. pywin32库:用于将.doc文件转换为.docx文件,因为python-docx库只能操作.docx文件。

实现步骤

下面是实现批量读取.docx文件中的Excel表格数据的步骤:

步骤 1:将.doc文件转换为.docx文件

由于python-docx库只能操作.docx文件,我们需要将.doc文件转换为.docx文件。这一步需要使用pywin32库。我们定义了一个函数doc2docx来完成这一任务。

def doc2docx(doc_files):
    word = wc.Dispatch("Word.Application")  # 打开Word应用程序
    for doc_file in doc_files:
        doc = word.Documents.Open(doc_file)  # 打开.doc文件
        doc.SaveAs("{}x".format(doc_file), 12)  # 另存为后缀为".docx"的文件
        doc.Close()  # 关闭原.doc文件
    word.Quit()

解读步骤1的关键点:

  1. 导入win32com.client库并将其命名为wc:这是pywin32库的一部分,用于与Windows COM(Component Object Model)对象进行交互,其中包括Microsoft Office应用程序。
  2. 创建与Word应用程序的连接:通过wc.Dispatch("Word.Application"),我们创建了一个与Word应用程序的连接,以便操作Word文档。
  3. 循环遍历传递给doc2docx函数的.doc文件列表(doc_files):这个函数接受一个.doc文件的列表,可以将多个文件一次转换为.docx
  4. 打开原始的.doc文件:使用word.Documents.Open(doc_file),我们打开传递给函数的每个.doc文件。
  5. 另存为.docx格式:通过doc.SaveAs("{}x".format(doc_file), FileFormat=12),我们将打开的.doc文件另存为后缀为.docx的文件,并且FileFormat=12表示.docx文件格式。
  6. 关闭原始的.doc文件:使用doc.Close(),我们关闭原始的.doc文件,以便继续处理下一个文件。
  7. 退出Word应用程序:最后,使用word.Quit(),我们退出Word应用程序,以确保不会占用额外的系统资源。

这个函数执行后,将得到一个.docx文件的副本,可以使用python-docx库进行进一步的处理和编辑。这是将.doc文件转换为.docx文件的关键步骤,以便后续处理文档内容。

步骤 2:批量处理.doc文件

接下来,我们定义了一个函数transform来批量处理.doc文件。这个函数将递归查找目录中的.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)
                    file_paths.append(file_path)
    doc2docx(file_paths)
    print("全部.doc文件转.docx完成")

解读步骤2的关键点:

  1. 导入os库:我们使用os库来操作文件系统,以便查找目录中的文件。
  2. 定义一个空列表file_paths:这个列表将用于存储需要转换的.doc文件的文件路径。
  3. 递归查找目录中的文件:使用os.walk(directory_path),我们递归遍历指定目录(directory_path)下的所有文件和子目录。os.walk返回一个生成器,它生成每个文件的根目录、子目录和文件名。
  4. 筛选需要转换的文件:我们通过检查文件名中是否包含"推荐"和文件扩展名是否为.doc,来筛选需要转换的文件。这是一个示例条件,您可以根据实际情况进行修改。
  5. 构建文件路径并添加到file_paths列表:对于每个满足条件的文件,我们使用os.path.join(root, file)构建文件的完整路径,并将其添加到file_paths列表中。
  6. 调用doc2docx函数:我们使用之前定义的doc2docx函数来批量转换.doc文件为.docx文件。
  7. 打印完成消息:最后,我们打印一条消息,指示所有.doc文件的批量转换已完成。

这个transform函数使您能够方便地批量处理目录中的.doc文件,将它们转换为.docx格式,以便后续处理和编辑。

步骤 3:读取.docx文件中的Excel表格数据

现在,我们定义了一个函数read_word_table来读取.docx文件中的Excel表格数据。这个函数使用python-docx库来解析.docx文件中的表格,将它们转化为pandas的DataFrame对象。

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)
    return tables

步骤 4:主函数

最后,我们定义了一个主函数main,它将执行上述步骤,从.docx文件中提取Excel表格数据,并将它们汇总到一个Excel文件中。

import pandas as pd
def main(directory_path, output_file):
    all_tables = []  # 存储从.docx文件中提取的Excel表格数据列表
    # 遍历指定目录中的文件
    for root, dirs, files in os.walk(directory_path):
        for file in files:
            if root.count(os.sep) - directory_path.count(os.sep) == 1:
                # 通过检查文件名中是否包含"推荐",以及文件扩展名是否为.docx,来筛选需要处理的文件
                if "推荐" in file.lower() and file.lower().endswith('.docx'):
                    file_path = os.path.join(root, file)
                    tables = read_word_table(file_path)  # 使用之前定义的函数读取表格数据
                    all_tables.extend(tables)
    if all_tables:
        # 合并所有表格数据并去重
        all_data = pd.concat(all_tables, ignore_index=False)
        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',' '],'')
        # 将汇总后的数据保存到Excel文件
        all_data.to_excel(output_file, index=False)
        print("Excel文件汇总完成!")
    else:
        print("目录下没有符合条件的Word文件。")

解读步骤4的关键点:

  1. 导入pandas库:我们使用pandas库来处理Excel表格数据和创建Excel文件。
  2. 定义一个空列表all_tables:这个列表将用于存储从.docx文件中提取的Excel表格数据。
  3. 遍历指定目录中的文件:使用os.walk(directory_path),我们递归遍历指定目录下的所有文件和子目录,筛选出需要处理的.docx文件。
  4. 读取表格数据:使用之前定义的函数read_word_table(file_path),我们读取每个.docx文件中的Excel表格数据,并将它们添加到all_tables列表中。
  5. 合并表格数据并去重:如果存在表格数据,我们将所有表格数据合并成一个数据框(all_data),并去除重复行。
  6. 字符串处理:我们对数据框中的字符串列进行处理,例如,去除首尾空格和特定字符。
  7. 保存到Excel文件:最后,我们使用to_excel方法将处理后的数据保存到指定的Excel文件。
  8. 打印完成消息:程序执行完毕后,我们打印一条消息,指示Excel文件的汇总已完成。

这个main函数是整个处理过程的核心,它将目录中的所有符合条件的.docx文件中的Excel表格数据提取、清理并汇总到一个Excel文件中。这使得数据处理更加高效和自动化。

使用示例

在主函数中,我们需要提供包含.docx文件的目录路径和输出Excel文件的路径和名称。然后,执行transform函数将.doc文件转换为.docx文件,最后执行main函数将数据提取到Excel文件中。

if __name__ == "__main__":
    directory_path = "D:\\电网材料\\2020根植项目"  # 替换为包含Word文件的目录路径
    output_file = "2020output.xlsx"  # 输出Excel文件的路径和名称
    transform(directory_path)
    main(directory_path, output_file)

这样,我们就可以批量处理.docx文件中的Excel表格数据,并将它们整理到一个Excel文件中。这个脚本可以根据需要进行调整,以适应不同的文件结构和数据提取需求。希望这篇文章对你有所帮助!

目录
相关文章
|
1月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
142 10
|
16天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
82 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
1月前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分到不同的工作表中。本文通过一个示例代码展示了如何生成一个包含总成绩表和三个班级表的Excel文件。代码首先创建了一个包含学生姓名、班级和各科成绩的数据框,然后按班级分组,将每个班级的数据分别写入不同的工作表。最后,生成的Excel文件将包含四个工作表,分别为总成绩表和三个班级的成绩表。
37 6
按条件将Excel文件拆分到不同的工作表
|
20天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
1月前
|
Python
批量将不同的工作簿合并到同一个Excel文件
本文介绍如何使用Python的`pandas`库批量合并不同工作簿至同一Excel文件。通过模拟生成三个班级的成绩数据,分别保存为Excel文件,再将这些文件合并成一个包含所有班级成绩的总成绩单。步骤包括安装必要库、生成数据、保存与合并工作簿。
54 6
|
1月前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分为多个工作表。本文通过一个具体示例,展示了如何根据学生班级将成绩数据拆分到不同的工作表中,并生成一个包含总成绩表和各班级成绩表的Excel文件。代码简洁明了,适合初学者学习和应用。
48 6
|
3月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
207 4
|
5月前
|
关系型数据库 MySQL Shell
不通过navicat工具怎么把查询数据导出到excel表中
不通过navicat工具怎么把查询数据导出到excel表中
61 0
|
3月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
207 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
3月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。