开源版FastReport能否直接传入JSON字符串作为运行时报表数据源
FastReport社区版直接传入JSON字符串作为数据源的解决方案
首先明确你之前操作的错误点:
report.LoadFromString方法作用为加载报表模板内容(与report.Load功能一致,只是输入源为字符串而非本地文件),完全不用于传入数据源,你之前的报错都是误用该方法导致的。- 使用
RegisterData注册业务对象后没有启用对应数据源,导致报表上下文找不到对应名称的数据源。 - 你设计器中的
JsonTableDataSource指定了DataType为JsonArray,如果直接传入单个JSON对象会出现结构不匹配的报错。
直接传入JSON字符串的实现方案
该方案完全不需要修改你已有的报表模板,直接替换原有JSON数据源的内容即可,兼容FastReport开源版:
Vehicle fullVehicleInfo = await _vehicleDataService.GetFullVehicleInfoAsNoTracking(_vehicleListingViewModel.SelectedVehicle); ReportObject ro = new(fullVehicleInfo, DateTime.Now.AddMonths(-1), DateTime.Now); // 匹配设计器的JsonArray类型要求,将单个对象外层包数组后序列化 string jsonContent = System.Text.Json.JsonSerializer.Serialize(new List<ReportObject> { ro }); Report report = new Report(); report.Load("reportTemplate.frx"); // 提取模板中已定义的JSON数据源连接 var jsonConnection = report.Dictionary.Connections.FindByName("Connection") as FastReport.Data.JsonConnection; // 直接将JSON字符串写入连接字符串完成数据源替换 jsonConnection.ConnectionString = $"Json={jsonContent}"; // 后续生成导出逻辑不变 report.Prepare(); var reportExport = new FastReport.Export.Image.ImageExport(); report.Export(reportExport, "report.jpeg");
如果你的JSON本身已经是根节点为数组的格式,不需要额外包数组,直接写入连接字符串即可。
补充:RegisterData方案的错误修复
如果你要使用业务对象注册的方式,只需要补全启用数据源的逻辑即可:
// 构造包含单个对象的集合 var dataList = new List<ReportObject> { ro }; report.RegisterData(dataList, "JSON"); // 关键:启用注册的数据源,否则报表上下文无法访问 report.GetDataSource("JSON").Enabled = true;
后续生成报表逻辑不变即可正常运行。
内容的提问来源于stack exchange,提问作者Artur S.
相关产品推荐
相关产品推荐

