网站首页 > 技术文章 正文
Pandas非常善于处理大规模数据,支持将结果导出到CSV,Excel,HTML,json等文件中。 如果您想将 多种信息(excel、图片等)组合 到一个文档中,那么事情变得更加困难。今天我们介绍如何将excel更好看的输出到pdf中,然后使用Jinja模板和WeasyPrint 再将其转换为独立的PDF文档。
操作流程
使用Pandas将数据输出到Excel文件中的多个工作表或者用DataFrames创建多个Excel文件非常方便。 但是,如果您想将 多种信息(excel、图片等)组合 输出到一个文件中,那么直接从Pandas进行操作的方法并不多。 幸运的是,万能的python大法有很多选项可以帮助我们。
在本文中,我将采用以下流程来创建多页PDF文档。
给大家推荐一个学习Python的组织,这里有好多关于这方面的资料供大家学习与交流【719149377 】
工具
我决定使用HTML作为模板语言,因为它可能是生成结构化数据最便捷的方法,支持各种格式数据(如图片、excel表)。我也认为每个人都知道(或可以弄清楚)足够的HTML知识来生成一个简单的报告。
这个工作流程中最困难的部分是弄清楚如何将HTML呈现为PDF。我觉得还没有最佳的解决方案,但我选择了 WeasyPrint ,因为它仍然在积极维护,我发现我可以相对容易地使它工作。作为替代方案,我过去使用过xhtml2pdf,它的效果也很好,遗憾的是该库缺乏文档说明,但它已存在一段时间,并且确实可以从HTML生成PDF。
数据
如上所述,我们将使用之前文章中的相同数据集。 为了使这一切成为一个独立的文章,下面是我如何导入数据,做描述性统计,及并生成关于CPU和软件销售的 数据透视表 。
导入模块,并读入销售渠道信息。
对数据做透视表
sales_report = pd.pivot_table(df, index=["Manager", "Rep", "Product"], values=["Price", "Quantity"], aggfunc=[np.sum, np.mean], fill_value=0) sales_report.head()
模板
DataFrame拥有to_html()的方法,可以将dataframe数据转化为含有HTML格式的字符串。
但是随着您的报告变得越来越复杂或您选择将Jinja模板用于您的网络应用,jinja的这些功能将为您提供良好的服务。Jinja的另一个不错的功能是它包含多个内置过滤器,这些过滤器允许我们以Pandas中难以做到的方式格式化我们的一些数据。
为了在我们的应用程序中使用Jinja,我们需要做三件事:
创建一个模板
将变量添加到模板上下文中
将模板渲染为HTML
这是一个非常简单的模板,我们称之为myreport.html:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>{{ title }} </title> </head> <body> <h2>Sales Funnel Report - National</h2> {{ national_pivot_table }} </body> </html>
上面html代码中拥有 {{title}} 和 {{national_pivot_table }} 这两个关键词。这两个关键词用来接收需要渲染的数据,比如图片对象、dataframe对象等。
要填充这些变量,我们需要创建一个Jinja环境并获取我们的模板对象:
from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('.')) template = env.get_template('myreport.html')
在上面的示例中,我假设模板位于当前目录中,但您可以将完整路径放到模板位置。
另一个关键组件是 env 的创建。 这个变量是我们将数据(或对象)填充给模板的方式。 我们创建了一个名为 template_var 的字典,其中包含我们想要传递给模板的所有变量。
请注意变量的名称如何与我们的模板匹配。即名称要与myreport.html中的{{}}夹住的关键词一样。
template_vars = {"title" : "Sales Funnel Report - National", "national_pivot_table": sales_report.to_html()}
最后一步是将 template_vars 渲染到html模板中,并输出为html字符串,最终我们将使用该html字符串来生成pdf报告。
html_out = template.render(template_vars)
为简洁起见,我不会显示完整的HTML,但您应该明白这一点。
生成pdf
pdf报告的生成部分相当简单,这里用到weasyprint库
from weasyprint import HTML HTML(string=html_out).write_pdf("report.pdf")
但是打开的pdf样式很简单,白底黑字并不美观。之所以这样是因为我们没有使用自定义样式表css,但是咱们不熟悉css,有一种简单的办法就是用成熟的css,这里我用的typography.css 作为填充表格时的样式表。这个css的优点有:
相对较小且易于理解
可以在PDF引擎中运行而不会抛出错误和警告
能让表格表格看起来很美观
让我们尝试使用我们更新的样式表重新渲染它:
HTML(string=html_out).write_pdf('
- 上一篇: 一个成熟的神经网络就应该有一点自己的想法了!
- 下一篇: 关于协方差的相关性 协方差相关性质
猜你喜欢
- 2024-09-25 果断收藏!python数据分析入门学习笔记(下)
- 2024-09-25 「机器学习」支持向量机分类 支持向量机 知乎
- 2024-09-25 数据可视化之箱线图详细介绍 箱线图绘制步骤
- 2024-09-25 简单的统计学:如何用Python计算扑克概率
- 2024-09-25 Python进行数据预处理 python如何做数据处理
- 2024-09-25 Distribution is all you need:这里有12种做ML不可不知的分布
- 2024-09-25 如何使用 Qdrant DB 创建基于向量的电影推荐系统?
- 2024-09-25 如何可视化卷积网络分类图像时关注的焦点
- 2024-09-25 感知机:教程,实现和可视示例 感知机定义
- 2024-09-25 数据处理中的“归一化”到底是什么?Talk is cheap,show me the code
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)