从电子表格到纸张:Excel转PDF的神奇变身之旅!

news/2024/12/22 15:07:56/

当你需要将Excel文件转换为PDF时,可以使用Python编程语言和一些流行的库来实现这个任务。在本篇博客中,我将介绍如何使用wxPython、pandas和PyMuPDF库创建一个简单易用的图形用户界面(GUI)工具来完成这项工作。
C:\pythoncode\new\excelexportpdf.py
在这里插入图片描述
在这里插入图片描述

准备工作

在开始之前,请确保你已经安装了Python以及以下所需的库:

  • wxPython:用于创建GUI界面。
  • pandas:用于读取Excel文件数据。
  • PyMuPDF:用于将数据导出为PDF文件。

你可以使用pip工具来安装这些库:

pip install wxPython pandas PyMuPDF

创建GUI界面

我们将使用wxPython库来构建用户界面。首先,导入所需的库:

import wx
import pandas as pd
import fitz

接下来,我们将创建一个名为ExcelToPDFFrame的类,继承自wx.Frame类。这个类将代表我们的主窗口:

class ExcelToPDFFrame(wx.Frame):def __init__(self, parent, title):super(ExcelToPDFFrame, self).__init__(parent, title=title, size=(400, 200))

__init__方法中,我们设置了窗口的标题和大小。接下来,我们创建了窗口中的各个元素,如文件选择器、下拉框和转换按钮:

        panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)self.file_picker = wx.FilePickerCtrl(panel, style=wx.FLP_OPEN)vbox.Add(self.file_picker, proportion=0, flag=wx.EXPAND | wx.ALL, border=10)self.sheet_picker = wx.ComboBox(panel)vbox.Add(self.sheet_picker, proportion=0, flag=wx.EXPAND | wx.ALL, border=10)self.output_picker = wx.FilePickerCtrl(panel, style=wx.FLP_SAVE | wx.FLP_OVERWRITE_PROMPT)vbox.Add(self.output_picker, proportion=0, flag=wx.EXPAND | wx.ALL, border=10)convert_btn = wx.Button(panel, label='Convert')vbox.Add(convert_btn, proportion=0, flag=wx.ALIGN_CENTER | wx.ALL, border=10)panel.SetSizer(vbox)

我们使用wx.FilePickerCtrl来创建一个文件选择器,用于选择Excel文件。使用wx.ComboBox创建一个下拉框,用于显示Excel文件中的表格名称。然后,我们使用wx.FilePickerCtrl创建一个文件选择器,用于指定转换后的PDF文件的保存路径。最后,我们创建了一个按钮用于触发转换操作。

实现转换操作

接下来,我们需要实现转换操作的逻辑。我们将为文件选择器的EVT_FILEPICKER_CHANGED事件和转换按钮的EVT_BUTTON事件绑定相应的处理方法。

首先,我们实现on_file_picker_changed方法,当用户选择Excel文件时,它将被调用。该方法将获取所选文件的路径,并使用pd.ExcelFile读取文件中的表格名称,然后将它们填充到下拉框中:

    def on_file_picker_changed(self, event):filepath = self.file_picker.GetPath()sheets = self.get_excel_sheets(filepath)self.sheet_picker.Clear()self.sheet_picker.AppendItems(sheets)if len(sheets) > 0:self.sheet_picker.SetSelection(0)

然后,我们实现on_convert_btn_click方法,当用户点击转换按钮时,它将被调用。该方法将获取所选的Excel文件路径、所选的表格名称和输出文件路径。如果这些信息都提供了,它将使用pd.read_excel读取Excel数据,并调用export_to_pdf方法将数据导出为PDF文件:

    def on_convert_btn_click(self, event):excel_file = self.file_picker.GetPath()sheet_name = self.sheet_picker.GetStringSelection()output_file = self.output_picker.GetPath()if excel_file and sheet_name and output_file:excel_data = self.read_excel(excel_file, sheet_name)if excel_data is not None:self.export_to_pdf(excel_data, output_file)wx.MessageBox('Conversion completed成功!')def get_excel_sheets(self, file_path):excel_file = pd.ExcelFile(file_path)return excel_file.sheet_namesdef read_excel(self, file_path, sheet_name):try:excel_data = pd.read_excel(file_path, sheet_name=sheet_name)return excel_dataexcept Exception as e:wx.MessageBox(f'Error reading Excel file: {str(e)}', 'Error', wx.OK | wx.ICON_ERROR)return Nonedef export_to_pdf(self, excel_data, output_file):doc = fitz.open()page = doc.new_page()table = fitz.Table(page)table.auto_table(excel_data.values.tolist(), excel_data.columns.tolist())table.draw_on_page(page, (20, 20))doc.save(output_file)doc.close()

