如何使用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
相关产品推荐
相关产品推荐

