说明
在许多业务需求中,我们会被要求制作许许多多的表格、表单,乃至报告。
PDF的导出转换,可以在前端实现,但是会失真,并且有内容割断的风险。不过这个是免费的。
而今天,我就带来 GrapeCity的ActiveReports 15版本的使用。本次使用是在 .NET Core API 下,
.NET 版本为 5 ,整个项目是前后端分离。因为项目使用的是 .NET 5,
而只有15版本才支持 .NET 5,故选择此版本,希望对阁下有所帮助。
注意!!! 本文不教rdlx报表文件如何布局,该项可以查阅官方文档,它的设计和 WinForm 大致,只是表达式上需要阁下注意。表达式的部分还请阁下去官网找帮助文档,里面书写比较详细,此处便不在赘述。为阁下呈上链接:传送链接
ActiveReports 官方收费
一、准备
此处默认阁下拥有了 报表文件模板,并且开始要在后台对其进行数据渲染。
在.NET 中,NuGet包中搜寻 ActiveReports.Core ,会出来诸多版本。本文中,要导出的为PDF,所以找到 GrapeCity.ActiveReports.Export.Pdf,它的版本是15.0.0及以上。
此包包含了创建、渲染、导出等功能。
二、编写
// 获取模板
string path = Directory.GetCurrentDirectory();
FileInfo rptPath = new FileInfo(path + "\\Reports\\Tmpl.rdlx");
// 获取完成之后装载进 PageReport,并将 report 里面的数据渲染装载到 document 中
PageReport report = new PageReport(rptPath);
PageDocument document = new PageDocument(report);
// 获取数据来源
document.LocateDataSource += new LocateDataSourceEventHandler(document_LocateDataSource);
// 创建输出目录
DirectoryInfo outputDirectory = new DirectoryInfo(filePath);
if (!Directory.Exists(filePath))
{
outputDirectory.Create();
}
// 对渲染输出的 PDF 进行设置。一般是用来弄一些特别样式的。如果没有,直接 new 一个就行了
Settings pdfSetting = new Settings();
// 开始渲染
PdfRenderingExtension pdfRenderingExtension = new PdfRenderingExtension();
FileStreamProvider outputProvider = new FileStreamProvider(outputDirectory, Path.GetFileNameWithoutExtension(name));
// 如果文件(同文件名情况下)已存在,则覆盖此文件
outputProvider.OverwriteOutputFile = true;
report.Document.Render(pdfRenderingExtension, outputProvider, pdfSetting);
void document_LocateDataSource(object sender, LocateDataSourceEventArgs args)
{
// 匹配数据源的名字是否一致。数据源在阁下设计的时候就命名了。如果不知道,请去设计器中查看
if (args.DataSet.Query.DataSourceName == "DataResoure1")
{
args.Data = GetInfo(); // 此方法是获取数据。 注意,定义方法时,它返回值一定得是一个 IEnumerable 类型。
}
}
三、遇到的坑
当阁下的模板 有一个数据源,而下面有多个 DataSet 的时候,这时候阁下需使用 Switch 来让它自动判断,并回调。因为 document_LocateDataSource 是一个 事件。
如果导出的文件没有数据,或者显示出表达式,说明阁下的表达式出现错误。这时候阁下要回到设计器中,重新设计。修改模板文件即可。
如果阁下需要单独计算每一页中的总数。可以在报表设计器中多使用一个 TextBox,并写上表达式为:=ReportItem!TextBox30.Value
。此处,TextBox30.Value 是你要计算的那个数的框。具体看你的那个要计算的数的框的什么,就修改它就好了。
四、结尾
至此,阁下已经完成了对 PDF 的渲染,并能到导出路径找到文档。
如果阁下需要导出到前端使用,可以使用 outputProvider
下的 GetPrimaryStream.OpenStream()
进行导出。
如若阁下已在前台设置好了导出位置的api,此时只需将 文件名传送回前端即可。