上述代码中,get_excel_sheets方法获取Excel文件中的表格名称,read_excel方法读取指定表格的数据,export_to_pdf方法将数据导出为PDF文件。我们使用PyMuPDF库创建一个新的PDF文档,然后创建一个新的页面,在页面上绘制一个表格,并将数据填充到表格中。最后,我们保存PDF文档并关闭它。

运行应用程序

最后,我们需要创建一个wx.App实例,并创建并显示ExcelToPDFFrame实例。然后,调用app.MainLoop()进入主事件循环,等待用户交互:

if __name__ == '__main__':app = wx.App()frame = ExcelToPDFFrame(None, 'Excel to PDF Converter')frame.Show()app.MainLoop()

现在,我们已经完成了这个简单的Excel转PDF的GUI工具。你可以将它保存为一个Python脚本并运行它。当你打开GUI界面时,选择要转换的Excel文件、表格名称和输出PDF文件的路径,然后点击转换按钮即可完成转换操作。

全部代码

import wx
import pandas as pd
import fitzclass ExcelToPDFFrame(wx.Frame):def __init__(self, parent, title):super(ExcelToPDFFrame, self).__init__(parent, title=title, size=(400, 200))panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)self.file_picker = wx.FilePickerCtrl(panel, style=wx.FLP_OPEN)vbox.Add(self.file_picker, proportion=0, flag=wx.EXPAND | wx.ALL, border=10)self.sheet_picker = wx.ComboBox(panel)vbox.Add(self.sheet_picker, proportion=0, flag=wx.EXPAND | wx.ALL, border=10)self.output_picker = wx.FilePickerCtrl(panel, style=wx.FLP_SAVE | wx.FLP_OVERWRITE_PROMPT)vbox.Add(self.output_picker, proportion=0, flag=wx.EXPAND | wx.ALL, border=10)convert_btn = wx.Button(panel, label='Convert')vbox.Add(convert_btn, proportion=0, flag=wx.ALIGN_CENTER | wx.ALL, border=10)panel.SetSizer(vbox)self.file_picker.Bind(wx.EVT_FILEPICKER_CHANGED, self.on_file_picker_changed)convert_btn.Bind(wx.EVT_BUTTON, self.on_convert_btn_click)def on_file_picker_changed(self, event):filepath = self.file_picker.GetPath()sheets = self.get_excel_sheets(filepath)self.sheet_picker.Clear()self.sheet_picker.AppendItems(sheets)if len(sheets) > 0:self.sheet_picker.SetSelection(0)def on_convert_btn_click(self, event):excel_file = self.file_picker.GetPath()sheet_name = self.sheet_picker.GetStringSelection()output_file = self.output_picker.GetPath()if excel_file and sheet_name and output_file:excel_data = self.read_excel(excel_file, sheet_name)if excel_data is not None:self.export_to_pdf(excel_data, output_file)wx.MessageBox('Conversion completed successfully!', 'Success')else:wx.MessageBox('Failed to read Excel data. Please check the file and sheet name.', 'Error')else:wx.MessageBox('Please select an Excel file, sheet, and specify an output file path.', 'Error')def get_excel_sheets(self, file_path):sheets = []try:excel_data = pd.ExcelFile(file_path)sheets = excel_data.sheet_namesexcept Exception as e:print(str(e))return sheetsdef read_excel(self, file_path, sheet_name):excel_data = Nonetry:excel_data = pd.read_excel(file_path, sheet_name=sheet_name)except Exception as e:print(str(e))return excel_datadef export_to_pdf(self, excel_data, output_file_path):doc = fitz.open()page = doc.new_page()table_width = 400  # 设置表格宽度table_height = excel_data.shape[0] * 25 + 25  # 设置表格高度# 绘制表格边框rect = fitz.Rect(50, 50, 50 + table_width, 50 + table_height)page.draw_rect(rect)# 设置表头样式header_font = 'Helvetica' # header_font_path = "/Noto_Sans_SC/static/NotoSansSC-Black.ttf"  # 替换为您自己的字体文件路径        # header_font = fitz.Font(header_font_path)# header_font = 'Noto Sans SC'# header_font = 'SimSun'# header_font = 'SimHei'# header_font = 'Microsoft YaHei'# header_font = 'LiSu'# header_font = 'YouYuan'# header_font = 'STSong'# header_font = 'STHeiti'# header_font = 'STKaiti'# header_font = 'STFangsong'# header_font = 'STZhongsong'# header_font = 'STHupo'        header_fontsize = 12header_color = (0, 0, 0)header_bgcolor = (0.8, 0.8, 0.8)# 绘制表头for col_idx, column in enumerate(excel_data.columns):header_rect = fitz.Rect(50 + col_idx * 100, 50, 50 + (col_idx + 1) * 100, 75)page.draw_rect(header_rect, fill=header_bgcolor)page.insert_textbox(header_rect, column, fontname=header_font, fontsize=header_fontsize, color=header_color, align=1)# 设置单元格样式# cell_font = "/Noto_Sans_SC/static/NotoSansSC-Black.ttf"  # 替换为您自己的字体文件路径# cell_font = fitz.Font(header_font_path)  # cell_font = 'Noto Sans SC'      cell_font = 'Helvetica'# cell_font= 'SimSun'# cell_font= 'SimHei'# cell_font= 'Microsoft YaHei'# cell_font= 'LiSu'# cell_font= 'YouYuan'# cell_font= 'STSong'# cell_font= 'STHeiti'# cell_font= 'STKaiti'# cell_font= 'STFangsong'# cell_font= 'STZhongsong'# cell_font= 'STHupo'       cell_fontsize = 10cell_color = (0, 0, 0)# 绘制单元格内容for row_idx, row in enumerate(excel_data.itertuples(index=False), start=1):for col_idx, cell_value in enumerate(row, start=0):cell_rect = fitz.Rect(50 + col_idx * 100, 75 + row_idx * 25, 50 + (col_idx + 1) * 100, 75 + (row_idx + 1) * 25)# cell_rect = fitz.Rect(50 + col_idx * 100, 50 + row_idx * 75, 50 + (row_idx + 1) * 25)page.insert_textbox(cell_rect, str(cell_value), fontname=cell_font, fontsize=cell_fontsize, color=cell_color, align=1)doc.save(output_file_path)doc.close()app = wx.App()
frame = ExcelToPDFFrame(None, 'Excel to PDF Converter')
frame.Show()
app.MainLoop()

