← 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 标准库(subprocess、ctypes、tempfile)。
集成模式
根据你部署报表引擎的方式,提供三个可用的类:
| 类 | 机制 | 前提条件 |
|---|---|---|
| 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
原生模式通过 ctypes 将 librdlnative.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 文件中定义的数据集匹配。所有字段值都必须是字符串——在传入前请先转换数字和日期。
导出格式
| 格式字符串 | 输出 | 可用范围 |
|---|---|---|
pdf | 所有模式 | |
csv | CSV 文本 | 所有模式 |
xlsx | Excel 工作簿 | 所有模式 |
xml | XML 数据 | 所有模式 |
rtf | Rich Text Format | 所有模式 |
tif | TIFF 图像(彩色) | 所有模式 |
html | HTML | 所有模式 |
xlsx_table | Excel(表格样式) | 仅 ReportAot + 原生模式 |
tifb | TIFF 图像(黑白) | 仅 ReportAot + 原生模式 |
mht | MHTML 网页存档 | 仅 ReportAot + 原生模式 |
无法识别的格式字符串会静默回退为
pdf。所有方法都是同步的——如需从异步代码中调用而不阻塞,请将其包装在 asyncio.get_event_loop().run_in_executor(None, ...) 中。