将 Markdown 表格结构转换为Excel 文件

发布于:2025-03-29 ⋅ 阅读:(23) ⋅ 点赞:(0)

在数据管理和文档编写过程中,我们经常使用 Markdown 来记录表格数据。然而,Markdown 格式的表格在实际应用中不如 Excel 方便,特别是需要进一步处理数据时。因此,我们开发了一个使用 wxPython 的 GUI 工具,将 Markdown 表格结构转换为 Excel 文件。
C:\pythoncode\new\MarkdownToExcel.py
在这里插入图片描述

所有代码

import wx
import re
import openpyxl
import logging

class MarkdownToExcelApp(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='Markdown 转 Excel', size=(800, 600))
        
        # 配置日志
        logging.basicConfig(level=logging.DEBUG, 
                            format='%(asctime)s - %(levelname)s - %(message)s',
                            filename='markdown_to_excel_debug.log',
                            filemode='w')
        
        # 创建面板
        panel = wx.Panel(self)
        
        # 创建垂直布局
        main_sizer = wx.BoxSizer(wx.VERTICAL)
        
        # 输入标签
        input_label = wx.StaticText(panel, label='请输入Markdown表格结构:')
        main_sizer.Add(input_label, 0, wx.ALL | wx.EXPAND, 10)
        
        # 输入文本框
        self.input_text = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
        main_sizer.Add(self.input_text, 1, wx.ALL | wx.EXPAND, 10)
        
        # 转换按钮
        convert_btn = wx.Button(panel, label='转换为Excel')
        convert_btn.Bind(wx.EVT_BUTTON, self.on_convert)
        main_sizer.Add(convert_btn, 0, wx.ALL | wx.CENTER, 10)
        
        # 日志文本框
        self.log_text = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_READONLY)
        main_sizer.Add(self.log_text, 1, wx.ALL | wx.EXPAND, 10)
        
        # 设置面板的布局
        panel.SetSizer(main_sizer)
        
        # 创建菜单栏
        menubar = wx.MenuBar()
        file_menu = wx.Menu()
        exit_item = file_menu.Append(wx.ID_EXIT, '退出', '退出应用程序')
        menubar.Append(file_menu, '文件')
        self.SetMenuBar(menubar)
        
        # 绑定菜单事件
        self.Bind(wx.EVT_MENU, self.on_exit, exit_item)
        
        # 居中显示
        self.Centre()
    
    def log_and_display(self, message):
        """记录日志并在界面显示"""
        logging.debug(message)
        self.log_text.AppendText(message + '\n')
    
    def parse_markdown_structure(self, markdown_text):
        """解析Markdown表格结构"""
        self.log_and_display("开始解析Markdown表格结构")
        
        # 存储表格信息的字典
        table_structure = {}
        
        # 按表格分割
        table_blocks = markdown_text.split('* **')
        
        for block in table_blocks[1:]:  # 跳过第一个空元素
            # 分割表格名称和字段
            lines = block.split('\n')
            table_name = lines[0].strip()
            
            # 提取字段
            fields = []
            for line in lines[1:]:
                line = line.strip()
                if line.startswith('* '):
                    # 移除 '* ' 前缀
                    fields.append(line[2:].strip())
            
            self.log_and_display(f"表格: {table_name}")
            self.log_and_display(f"字段: {fields}")
            
            # 存储表格结构
            table_structure[table_name] = fields
        
        self.log_and_display(f"解析完成,总表格数: {len(table_structure)}")
        return table_structure
    
    def on_convert(self, event):
        """转换Markdown结构到Excel"""
        # 清空之前的日志
        self.log_text.Clear()
        
        markdown_text = self.input_text.GetValue()
        
        if not markdown_text.strip():
            wx.MessageBox('请输入Markdown表格结构', '错误', wx.OK | wx.ICON_ERROR)
            return
        
        try:
            # 解析Markdown结构
            table_structure = self.parse_markdown_structure(markdown_text)
            
            # 创建工作簿
            wb = openpyxl.Workbook()
            
            # 为每个表格创建sheet
            first_sheet = True
            for table_name, fields in table_structure.items():
                self.log_and_display(f"创建sheet: {table_name}")
                
                if first_sheet:
                    # 重命名第一个sheet
                    ws = wb.active
                    ws.title = table_name.split(' ')[0][:31]  # Excel sheet名称长度限制
                    first_sheet = False
                else:
                    ws = wb.create_sheet(title=table_name.split(' ')[0][:31])
                
                # 写入表头
                for col, field in enumerate(fields, start=1):
                    ws.cell(row=1, column=col, value=field)
                
                # 添加一个示例行(可选)
                for col, field in enumerate(fields, start=1):
                    ws.cell(row=2, column=col, value=f"示例{field}")
            
            # 保存文件
            save_dialog = wx.FileDialog(
                self, 
                "保存Excel文件", 
                wildcard="Excel文件 (*.xlsx)|*.xlsx", 
                style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT
            )
            
            if save_dialog.ShowModal() == wx.ID_OK:
                filename = save_dialog.GetPath()
                wb.save(filename)
                self.log_and_display(f'Excel文件已保存:{filename}')
                wx.MessageBox(f'Excel文件已保存:{filename}', '成功', wx.OK | wx.ICON_INFORMATION)
            
            save_dialog.Destroy()
        
        except Exception as e:
            error_msg = f'转换出错:{str(e)}'
            self.log_and_display(error_msg)
            wx.MessageBox(error_msg, '错误', wx.OK | wx.ICON_ERROR)
    
    def on_exit(self, event):
        """退出应用程序"""
        self.Close(True)

