You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET C# Crystal Reports SDK:获取公式实际值及组页眉值求助

解决方案

获取公式字段的实际计算值

你当前用FormulaFieldDefinition.Text拿到的是Crystal Reports公式的定义语法,不是运行时计算后的实际值。要获取计算结果,得通过报表的运行时字段对象提取:

方法1:直接用GetFieldValue获取

如果公式字段绑定到报表数据源,可通过ReportDocument的GetFieldValue方法直接取值:

// 先刷新报表确保数据加载完成
savedReport.Refresh();
// 获取公式字段的实际计算值
object formulaCalculatedValue = savedReport.GetFieldValue("BURST");
string formulaValue = formulaCalculatedValue?.ToString() ?? string.Empty;

方法2:遍历报表节中的字段对象

如果公式字段在特定节(比如细节节、组头节),可遍历对应节的ReportObjects找到目标FieldObject再提取值:

// 替换为公式字段所在的节名称,比如GroupHeaderSection1
Section targetSection = savedReport.ReportDefinition.Sections["GroupHeaderSection1"];
foreach (ReportObject reportObj in targetSection.ReportObjects)
{
    if (reportObj.Kind == ReportObjectKind.FieldObject)
    {
        FieldObject fieldObj = (FieldObject)reportObj;
        // Crystal Reports中公式字段的引用格式为{@字段名}
        if (fieldObj.FieldName == "{@BURST}")
        {
            string formulaValue = fieldObj.Value?.ToString() ?? string.Empty;
            break;
        }
    }
}

获取GroupHeader #1的分组值

要获取GroupHeader #1对应的分组字段值,可通过报表的分组定义结合运行时数据提取:

// 获取第一个分组(对应GroupHeader #1)
GroupDefinition groupDef = savedReport.DataDefinition.Groups[0];
// 获取当前分组的实际值
object groupHeaderValue = savedReport.GetCurrentGroupValue(groupDef.ConditionField);
string groupValue = groupHeaderValue?.ToString() ?? string.Empty;

如果是多组拆分(bursting)场景,需要遍历所有分组值,可借助GroupTree:

foreach (GroupNode groupNode in savedReport.GroupTree.Nodes)
{
    // 拿到GroupHeader显示的文本值
    string groupHeaderText = groupNode.Name;
    // 后续拆分逻辑
}

修正后的完整导出代码

把上述逻辑整合到你的导出方法中:

public void btnExportToPDF_Click(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(destinationFolderFinal))
    {
        ReportDocument savedReport = new ReportDocument();
        savedReport.Load(destinationFolderFinal);
        viewer.ReportSource = savedReport;
        // 刷新报表确保数据加载完成
        savedReport.Refresh();

        // 获取公式字段BURST的实际计算值
        object formulaCalculatedValue = savedReport.GetFieldValue("BURST");
        string formulaValue = formulaCalculatedValue?.ToString() ?? string.Empty;
        string sanitizedFormulaValue = SanitizeFilename(formulaValue);

        // 获取GroupHeader #1的值
        GroupDefinition groupDef = savedReport.DataDefinition.Groups[0];
        object groupHeaderValue = savedReport.GetCurrentGroupValue(groupDef.ConditionField);
        string groupValue = groupHeaderValue?.ToString() ?? string.Empty;

        // 按需组合文件名
        string pdfFileName = $"{sanitizedFormulaValue}_{groupValue}.pdf";
        string pdfFilePath = Path.Combine(destinationFolder, pdfFileName);

        savedReport.ExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
        savedReport.ExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
        DiskFileDestinationOptions diskOptions = new DiskFileDestinationOptions
        {
            DiskFileName = pdfFilePath
        };

        savedReport.ExportOptions.DestinationOptions = diskOptions;
        savedReport.Export();

        MessageBox.Show("Report exported to PDF.");
    }
    else
    {
        MessageBox.Show("Please select a destination folder first.");
    }
}

注意事项

  • 必须调用savedReport.Refresh()确保报表数据加载完成,否则拿不到最新计算值。
  • 公式字段的引用格式是{@字段名},注意大小写和格式匹配。
  • 多组拆分场景下,要遍历GroupTree节点来获取每个分组对应的公式值和组头值。

内容的提问来源于stack exchange,提问作者APB Reports

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:30:43