【python】批量读取Word文档中的特定表格并保存为Excel文件

news2024/11/13 10:23:31

批量读取Word文档中的特定表格并保存为Excel文件

在工作中,我们常常需要从多个Word文档中提取数据,然后将这些数据汇总到一个Excel文件中进行分析。下面,我将分享一个Python脚本,它可以从多个Word文档中读取特定的表格数据,并将这些数据保存到一个Excel文件中。

代码实现

我们首先导入所需的库:

import os
import re
import pandas as pd
from docx import Document

然后,我们定义一个函数来从Word文档中读取特定表格并转换为DataFrame:在这里插入图片描述
这是此次的文件内容,我们想读取表格中的内容。如:第二个表格中总分的均分项,我们要定义相关参数(函数内部已说明。)

# 从Word文档中读取特定表格并转换为DataFrame
def read_table_from_word(document, table_index, rows, cols):
   """
    从指定的Word文档中的指定单元格提取数据

    参数:
    doc: Document对象,代表一个Word文档
    table_index: int,要读取的表格索引
    rows: list,要读取的行索引
    cols: list,要读取的列索引

    返回值:
    data: list,提取的数据
    """
    table = document.tables[table_index]
    data = [
        [table.cell(row_idx, col_idx).text for col_idx in cols]
        for row_idx in rows if row_idx < len(table.rows)
    ]      
    return data

接下来是主函数,用于批量读取特定模式的Word文档中的表格数据(如下):
在这里插入图片描述

# 主函数,批量读取特定模式的Word文档中的表格数据
def read_every_word_file(folder_path, keyword, start_num, end_num, table_index, rows, cols):
    """
    读取文件夹中包含特定关键字的所有Word文件,并提取指定表格中的数据

    参数:
    folder_path: str,文件夹路径
    keyword: str,文件名中包含的关键字,示例中我使用:SCL90
    table_index: int,要读取的表格索引
    rows: list,要读取的行索引
    cols: list,要读取的列索引

    返回值:
    all_data: list,所有Word文件中提取的数据
    """
    # 获取文件夹中的所有文件名
    files = os.listdir(folder_path)
    
    # 过滤文件名,筛选出包含关键字的文件
    files_with_keyword = [f for f in files if keyword in f]

    # 初始化一个空的DataFrame列表
    dataframes_list = []

    # 遍历所有预想的文件编号
    for num in range(start_num, end_num + 1):
        # 构建文件编号字符串,确保编号长度为3位,为符合示例中的文件名格式
        num_str = str(num).zfill(3)
        # 使用模板和当前数字构建正则表达式(根据实际文件名设置,或者依据AI分析得出)
        pattern1 = f"B{num_str}--{keyword}.doc"
        pattern2 = f"B{num_str}---{keyword}.doc"
        """	注:AI生成的正则表达式并不完善,需要根据实际调整。"""

        # 检查文件是否存在且符合模式
        if pattern1 in files_with_keyword:
            # 文件存在且符合模式,读取数据
            file_path = os.path.join(folder_path, pattern1)
            doc = Document(file_path)
            try:
                df = read_table_from_word(doc, table_index, rows, cols)
            except Exception as e:
                print(f"读取文件 {pattern1} 错误: {e}")
                df = pd.DataFrame()
            dataframes_list.append(df)
        elif pattern2 in files_with_keyword:
            # 文件存在且符合模式,读取数据
            file_path = os.path.join(folder_path, pattern2)
            doc = Document(file_path)
            try:
                df = read_table_from_word(doc, table_index, rows, cols)
            except Exception as e:
                print(f"读取文件 {pattern2} 错误: {e}")
                df = pd.DataFrame()
            dataframes_list.append(df)
        else:
            # 文件不存在或不符合模式,记录为空DataFrame
            dataframes_list.append(pd.DataFrame())

    # 创建DataFrame列表
    dfs = []
    for data in dataframes_list:
        # 将字符串转换为整数
        int_data = [int(item[0]) for item in data]
        # 创建DataFrame
        df = pd.DataFrame(int_data, columns=['Data'])
        dfs.append(df)

    return dfs

最后,我们定义一个函数来保存DataFrame列表到同一个Excel工作表:

# 定义函数来保存DataFrame列表到同一个Excel工作表
def save_dataframes_to_same_sheet(dfs, excel_path):
    # 使用with语句确保文件正确关闭
    with pd.ExcelWriter(excel_path, engine='openpyxl', mode='w') as writer:
        # 写入第一个DataFrame
        df_transposed = dfs[0].T
        df_transposed.to_excel(writer, sheet_name='Sheet1',startrow=1, index=False, header=False)
        
        # 获取第一个DataFrame的高度(行数)
        startrow = df_transposed[0].shape[0]+1
        
        # 剩余DataFrame的处理
        for df in dfs[1:]:
            if df.empty:  # 如果DataFrame为空
                df_transposed =  df.T
                # 仅写入标题行(即使没有数据),以保留一行空白
                df_transposed.columns.to_series().to_frame(name=None).to_excel(writer, sheet_name='Sheet1', startrow=startrow, index=False, header=False)
                # 空DataFrame增加的行数为1
                startrow += 1
            else:
                df_transposed =  df.T
                df_transposed.to_excel(writer, sheet_name='Sheet1', startrow=startrow, index=False, header=False)
                # 非空DataFrame增加的行数为其行数
                startrow += df_transposed.shape[0]
            
    print(f'数据已保存至{excel_path}的Sheet1')

配置参数并执行代码

我们需要配置一些参数,然后调用上述函数来读取文件并保存数据:

# 配置参数
folder_path = '相对文件夹路径'
excel_path = '保存Execl文件的相对路径'

# 调用函数读取文件
dataframes = read_every_word_file(folder_path, 'SCL90', 1, 79, 1, [1,2,3,4,5,6,7,8,9,10,11], [1])
# 保存数据到Excel
save_dataframes_to_same_sheet(dataframes, excel_path)

这样,我们就可以从指定的Word文档中读取表格数据,并将这些数据保存到一个Excel文件中。希望这个脚本对你有所帮助!

并不具有普适性,请在修改后使用!

欢迎提出见解和指正错误!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953931.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

暑期c++ 命名空间

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 今天是暑期第一天开始写c笔记&#xff0c;新起点&#xff0c;新开始加油 我们先来看两串代码 这串代码编译没有问题 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int rand 14; int main(…

手机图片如何转化为word文档?分享3种好用的软件。

在数字化时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。随着手机拍照功能的日益强大&#xff0c;我们常常用手机记录下重要的信息和瞬间。但你有没有遇到过这样的烦恼&#xff1a;如何将手机里的图片快速转化为可编辑的Word文档呢&#xff1f;今天&#xff0c;就为…

从工艺到性能:模具3D打印材料不断革新

在模具3D打印领域&#xff0c;材料性能的持续优化与创新是推动模具3D打印的关键因素&#xff0c;近年来&#xff0c;各种3D打印新材料不断涌现&#xff0c;模具3D打印材料也开始重工艺导向逐步向性能导向发展&#xff0c;如毅速公司推出的ESU-EM191/191S及ESU-EM201不锈钢粉末、…

C语言 | Leetcode C语言题解之第299题猜数字游戏

题目&#xff1a; 题解&#xff1a; #define MIN(a, b) ((a) < (b) ? (a) : (b))char * getHint(char * secret, char * guess){int A 0;int B 0;int dicS[10] {0};int dicG[10] {0};int i 0;while(secret[i]){if(secret[i] guess[i]){//同位置且相等&#xff08;完…

【React】useState:状态管理的基石

文章目录 一、什么是 useState&#xff1f;二、useState 的基本用法三、useState 的工作原理四、高级用法五、最佳实践 在现代前端开发中&#xff0c;React 是一个非常流行的库&#xff0c;而 useState 是 React 中最重要的 Hook 之一。useState 使得函数组件能够拥有自己的状态…

RHEL 7.6 安装oracle database 19c Real Application Cluster Part5: RU配置

RHEL 7.6 安装oracle database 19c Real Application Cluster Part1: 基础环境配置 RHEL 7.6 安装oracle database 19c Real Application Cluster Part2: Grid Infrastructure配置 RHEL 7.6 安装oracle database 19c Real Application Cluster Part3: ASM磁盘组配置 RHEL 7.…

《程序猿入职必会(5) · CURD 页面细节规范 》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

深入理解多态:发工资

看完目录就可以大概理解了&#xff0c;然后就需要去敲一敲代码&#xff0c;不过这个多态还确实挺厉害的。 目录 做一件事 员工1&#xff1a;干第一个过程 员工2&#xff1a;干第二个过程 员工3&#xff1a;干第三个过程 员工4&#xff1a;干第四个过程 员工5&#xff1a;…

