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

当你需要将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.rhkb.cn/news/100016.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebRTC音视频通话-iOS端调用ossrs直播拉流

WebRTC音视频通话-iOS端调用ossrs直播拉流 之前实现iOS端调用ossrs服务,文中提到了推流。没有写拉流流程,所以会用到文中的WebRTCClient。请详细查看:https://blog.csdn.net/gloryFlow/article/details/132257196 一、iOS播放端拉流效果 二…

三角函数与圆,角度和弧度 (草稿,建设中)

目录 1 三角函数与圆,角度和弧度 1.1 三角形 1.2 圆形 2 角度 3 弧度 rad 4 角度,弧度的换算 2 三角函数 1 三角函数与圆,角度和弧度 1.1 三角形 角度弧长sin()cos()tan() 1.2 圆形 半径,周长,弧长半径面积 …

使用kubeadm安装和设置Kubernetes(k8s)

用kubeadm方式搭建K8S集群 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 这个工具能通过两条指令完成一个kubernetes集群的部署&#xff1a; # 创建一个 Master 节点 kubeadm init# 将一个 Node 节点加入到当前集群中 kubeadm join <Master节点的IP和端口…

OSCS开源安全周报第 56 期:Apache Airflow Spark Provider 任意文件读取漏洞

本周安全态势综述 OSCS 社区共收录安全漏洞 3 个&#xff0c;公开漏洞值得关注的是 Apache NiFi 连接 URL 验证绕过漏洞(CVE-2023-40037)、PowerJob 未授权访问漏洞(CVE-2023-36106)、Apache Airflow Spark Provider 任意文件读取漏洞(CVE-2023-40272)。 针对 NPM 、PyPI 仓库…

【已解决】Please install Node.js and npm before continuing installation.

给juopyter lab安装插件时报这个错 原因是&#xff0c;conda本身有nodejs&#xff0c;但是版本很低&#xff0c;只有0.几 所以需要卸载掉原来的nodejs&#xff0c;重新安装10版本以上的nodejs # 卸载命令 pip uninstall nodejs # 安装命令 conda install nodejs14.7.0 -c cond…

【BASH】回顾与知识点梳理(三十八)

【BASH】回顾与知识点梳理 三十八 三十八. 源码概念及简单编译38.1 开放源码的软件安装与升级简介什么是开放源码、编译程序与可执行文件什么是函式库什么是 make 与 configure什么是 Tarball 的软件如何安装与升级软件 38.2 使用传统程序语言进行编译的简单范例单一程序&#…

使用VisualStudio制作上位机(一)

文章目录 使用VisualStudio制作上位机(一)写在前面第一部分:创建应用程序第二部分:GUI主界面设计使用VisualStudio制作上位机(一) Author:YAL 写在前面 1.达到什么目的呢 本文主要讲怎么通过Visual Studio 制作上位机,全文会以制作过程来介绍怎么做,不会去讲解具体…

(三)行为模式:2、命令模式(Command Pattern)(C++示例)

目录 1、命令模式&#xff08;Command Pattern&#xff09;含义 2、命令模式的UML图学习 3、命令模式的应用场景 4、命令模式的优缺点 5、C实现命令模式的实例 1、命令模式&#xff08;Command Pattern&#xff09;含义 命令模式&#xff08;Command&#xff09;&#xff…

第 359 场 LeetCode 周赛题解

A 判别首字母缩略词 签到题… class Solution { public:bool isAcronym(vector<string> &words, string s) {string pf;for (auto &s: words)pf.push_back(s[0]);return pf s;} };B k-avoiding 数组的最小总和 贪心&#xff1a;从 1 1 1开始升序枚举&#xff0c…

C++实现字符串的逆置

目录 C和C的区别 【1】C对C的扩充 【2】C对C的兼容 第一个C程序 【1】hello world 【2】cout标准输出流对象 i&#xff09;介绍 ii&#xff09;运算 iii&#xff09;cout的使用 iv&#xff09;使用cout指定格式的输出 练习&#xff1a;1、输出斐波那契的前10项。 【3】…