def main():
    app = wx.App()
    frame = MarkdownToExcelApp()
    frame.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()

1. 项目概述

本项目提供一个图形界面,用户可以输入 Markdown 格式的表格结构,程序解析后生成 Excel 文件。该应用具备以下功能:

  • 支持 Markdown 格式的表格结构解析。
  • 生成 Excel 文件,每个表格对应一个工作表。
  • 记录日志,方便调试。
  • 提供 GUI 界面,用户体验友好。

2. 代码解析

2.1 依赖库
import wx
import re
import openpyxl
import logging
  • wx 用于创建 GUI 界面。
  • re 用于正则表达式解析 Markdown 表格。
  • openpyxl 用于创建 Excel 文件。
  • logging 记录调试信息。
2.2 GUI 设计
class MarkdownToExcelApp(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='Markdown 转 Excel', size=(800, 600))
  • wx.Frame 创建主窗口,标题为“Markdown 转 Excel”。
  • 设置窗口大小为 800x600。
# 配置日志
logging.basicConfig(level=logging.DEBUG, 
                    format='%(asctime)s - %(levelname)s - %(message)s',
                    filename='markdown_to_excel_debug.log',
                    filemode='w')
  • 记录日志到 markdown_to_excel_debug.log,用于调试。
# 创建面板
panel = wx.Panel(self)
# 创建垂直布局
main_sizer = wx.BoxSizer(wx.VERTICAL)
  • wx.Panel 是 GUI 的容器。
  • wx.BoxSizer(wx.VERTICAL) 采用垂直布局管理组件。
2.3 解析 Markdown 结构
def parse_markdown_structure(self, markdown_text):
    self.log_and_display("开始解析Markdown表格结构")
    table_structure = {}
    table_blocks = markdown_text.split('* **')
    for block in table_blocks[1:]:
        lines = block.split('\n')
        table_name = lines[0].strip()
        fields = [line[2:].strip() for line in lines[1:] if line.startswith('* ')]
        self.log_and_display(f"表格: {table_name}")
        self.log_and_display(f"字段: {fields}")
        table_structure[table_name] = fields
    self.log_and_display(f"解析完成,总表格数: {len(table_structure)}")
    return table_structure
  • split('* **') 将 Markdown 文本按表格名称分割。
  • 逐行解析字段。
  • 记录日志信息。
2.4 生成 Excel
def on_convert(self, event):
    markdown_text = self.input_text.GetValue()
    if not markdown_text.strip():
        wx.MessageBox('请输入Markdown表格结构', '错误', wx.OK | wx.ICON_ERROR)
        return
    try:
        table_structure = self.parse_markdown_structure(markdown_text)
        wb = openpyxl.Workbook()
        first_sheet = True
        for table_name, fields in table_structure.items():
            ws = wb.active if first_sheet else wb.create_sheet(title=table_name.split(' ')[0][:31])
            first_sheet = False
            for col, field in enumerate(fields, start=1):
                ws.cell(row=1, column=col, value=field)
                ws.cell(row=2, column=col, value=f"示例{field}")
        save_dialog = wx.FileDialog(self, "保存Excel文件", wildcard="Excel文件 (*.xlsx)|*.xlsx", style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
        if save_dialog.ShowModal() == wx.ID_OK:
            filename = save_dialog.GetPath()
            wb.save(filename)
            self.log_and_display(f'Excel文件已保存:{filename}')
            wx.MessageBox(f'Excel文件已保存:{filename}', '成功', wx.OK | wx.ICON_INFORMATION)
    except Exception as e:
        self.log_and_display(f'转换出错:{str(e)}')
        wx.MessageBox(f'转换出错:{str(e)}', '错误', wx.OK | wx.ICON_ERROR)
  • openpyxl.Workbook() 创建 Excel 文件。
  • create_sheet() 创建多个表格,每个表格对应一个工作表。
  • wx.FileDialog 让用户选择文件保存路径。
  • logging 记录转换过程。
2.5 退出应用
def on_exit(self, event):
    self.Close(True)
  • 关闭应用。

3. 运行程序

def main():
    app = wx.App()
    frame = MarkdownToExcelApp()
    frame.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()
  • 启动 wxPython GUI。

4. 总结

本项目通过 wxPython 构建用户界面,并结合 openpyxl 解析 Markdown 表格并生成 Excel 文件。它适用于希望从 Markdown 结构化数据导出 Excel 的用户,简化了手动整理表格的过程。

你可以进一步优化该项目,如:

  • 增加 Markdown 语法校验。
  • 允许用户调整 Excel 文件格式。
  • 增加数据预览功能。

运行结果

在这里插入图片描述
在这里插入图片描述