当前位置: 首页 > news >正文

Python解析DOC文档表格

目录

一、编写目的

二、环境准备

一、安装LibreOffice

 二、安装python-docx

三、代码实现

一、转换成docx

二、读取和修改

四、总结


欢迎来到 盹猫(>^ω^<)的博客

本篇文章主要介绍了

[Python解析DOC文档表格]
❤博主广交技术好友,喜欢文章的可以关注一下❤


一、编写目的

        最近由于工作上的需要,需要使用Python完成DOC文档格式数据的读取和修改工作,但通过查阅相关资料,直接对DOC文档进行读取和修改没有相关的依赖(主要为doc文件为较早的windows系统支持格式),需要将DOC文件转换为.docx格式,为什么是docx格式?

  • .docx 是 XML 格式,通常无编码问题​​,但若从其他格式转换可能出错。
  • python-docx依赖库可以直接对docx文档格式进行操作,但无法对doc格式进行操作。

那么问题就转变为如何将doc格式转换为.docx格式的问题,有下面的解决方法:

  • 如果你在windows系统上且安装有Microsoft Word 可以使用pywin32调用Word提供的COM口进行格式转换。

那如果就不想花钱或者安装Word,或者我使用的是其它系统(如Linux系统)又该如何转换doc格式到.docx格式呢?
        这里也找到了相关的软件支持:LibreOffice。它提供了和Word几乎相同的功能,但其为免费开源的,并且可以通过命令行进行调用,最重要的可以多系统支持。

        本篇文章就是记录使用LibreOffice+python-docx完成doc文档内表格的转换和修改的。

二、环境准备

一、安装LibreOffice

如果是Windows系统可以官网下载LibreOffice的.exe安装包,然后就是不断地下一步即可。

如果是Linux系统可以通过下面的命令进行安装:

Ubuntu/Debian​​:

sudo apt update && sudo apt install libreoffice

 ​Fedora​​:

sudo dnf install libreoffice

​openSUSE​​:

sudo zypper install libreoffice

安装完成后,可以在命令行中进行版本验证:

soffice --version

如果输出下述内容则表明安装成功:

LibreOffice 25.2.3.2 bbb074479178df812d175f709636b368952c2ce3

 二、安装python-docx

 在已有的python环境下安装python-docx可以使用以下命令:

pip install python-docx

三、代码实现

一、转换成docx

 根据上面的步骤,先进行doc到docx的转换,我们可以使用以下命令进行转换:

soffice --headless --convert-to <目标格式> <输入文件> [--outdir <输出目录>]

 当然这里需要再Python中进行命令行的调用,直接上代码:

import os
import subprocess
import redef convert_doc_to_docx(doc_path, output_dir, soffice_path=None):"""使用 LibreOffice 将 .doc 转换为 .docx:param doc_path: .doc 文件路径:param output_dir: 输出目录(默认当前目录):param soffice_path: LibreOffice 的 soffice.exe 完整路径(可选):return: 转换后的 .docx 文件路径"""if not doc_path.lower().endswith('.doc'):raise ValueError("输入文件必须是 .doc 格式")# 确保输出目录存在os.makedirs(output_dir, exist_ok=True)# 构造输出路径base_name = os.path.splitext(os.path.basename(doc_path))[0]docx_path = os.path.join(output_dir, f"{base_name}.docx")# 检查 LibreOffice 是否安装if soffice_path is None:try:# 尝试调用 soffice 命令subprocess.run(["soffice", "--version"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)soffice_cmd = ["soffice"]except FileNotFoundError:raise RuntimeError("LibreOffice 未安装或未添加到系统 PATH 中。请确保 LibreOffice 已正确安装并在 PATH 中,或提供 soffice.exe 的完整路径。")else:soffice_cmd = [soffice_path]# 使用 LibreOffice 转换try:subprocess.run(soffice_cmd + ["--headless","--nodefault","--nologo", "--convert-to", "docx", "--outdir", output_dir, doc_path],check=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)if not os.path.exists(docx_path):raise RuntimeError(f"转换失败,未找到输出文件: {docx_path}")return docx_pathexcept subprocess.CalledProcessError as e:error_msg = f"转换失败: {e.stderr.decode()}"raise RuntimeError(error_msg)