Live555源码阅读笔记:哈希表的实现(C++)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

重生之“我打数据结构,真的假的?”--6.排序

1.排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使⼀串记录&#xff0c;按照其中的某个或某些关键字的⼤⼩&#xff0c;递增或递减的排列起来的 操作。 1.1排序分类 2.排序算法实现 2.1插入排序 直接插⼊排序是⼀种简单的插⼊排序法&#xff0c;其基本思想是&#…

深入探索Python3网络爬虫:构建数据抓取与解析的强大工具

前言 在当今这个信息爆炸的时代&#xff0c;数据成为了驱动各行各业发展的关键要素。无论是市场分析、用户行为研究&#xff0c;还是内容聚合与推荐系统&#xff0c;都需要从海量的互联网数据中提取有价值的信息。而网络爬虫&#xff0c;作为自动化获取网页数据的技术手段&…

FPGA开发——按键的使用及其消抖方法

一、概述 我们在进行各种硬件开发时通常都会实现多效果的综合和实现&#xff0c;而在实际的开发中&#xff0c;每个时刻只会显示单个效果&#xff0c;这就需要涉及到效果之间的切换了&#xff0c;而要实现状态切换最好的就是使用按键进行按键&#xff0c;所以按键在我们的日常…

Redis知识点总价

1 redis的数据结构 2 redis的线程模型 1&#xff09; Redis 采用单线程为什么还这么快 之所以 Redis 采用单线程&#xff08;网络 I/O 和执行命令&#xff09;那么快&#xff0c;有如下几个原因&#xff1a; Redis 的大部分操作都在内存中完成&#xff0c;并且采用了高效的…

深度学习系列69:模型部署的基础知识

参考https://mp.weixin.qq.com/s?__bizMzI4MDcxNTY2MQ&mid2247488952&idx1&sn880d3ad47a8fb3eab56514135f0e643b&chksmebb51d5adcc2944c276af19e8cff5e73c934f8811706be0a94c5f47f9e767c902939903e6b95&scene21#wechat_redirect 1. 基本流水线 1.1 介绍…

掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了

掀桌子了&#xff01;原来是咱们的大屏设计太酷&#xff0c;吓着前端开发老铁了 艾斯视觉观点认为&#xff1a;在软件开发的世界里&#xff0c;有时候创意和设计的火花会擦得特别亮&#xff0c;以至于让技术实现的伙伴们感到既兴奋又紧张。这不&#xff0c;我们的设计团队刚刚…

故障诊断 | 基于Transformer故障诊断分类预测(Matlab)

文章目录 预测效果文章概述程序设计参考资料预测效果 文章概述 Transformer故障诊断/分类预测 | 基于Transformer故障诊断分类预测(Matlab) Transformer 模型本质上都是预训练语言模型,大都采用自监督学习 (Self-supervised learning) 的方式在大量生语料上进行训练,也就是…

【Django】开源前端库bootstrap,常用

文章目录 下载bootstrap源文件到本地项目引入bootstrap文件 官网&#xff1a;https://www.bootcss.com/V4版本入口&#xff1a;https://v4.bootcss.com/V5版本入口&#xff1a;https://v5.bootcss.com/ 这里使用成熟的V4版本&#xff0c;中文文档地址&#xff1a;https://v4.b…

优化mac outlook通过nginx反向代理后使用ews访问Exchange 2016邮件访问速度慢的有效方法

在nginx配置exchange的反向代理后,mac系统上通过exchange邮箱,通过nginx代理连接邮箱,发现速度很慢,通过查看日志,也存在大量的401失败日志。通过不断的优化和尝试,目前来看,基本上正常了,基本上没有出现大量访问失败的问题。以下就是优化过程中尝试过的方法。 1. 身份…

java学习--包装类

包装类 Boolean的关系图 Character关系图 其他关系图 包装类和基本数据转换 Debug进入之后可以看到底层代码如下 例题&#xff1a; 三元运算符是一个整体返回的数的类型看其中所含类型最高的那个是谁就会转成哪个 想要掌握这个这个知识&#xff0c;就要多看源码&#xff0c;直接…

深入理解计算机系统 CSAPP 家庭作业11.10

A: //home.html <form action"/cgi-bin/adder" method"GET"><ul><li><label for"n1">n1:</label><input type"text" id"n1" name"n1" /> //name的值决定页面提交后&#xf…