← SDK
Python SDK

majorsilence-reporting

从 Python 生成 PDF、Excel、CSV 等格式的 RDL 报表——通过子进程、AOT 二进制文件,或进程内 ctypes FFI。除标准库外无其他运行时依赖。


安装

通过 PyPI 安装(需要 Python 3.10+):

# PyPI
pip install majorsilence-reporting

# 或以可编辑模式从源代码安装
pip install -e .

无运行时依赖——仅使用 Python 标准库(subprocessctypestempfile)。


集成模式

根据你部署报表引擎的方式,提供三个可用的类:

机制前提条件
Report以子进程方式启动 dotnet RdlCmd.dll服务器上已安装 .NET 运行时。
ReportAot启动自包含的 AOT 编译 RdlCmd 二进制文件。AOT 二进制文件与应用一同部署。无需 .NET 运行时。
report_native.Report通过 ctypes 在进程内加载 librdlnative.so已部署原生库及相关 .so 文件。启动时调用一次 load_library()

Report —— 子进程(dotnet)

from majorsilence_reporting import Report

rpt = Report(
    report_path  = '/path/to/report.rdl',
    rdl_cmd_path = '/path/to/RdlCmd.dll',
)
rpt.set_connection_string('Data Source=/path/to/data.db')
rpt.set_parameter('StartDate', '2026-01-01')

# 保存为文件
rpt.export('pdf', '/tmp/output.pdf')

# 或在内存中获取字节(例如用于 Flask 响应)
data = rpt.export_to_memory('pdf')
return Response(data, mimetype='application/pdf')

ReportAot —— AOT 二进制

Report 使用相同的 API,但指向自包含的二进制文件,而非 DLL。服务器无需 .NET 运行时。

from majorsilence_reporting import ReportAot

rpt = ReportAot(
    report_path  = '/path/to/report.rdl',
    rdl_cmd_path = '/path/to/RdlCmd',   # 自包含二进制文件,无 .dll 扩展名
)
rpt.set_connection_string('Data Source=/path/to/data.db')
data = rpt.export_to_memory('xlsx')

# ReportAot 还支持 xlsx_table、tifb 和 mht
data = rpt.export_to_memory('xlsx_table')

report_native —— 进程内 FFI

原生模式通过 ctypeslibrdlnative.so 直接加载到 Python 进程中。不会启动任何子进程,是延迟最低的选项。它还支持真正的内存渲染——报表字节直接从原生缓冲区返回,无需写入临时文件。

from majorsilence_reporting.report_native import load_library, Report

# 在进程启动时调用一次。加载 librdlnative.so 及所有相关库。
lib = load_library('/path/to/librdlnative.so')

rpt = Report(lib, report_path='/path/to/report.rdl')
rpt.set_connection_string('Data Source=/path/to/data.db')

# 直接从原生缓冲区返回字节——不写入临时文件
data = rpt.export_to_memory('pdf')

# 作为二进制响应传递给 Django / FastAPI / Flask
return Response(data, media_type='application/pdf')
load_library() 会设置 RDLNATIVE_LIB_DIR,并以 RTLD_GLOBAL 方式预加载所有相关的 .so / .dylib 文件,以便 .NET P/Invoke 能正确解析它们。请在创建任何 Report 实例之前,每个进程调用一次。

核心 API

三个类共享同一接口:

方法说明
set_connection_string(cs)设置报表所使用的数据库连接字符串。需在 export 之前调用。
set_parameter(name, value)设置一个具名报表参数。两个参数均为字符串。可根据需要多次调用。
export(format, path)渲染报表并将输出写入磁盘上的 path
export_to_memory(format)渲染并以 bytes(二进制格式)或 str(文本格式)形式返回输出。对于 report_native.Report,始终返回 bytes

内存数据集

report_native.Report 支持通过 add_data() 完全在内存中提供数据——无需数据库连接。传入数据集名称和一个字典列表,其中每个值都是字符串。

from majorsilence_reporting.report_native import load_library, Report

lib = load_library('/path/to/librdlnative.so')
rpt = Report(lib, report_path='/path/to/report.rdl')

rpt.add_data('SalesData', [
    {'Product': 'PDF Library Pro',  'Revenue': '1200.00', 'Units': '3'},
    {'Product': 'Report Designer',   'Revenue': '250.00',  'Units': '1'},
    {'Product': 'Support (12 mo.)',  'Revenue': '500.00',  'Units': '1'},
])

data = rpt.export_to_memory('pdf')
add_data() 会自动设置 SkipDatabaseSchemaValidation。数据集名称必须与 .rdl 文件中定义的数据集匹配。所有字段值都必须是字符串——在传入前请先转换数字和日期。

导出格式

格式字符串输出可用范围
pdfPDF所有模式
csvCSV 文本所有模式
xlsxExcel 工作簿所有模式
xmlXML 数据所有模式
rtfRich Text Format所有模式
tifTIFF 图像(彩色)所有模式
htmlHTML所有模式
xlsx_tableExcel(表格样式)仅 ReportAot + 原生模式
tifbTIFF 图像(黑白)仅 ReportAot + 原生模式
mhtMHTML 网页存档仅 ReportAot + 原生模式
无法识别的格式字符串会静默回退为 pdf。所有方法都是同步的——如需从异步代码中调用而不阻塞,请将其包装在 asyncio.get_event_loop().run_in_executor(None, ...) 中。