在上面的代码中先进行LibreOffice环境是否安装的检测,然后调用命令行进行目标文件的转换,转换完成的文件放到output_dir目录下。

二、读取和修改

          转换成docx文件后就可以使用python-docx依赖对数据进行操作了,下面的Python代码实现了docx文档内表格的读取:

from docx import Documentdef read_docx_tables(docx_path):"""使用 python-docx 读取 .docx 文件中的表格:param docx_path: .docx 文件路径:return: 表格数据列表(每行是一个列表)"""try:doc = Document(docx_path)except Exception as e:raise RuntimeError(f"无法读取 .docx 文件: {e}")tables_data = []for i, table in enumerate(doc.tables):print(f"\n表格 {i + 1}:")table_data = []for row_idx, row in enumerate(table.rows):row_data = [cell.text.strip() for cell in row.cells]# 清理单元格中的特殊字符row_data = [clean_text(cell) for cell in row_data]table_data.append(row_data)print(row_data)tables_data.append(table_data)return tables_data

 修改起来也是非常方便的,只需要在更新row.cells[索引].text后,执行一下doc.save(docx_path)的操作,代码如下:

from docx import Documentdef modify_docx_tables(docx_path, output_path=None, modify_func=None):"""仅修改 .docx 文件中的表格数据(不读取原有数据):param docx_path: 输入的 .docx 文件路径:param output_path: 输出的 .docx 文件路径(如果为 None,则覆盖原文件):param modify_func: 修改表格数据的函数(接收 table 并直接修改)"""if output_path is None:output_path = docx_path  # 默认覆盖原文件try:doc = Document(docx_path)except Exception as e:raise RuntimeError(f"无法读取 .docx 文件: {e}")for i, table in enumerate(doc.tables):print(f"\n修改表格 {i + 1}:")"""示例修改函数:将所有单元格内容改为 "MODIFIED""""for row in table.rows:for cell in row.cells:cell.text = "MODIFIED"  # 直接修改单元格内容# 保存修改后的文档doc.save(output_path)print(f"\n表格数据已修改并保存到: {output_path}")

四、总结

        上面就是对doc格式的文档表格的读取和修改操作的全部内容了,虽然doc文件格式比较落后,但不可避免的有些公司可能有些比较古老的系统,在日常生产中就使用到doc文件格式,如果你有这方面的需求,希望这篇文章能帮助到你。


如果你对区块链内容感兴趣可以查看我的专栏:小试牛刀-区块链

感谢您的关注和收藏!!!!!!

http://www.xdnf.cn/news/700543.html

相关文章:

  • Ovito建模并正交化方法
  • 删除队列中整数
  • 股票收益率的计算
  • 新能源工厂环境监控系统如何提升电池生产洁净度
  • C# async/await 完全指南:从入门到实践
  • API 与 SPI
  • iframe三方页面嵌入
  • 【深度学习-pytorch篇】3. 优化器实现:momentum,NAG,AdaGrad,RMSProp,Adam
  • 张 测试大数据集的效果
  • 国内外AI编程工具对比(Trae对比Cursor)
  • 【网络通信】网络通信全解
  • 【操作系统】硬件结构知识点详解
  • jenkins配置ssh server通过ssh自动上传构建文件及执行脚本
  • 教师申报书课题——项目名称: 基于DeepSeek-R1与飞书妙记的课堂话语智能分析实践计划
  • NVIDIA Mellanox BlueField-2 DPU(Data Processing Unit)智能网卡的调试和使用
  • 碰一碰系统源码搭建==saas系统
  • 【HALCON】 深入解析 select_gray 算子
  • 英雄类(Hero)
  • chapter2-处理文本数据
  • 使用dig查看dns递归查询过程
  • Python编程6——面向对象编程1
  • 在 WSL 中安装 JetBrains Toolbox:完整指南
  • Lua中table、模块、元表和元方法
  • VScode单双引号、分号格式
  • 基于ssm的商城系统(全套)
  • Metasploit工具使用详解(中)笔记
  • 生成式人工智能:R²AIN SUITE 助力零售业的效率革命
  • 贪心算法求解汽车加油问题
  • Typora中文直装版
  • VB.NET中Load事件问题解决方案