总结
在本篇博客中,我们使用wxPython、pandas和PyMuPDF库创建了一个Excel转PDF的GUI工具。通过这个工具,我们可以方便地选择Excel文件、表格和输出路径,将Excel数据转换为PDF文件。这个工具可以帮助我们在处理Excel数据时更加高效和方便,同时也展示了如何使用Python编程语言和相关库来实现这个任务。希望本篇博客能对你有所帮助!


http://www.ppmy.cn/news/1050651.html

相关文章

【云原生】Docker Cgroups资源控制管理

目录 一、cgroups简介 cgroups有四大功能: 二、cpu时间片的概念 三、对CPU使用的限制 3.1 设置CPU使用率上限 (1)查看容器的默认CPU使用限制 (2)进行压力测试 (3)创建容器时设置CPU使用时…

【从零学习python 】56. 异常处理在程序设计中的重要性与应用

文章目录 异常的概念读取文件异常try...except语句try...else语句try...finally语句 进阶案例 异常的概念 在程序运行过程中,由于编码不规范或其他客观原因,可能会导致程序无法继续运行,此时就会出现异常。如果不对异常进行处理,…

Linux Kernel 4.12 或将新增优化分析工具

到 7 月初,Linux Kernel 4.12 预计将为修复所有安全漏洞而奠定基础,另外新增的是一个分析工具,对于开发者优化启动时间时会有所帮助。 新的「个别任务统一模型」(Per-Task Consistency Model)为主要核心实时修补&#…

XXX程序 详细说明

用于记录理解PC程序的程序逻辑 1、程序的作用 根据原作者的说明(文件说明.txt),该程序 (PC.py) 的主要作用是提取某一个文件夹中的某个设备 (通过config中的信息看出来是Ag_T_8) 产生的日志文件,然后提取其中某些需要的数据&…

开源在线图片设计器,支持PSD解析、AI抠图等,基于Puppeteer生成图片

Github 开源地址: palxiao/poster-design 项目速览 git clone https://github.com/palxiao/poster-design.git cd poster-design npm run prepared # 快捷安装依赖指令 npm run serve # 本地运行将同时运行前端界面与图片生成服务(3000与7001端口),合成图片时…

SOFARPC(笔记)

文章目录 一、快速开始1.1 SOFARPC1.2 基于SOFABoot 二、注册中心三、通讯协议2.1 Bolt基本发布调用方式超时控制协议泛化调用序列化协议自定义线程池 2.2 RESTful基本使用 2.3 其他协议四、架构 附录 官方样例下载地址-sofa-boot-guides 可查看 SOFARPC 方式快速入门 一、快…

快速解决Spring Boot跨域困扰:使用CORS实现无缝跨域支持

跨域问题 什么是跨域? 跨域(Cross-Origin Issue)的存在是因为浏览器的安全限制,它防止恶意网站利用跨域请求来获取用户的敏感信息或执行恶意操作。浏览器通过实施同源策略来限制网页在不同源之间进行资源访问或交互的情况。当一…

小说作者分享:如何利用爱校对使我的作品更出彩?

在创作小说的过程中,校对和修改是至关重要的步骤。许多作家已经开始利用“爱校对”这一工具,有效地提高他们作品的质量。本篇文章将通过实际案例,展示一些小说作者是如何成功地利用爱校对来精雕细琢他们的文字,并将作品提升到一个…