用Python创建轻量级Excel到Markdown转换工具:简便、高效、自动化【第28篇—python:Excel到Markdown】

这篇具有很好参考价值的文章主要介绍了用Python创建轻量级Excel到Markdown转换工具:简便、高效、自动化【第28篇—python:Excel到Markdown】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

用 Python 创建 Excel 转 Markdown 的 CLI 工具

在工作中,我们常常需要将 Excel 表格转换为 Markdown 格式,以便在文档、博客或其他支持 Markdown 的平台上分享。然而,一些 Markdown 编辑器对从 Excel 复制粘贴的内容支持并不理想,导致转换后的格式混乱。另外,如果需要频繁处理相同类型的文件,手动转换显得繁琐。因此,我决定创建一个 CLI 工具,用于自动化这一转换过程。

设计思路

为了确保工具的易用性和便携性,我决定使用 Python 编写这个 CLI 工具。由于我希望同事们也能方便地使用这个工具,我决定尽量减少对第三方库的依赖,使得工具更易于部署。

Excel 文件结构解析

在着手编写代码之前,我们需要了解 Excel 文件的结构。经过简单的研究,我们发现 Excel 文件实际上是一个 ZIP 压缩包,其中包含一系列 XML 文件。具体而言,我们主要关注 sharedStrings.xmlsheet1.xml 两个文件。前者包含表格中的字符串,后者包含表格的实际数据。
用Python创建轻量级Excel到Markdown转换工具:简便、高效、自动化【第28篇—python:Excel到Markdown】,Python领域开发技术应用技术,python,excel,自动化,Markdown,转换工具

用Python创建轻量级Excel到Markdown转换工具:简便、高效、自动化【第28篇—python:Excel到Markdown】,Python领域开发技术应用技术,python,excel,自动化,Markdown,转换工具

读取 Excel 文件

首先,我们需要解压 Excel 文件。Python 的标准库中提供了 zipfile 模块,可以方便地进行文件解压。解压后,我们可以读取 sharedStrings.xml 文件,将其中的共享字符串保存为数组,以便后续引用。

import xml.dom.minidom
import zipfile
import os
import shutil

output_path = 'data'  # 解压 Excel 后的临时文件夹名称

file_path = input("请输入 Excel 文件路径:")
md_path = file_path.split('.')[0] + ".md"  # 输出的 Markdown 文件名

# 解压 Excel 文件
with zipfile.ZipFile(file_path, 'r') as zip_ref:
    zip_ref.extractall(output_path)

strings = []

# 读取共享字符串
shared_strings_path = os.path.join(output_path, "xl/sharedStrings.xml")
if os.path.exists(shared_strings_path):
    with open(shared_strings_path, 'r') as data:
        # 将 XML 文件转化为 DOM 结构
        dom = xml.dom.minidom.parse(data)
        # 找到所有 t 标签
        for string in dom.getElementsByTagName('t'):
            # 将 t 标签中的字符串值加到 strings 数组中
            strings.append(string.childNodes[0].nodeValue)

# 其他代码...

解析表格数据

接下来,我们解析 sheet1.xml 文件,将表格数据保存为一个二维数组。注意,我们需要处理单元格中可能包含的字符串索引。

result = []

# 读取表格数据
sheet_path = os.path.join(output_path, "xl/worksheets/sheet1.xml")
if os.path.exists(sheet_path):
    with open(sheet_path, 'r') as data:
        dom = xml.dom.minidom.parse(data)
        # 遍历每一个 row 标签
        for row in dom.getElementsByTagName('row'):
            row_data = []
            # 遍历 row 标签中包含的每个 c 标签
            for cell in row.getElementsByTagName('c'):
                value = ''
                # 如果该 c 标签的 t 属性值为 s,说明是字符串,需要到 strings 中获取其真实值
                if cell.getAttribute('t') == 's':
                    shared_string_index = int(cell.getElementsByTagName('v')[0].childNodes[0].nodeValue)
                    value = strings[shared_string_index]
                # 否则直接读取其值
                else:
                    value = cell.getElementsByTagName('v')[0].childNodes[0].nodeValue
                # 将这一格的数据添加到 row_data 中
                row_data.append(value)
            # 将这一行的数据添加到 result 中
            result.append(row_data)
# 其他代码...

生成 Markdown 表格

最后,我们将表格数据转换为 Markdown 格式,并保存到 Markdown 文件中。

# 构建 Markdown 表格
# 生成第一行
markdown_table = "|"
markdown_table += "|".join(result[0]) + "|"
markdown_table += "\n"
# 生成分隔行(第二行)
markdown_table += "|"
markdown_table += "|".join(["-" for _ in result[0]]) + "|"
markdown_table += "\n"
# 生成后续的行
for row in result[1:]:
    markdown_table += "|"
    markdown_table += "|".join([value for value in row]) + "|"
    markdown_table += "\n"
