是否可以使用Python Pandas构建报告?

2024-09-26 18:06:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在使用MS-Access生成报告,但我需要做的一些计算有点有限。

我正在研究使用Python来运行报表,即每行数据有一个报表,该报表接受列字段并将它们放在文本框中,如下所示:

Report template

在Python中这怎么可能呢?


Tags: 数据access报表报告ms文本框列字
3条回答

这当然是可能的,但我不认为熊猫提供了这样的功能。您可能想看一看“编程”和编译文档(这本身与python无关)的latex。您可以创建一个latex模板,并在python中动态填充内容,然后编译一个pdf文档,但可能需要一些努力才能找到进入latex的方法。

用Pandas读取CSV文件:是的,绝对有可能。见:http://pandas.pydata.org/pandas-docs/stable/io.html#io-read-csv-table

与熊猫一起制作报告:取决于你到底在找什么。Pandas有许多不同的输出编写功能,但它们的重点是生成表,而不是生成整个文档。最接近“文档”样式的输出(可以直接从Pandas获得)的可能是HTML表输出: http://pandas.pydata.org/pandas-docs/stable/io.html#io-html

这超出了Pandas的范围,但是您可以在^{}(模板引擎)和^{}(将HTML转换为PDF)库的帮助下,轻松地从Pandas数据框的每一行创建PDF报告。

首先,在report_template.html中定义报表的结构和外观:

<html>


<head>
    <style type="text/css">
        html, body {
            width: 500px;
            font-size: 12px;
            background: #fff;
            padding: 0px;
        }
        #my-custom-table {
            width: 500px;
            border: 0;
            margin-top: 20px;
        }
        #my-custom-table td {
            padding: 5px 0px 1px 5px;
            text-align: left;
        }
    </style>
</head>
<body>


<table cellspacing="0" border="0" style="width:500px; border:0; font-size: 14px;">
    <tr>
        <td style="text-align:left;">
            <b><span>Title of the PDF report - Row {{ row_ix + 1 }}</span></b>
        </td>
        <td style="text-align:right;">
            <b><span>{{ date }}</span></b>
        </td>
    </tr>
</table>


<table cellspacing="0" border="0" id="my-custom-table">
    {% for variable_name, variable_value in df.iteritems() %}
    {% if loop.index0 == 0 %}
    <tr style="border-top: 1px solid black;
               border-bottom: 1px solid black;
               font-weight: bold;">
        <td>Variable name</td>
        <td>Variable value</td>
    </tr>
    {% else %}
    <tr>
        <td>{{ variable_name }}</td>
        <td>{{ variable_value }}</td>
    </tr>
    {% endif %}
    {% endfor %}
</table>


</body>
</html>

然后,运行这个Python 3代码,它通过jinja2将每行数据帧转换为HTML字符串,然后通过xhtml2pdf将HTML转换为PDF:

from datetime import date

import jinja2
import pandas as pd
from xhtml2pdf import pisa

df = pd.DataFrame({
    "Average Introducer Score": [9, 9.1, 9.2],
    "Reviewer Scores": ["Academic: 6, 6, 6", "Something", "Content"],
    "Average Academic Score": [5.7, 5.8, 5.9],
    "Average User Score": [1.2, 1.3, 1.4],
    "Applied for (RC)": [9.2, 9.3, 9.4],
    "Applied for (FEC)": [5.5, 5.6, 5.7],
    "Duration (Months)": [36, 37, 38]})

for row_ix, row in df.iterrows():

    html = jinja2.Environment(  # Pandas DataFrame to HTML
        loader=jinja2.FileSystemLoader(searchpath='')).get_template(
        'report_template.html').render(date=date.today().strftime('%d, %b %Y'),
                                       row_ix=row_ix, df=row)

    # Convert HTML to PDF
    with open('report_row_%s.pdf' % (row_ix+1), "w+b") as out_pdf_file_handle:
        pisa.CreatePDF(
            src=html,  # HTML to convert
            dest=out_pdf_file_handle)  # File handle to receive result

对于Python代码中指定的数据帧,将输出3个pdf。第一个PDF如下所示(转换为PNG以便在此处显示):One row of Pandas DataFrame converted to PDF via HTML by using Jinja2 and xhtml2pdf

相关问题 更多 >

    热门问题