You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python实现DataFrame数据的直接打印获取硬拷贝

Pandas DataFrame 一键打印解决方案

针对多列大表打印模糊、需要用户手动操作的问题,可直接通过优化打印排版+静默调用系统打印机的方式实现无感知一键打印,两种常用实现方案如下:


方案1:优化HTML排版后触发系统打印

之前转HTML打印模糊的核心原因是没有做打印场景适配,加上适配多列、分页的CSS后即可解决清晰度问题,无需用户手动操作浏览器:

import pandas as pd
import tempfile
import os

def print_dataframe(df):
    # 内嵌打印专用CSS,适配30列大表场景
    css = """
    <style>
    @page {
        size: landscape; /* 横向打印,适配多列宽度 */
        margin: 0.5in;
    }
    table {
        border-collapse: collapse;
        width: 100%;
        font-family: Consolas, 'Courier New', monospace; /* 等宽字体保证数值对齐、易识别 */
        font-size: 10px;
    }
    th, td {
        border: 1px solid #ddd;
        padding: 4px 8px;
        text-align: right; /* 数值右对齐符合阅读习惯 */
        white-space: nowrap; /* 禁止单元格内容换行,避免压缩字体 */
    }
    th {
        background-color: #f2f2f2;
        font-weight: bold;
    }
    tr {
        page-break-inside: avoid; /* 分页时不拆分单行内容 */
    }
    </style>
    """
    html_content = css + df.to_html(index=False)
    
    # 生成临时HTML文件,用完自动删除
    with tempfile.NamedTemporaryFile('w', suffix='.html', delete=False) as f:
        f.write(html_content)
        temp_path = f.name
    
    # Windows环境调用默认打印机静默打印
    if os.name == 'nt':
        import win32api
        import win32print
        win32api.ShellExecute(
            0,
            "print",
            temp_path,
            f'/d:"{win32print.GetDefaultPrinter()}"',
            ".",
            0
        )
    # macOS/Linux环境适配
    else:
        import subprocess
        subprocess.run(['lp', temp_path], check=True)
    
    os.unlink(temp_path)

依赖安装:执行pip install pywin32(Windows环境)即可。


方案2:ReportLab矢量排版PDF后静默打印

如果需要更精准的排版控制(比如每页重复表头、固定列宽),可以用ReportLab生成矢量PDF后直接打印,清晰度更高:

from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib import colors
from reportlab.lib.pagesizes import landscape, A4
import tempfile
import os
import win32api, win32print

def print_df_with_reportlab(df):
    with tempfile.NamedTemporaryFile('w', suffix='.pdf', delete=False) as f:
        temp_path = f.name
    
    # 初始化横向A4文档,适配多列
    doc = SimpleDocTemplate(temp_path, pagesize=landscape(A4), rightMargin=20, leftMargin=20, topMargin=20, bottomMargin=20)
    elements = []
    
    # 转换DataFrame为表格格式,设置每页重复表头
    data = [df.columns.tolist()] + df.values.tolist()
    col_width = (landscape(A4)[0] - 40) / len(df.columns)
    table = Table(data, colWidths=col_width, repeatRows=1)
    
    # 设置表格样式保证清晰度
    table.setStyle(TableStyle([
        ('FONTNAME', (0,0), (-1,-1), 'Courier'),
        ('FONTSIZE', (0,0), (-1,-1), 9),
        ('BACKGROUND', (0,0), (-1,0), colors.lightgrey),
        ('GRID', (0,0), (-1,-1), 0.5, colors.grey),
        ('ALIGN', (0,0), (-1,-1), 'RIGHT'),
    ]))
    elements.append(table)
    doc.build(elements)
    
    # 静默打印后清理临时文件
    win32api.ShellExecute(0, "print", temp_path, f'/d:"{win32print.GetDefaultPrinter()}"', ".", 0)
    os.unlink(temp_path)

依赖安装:执行pip install reportlab pywin32即可。


注意事项

  • 30列场景下如果列内容过长,可适当缩小字体大小,或者拆分大表为多组列分别打印
  • 两种方案均无需用户做任何额外操作,触发函数后会直接调用默认打印机输出,全程无需要用户确认的弹窗

内容的提问来源于stack exchange,提问作者Kushagra Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:48:01