# 去除多余的换行符
markdown_table = markdown_table[:-1]

# 生成 Markdown 文件
with open(md_path, 'w') as md_file:
    md_file.write(markdown_table)

# 其他代码...

完整代码

最终的完整代码如下:

import xml.dom.minidom
import zipfile
import os
import shutil

output_path = 'data'  # 解压 Excel 后的临时文件夹名称

file_path = input("请输入 Excel 文件路径:")
md_path = file_path.split('.')[0] + ".md"  # 输出的 Markdown 文件名

# 解压 Excel 文件
with zipfile.ZipFile(file_path, 'r') as zip_ref:
    zip_ref.extractall(output_path)

strings = []

# 读取共享字符串
shared_strings_path = os.path.join(output_path, "xl/sharedStrings.xml")
if os.path.exists(shared_strings_path):
    with open(shared_strings_path, 'r') as data:
        # 将 XML 文件转化为 DOM 结构
        dom = xml.dom.minidom.parse(data)
        # 找到所有 t 标签
        for string in dom.getElementsByTagName('t'):
            # 将 t 标签中的字符串值加到 strings 数组中
            strings.append(string.childNodes[0].nodeValue)

result = []

# 读取表格数据
sheet_path = os.path.join(output_path, "xl/worksheets/sheet1.xml")
if os.path.exists(sheet_path):
    with open(sheet_path, 'r') as data:
        dom = xml.dom.minidom.parse(data)
        # 遍历每一个 row 标签
        for row

 in dom.getElementsByTagName('row'):
            row_data = []
            # 遍历 row 标签中包含的每个 c 标签
            for cell in row.getElementsByTagName('c'):
                value = ''
                # 如果该 c 标签的 t 属性值为 s,说明是字符串,需要到 strings 中获取其真实值
                if cell.getAttribute('t') == 's':
                    shared_string_index = int(cell.getElementsByTagName('v')[0].childNodes[0].nodeValue)
                    value = strings[shared_string_index]
                # 否则直接读取其值
                else:
                    value = cell.getElementsByTagName('v')[0].childNodes[0].nodeValue
                # 将这一格的数据添加到 row_data 中
                row_data.append(value)
            # 将这一行的数据添加到 result 中
            result.append(row_data)

# 删除临时文件夹
shutil.rmtree(output_path)

# 构建 Markdown 表格
# 生成第一行
markdown_table = "|"
markdown_table += "|".join(result[0]) + "|"
markdown_table += "\n"
# 生成分隔行(第二行)
markdown_table += "|"
markdown_table += "|".join(["-" for _ in result[0]]) + "|"
markdown_table += "\n"
# 生成后续的行
for row in result[1:]:
    markdown_table += "|"
    markdown_table += "|".join([value for value in row]) + "|"
    markdown_table += "\n"
# 去除多余的换行符
markdown_table = markdown_table[:-1]

# 生成 Markdown 文件
with open(md_path, 'w') as md_file:
    md_file.write(markdown_table)

当你运行这个 Python 脚本时,它会提示你输入 Excel 文件的路径,然后它将在同一目录下生成一个相应的 Markdown 文件。

接下来,我们可以进一步改进这个 CLI 工具,增加一些功能,例如:

1. 参数化文件路径:

将文件路径作为脚本的参数传递,而不是在运行时手动输入。

import sys

if len(sys.argv) < 2:
    print("请提供 Excel 文件路径作为参数")
    sys.exit(1)

file_path = sys.argv[1]

然后你可以通过命令行运行脚本:

python excel_to_markdown.py path/to/your/excel/file.xlsx

2. 处理不同的工作表:

当前脚本仅处理第一个工作表(sheet1.xml)。你可以扩展脚本以允许用户选择或处理所有工作表。

3. 改进 Markdown 表格生成:

目前的 Markdown 表格生成方法非常基础。你可以考虑使用更先进的库,如 tabulatepandas,以提高表格生成的灵活性和美观性。

4. 错误处理:

添加更多的错误处理,以确保在解析文件时能够容错并给出有用的错误信息。

5. 打包为可执行文件:

你可以使用诸如 PyInstallercx_Freezepy2exe 等工具,将脚本打包为可执行文件,使得用户无需安装 Python 解释器即可运行。

6. 增加日志:

在脚本中添加日志功能,以记录程序运行的关键步骤,便于调试和追踪问题。

7. 进一步优化性能:

如果处理大型 Excel 文件时性能成为问题,可以考虑优化代码以更有效地处理数据。

以上是一些可以考虑的改进和扩展点,具体取决于你的需求和使用场景。希望这个简单的工具对你有帮助,如果有任何问题或进一步的需求,请随时提出。

总结