物联网(IoT)安全挑战与解决方案: 分析物联网设备面临的安全威胁,以及如何设计和管理安全的IoT生态系统

第一章&#xff1a;引言 随着科技的飞速发展&#xff0c;物联网&#xff08;IoT&#xff09;作为连接世界的桥梁&#xff0c;已经成为现代社会不可或缺的一部分。然而&#xff0c;随着IoT设备数量的不断增加&#xff0c;其安全问题也日益显著。本文将深入探讨IoT领域面临的安全…

Docker的基本使用

Docker 概念 Docker架构 docker分为客户端&#xff0c;Docker服务端&#xff0c;仓库 客户端 Docker 是一个客户端-服务器&#xff08;C/S&#xff09;架构程序。Docker 客户端只需要向 Docker 服务端发起请求&#xff0c;服务端将完成所有的工作并返回相应结果。 Docker …

自动化测试工具Selenium的语法续.

OK&#xff0c;那么上篇博客我们介绍了如何搭建基于Javaselenium的环境&#xff0c;并且使用selenium的一些语法给大家演示了如何进行自动化测试的案例&#xff0c;那么本篇博客我们来继续学习selenium的一些其他的比较重要的语法&#xff0c;感谢关注&#xff0c;期待三连~ 目…

系统架构合理性的思考 | 京东云技术团队

最近牵头在梳理部门的系统架构合理性&#xff0c;开始工作之前&#xff0c;我首先想到的是如何定义架构合理性&#xff1f; 从研发的角度来看如果系统上下文清晰、应用架构设计简单、应用拆分合理应该称之为架构合理。 基于以上的定义可以从以下三个方面来梳理评估&#xff1…

IPv4,IPv6,TCP,路由

主要回顾一下TCP&#xff0f;IP的传输过程&#xff0c;在这个过程中&#xff0c;做了什么事情 ip : 网际协议,IP协议能让世界上任意两台计算机之间进行通信。 IP协议的三大功能&#xff1a; 寻址和路由传递服务&#xff1a;不可靠&#xff08;尽最大努力交付传输数据包&…

变动的Python爬虫实现

在电商时代&#xff0c;了解商品价格的变动对于购物者和卖家来说都非常重要。本文将分享一种基于Python的实时监控电商平台商品价格变动的爬虫实现方法。通过本文的解决方案和代码示例&#xff0c;您将能够轻松监控商品价格&#xff0c;并及时做出决策。 一、了解需求和目标 在…

EasyCode代码生成MybatisPlus

先安装插件 导入 { "author" : "wangyujie", "version" : "1.2.8", "userSecure" : "", "currTypeMapperGroupName" : "Default", "currTemplateGroupName" : "01-Mybatis-Pl…

如何将PDF文件转换为PPT文件?

如何将pdf转换成ppt&#xff1f;PDF文件作为常用的文件格式&#xff0c;不仅可以在教学过程中使用&#xff0c;还可以在营销展会、培训讲座等过程中使用。欧迪芬文件的使用&#xff0c;能够在一定程度上提升我们的办公效率。对于PDF文件来说&#xff0c;其中包含的元素非常多&a…

电商数据采集和数据分析

不管是做渠道价格的治理&#xff0c;还是做窜货、假货的打击&#xff0c;都需要品牌对线上数据尽数掌握&#xff0c;准确的数据是驱动服务的关键&#xff0c;所以做好电商数据的采集和分析非常重要。 当线上链接较多&#xff0c;品牌又需要监测线上数据时&#xff0c;单靠人工肯…

卷积神经网络——下篇【深度学习】【PyTorch】

文章目录 5、卷积神经网络5.10、⭐批量归一化5.10.1、理论部分5.10.2、代码部分 5.11、⭐残差网络&#xff08;ResNet&#xff09;5.11.1、理论部分5.11.2、代码部分 话题闲谈 5、卷积神经网络 5.10、⭐批量归一化 5.10.1、理论部分 批量归一化可以解决深层网络中梯度消失和…