通过这个简单的 Python CLI 工具,我们可以方便地将 Excel 文件转换为 Markdown 格式。该工具减少了对第三方库的依赖,使得代码更加轻量、易读。你可以根据需要扩展该工具,添加更多功能,以适应不同的使用场景。文章来源地址https://www.toymoban.com/news/detail-798456.html

到了这里,关于用Python创建轻量级Excel到Markdown转换工具:简便、高效、自动化【第28篇—python:Excel到Markdown】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用python电脑轻量级控制手机—adb命令和手机投屏

    通过电脑控制手机有多种方式如appnium等,本文介绍的是两种轻量级的方案,使用adb命令刚和手机投屏。 1、手机设置 开发者选项—usb调试—无线调试 2、配对 仅配对时用,第一次配对成功后无需再次使用。 2.1、adb pair 手机IP:端口,下图蓝色部分的ip和端口 2.2、输入配对码。

    2024年02月03日
    浏览(24)
  • python轻量级web框架flask初探,搭建网站原来这么简单

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开

    2024年03月19日
    浏览(39)
  • python开发构建轻量级卷积神经网络模型实现手写甲骨文识别系统

    手写汉字、手写数字、手写字母识别模型都已经做过很多了,但是手写甲骨文识别这个应该都是很少有听说过的吧,今天也是看到这个数据集就想着基于这批手写甲骨文数据集开发构建识别模型,首先来看下效果图: 接下来看下对应使用的数据集:  共包含40个不同类别对象

    2024年02月08日
    浏览(24)
  • python Web开发 flask轻量级Web框架实战项目--学生管理系统

     上次发的一篇文章,有很多朋友私信我要后面的部分,那咱们就今天来一起学习一下吧,因为我的数据库这门课选中的课题是学生管理系统,所以今天就以这个课题为例子,从0到1去实现一个管理系统。数据库设计部分我会专门出一个博客的,敬请期待吧~~~ 介如很多朋友问

    2024年02月16日
    浏览(29)
  • Thonny-适合初学者小白的开箱即用的轻量级 Python IDE

    如果你是一位Python初学者小白,那最适合Thonny它了,如果不是初学者,请选择PyDev和Pycharm。 Thonny是一款面向初学者小白的轻量级 IDE,可以让初学者更好更快的入门上手 Python,而不致于在环境上浪费过多的时间。 取之 Python,用之Python,Thonny 是基于 Python 内置图形库 tkinter开发

    2024年02月16日
    浏览(20)
  • git轻量级服务器gogs、gitea,非轻量级gitbucket

    本文来源:git轻量级服务器gogs、gitea,非轻量级gitbucket, 或 gitcode/gogs,gitea.md 结论: gogs、gitea很相似 确实轻, gitbucket基于java 不轻, 这三者都不支持组织树(嵌套组织 nested group) 只能一层组织。 个人用,基于gogs、gitea,两层结构树 简易办法: 把用户当成第一层节点、该用户的

    2024年02月07日
    浏览(32)
  • 轻量灵动: 革新轻量级服务开发

    从 JDK 8 升级到 JDK 17 可以让你的应用程序受益于新的功能、性能改进和安全增强。下面是一些 JDK 8 升级到 JDK 17 的最佳实战: 1.1、确定升级的必要性:首先,你需要评估你的应用程序是否需要升级到 JDK 17。查看 JDK 17 的新特性、改进和修复的 bug,以确定它们对你的应用程序

    2024年02月07日
    浏览(26)
  • Python实现轻量级WEB服务器接收HTTP提交的RFID刷卡信息并回应驱动读卡器显示播报语音

     本示例使用的设备:RFID网络WIFI无线TCP/UDP/HTTP可编程二次开发读卡器POE供电语音-淘宝网 (taobao.com)

    2024年02月12日
    浏览(18)
  • 轻量级 HTTP 请求组件

    Apache HttpClient 是著名的 HTTP 客户端请求工具——现在我们模拟它打造一套简单小巧的请求工具库, 封装 Java 类库里面的 HttpURLConnection 对象来完成日常的 HTTP 请求,诸如 GET、HEAD、POST 等等,并尝试应用 Java 8 函数式风格来制定 API。 组件源码在:https://gitee.com/sp42_admin/ajaxjs/tr

    2024年02月01日
    浏览(36)
  • Tomcat轻量级服务器

    目录 1.常见系统架构  C-S架构 B-S架构 2.B-S架构系统的通信步骤 3.常见WEB服服务器软件 4.Tomcat服务器的配置 下载安装 环境变量配置 测试环境变量是否配置成功 测试Tomcat服务器是否配置成功  Tomcat窗口一闪而过的解决步骤 Tomcat解决乱码 介绍: C-S架构即Client/Server(客户端/服务

    2023年04月14日
    浏览(93)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包