如何在从.rdlc导出到Excel时包含单元格公式

3

在我的rdlc报表中有以下列:

SlNo, Item, Uom, Qty, Rate, Amount

这里的 Amount 字段是一个公式 (Rate*Qty)

报表正常工作,导出到Excel后,显示的值也是正确的。但是我的问题是,在Excel中更改 QtyRate 列后,Amount 不会自动更改,因为Excel单元格中缺少公式。我们如何在从 .rdlc 导出到Excel时将公式包含在 Amount 列中?


1
这是一个旧帖子,所以我不知道事情是否有所改变。https://social.msdn.microsoft.com/Forums/en-US/3ddf11bf-e10f-4a3e-bd6a-d666eacb5ce4/report-viewer-export-ms-report-data-to-excel-with-formula?forum=vsreportcontrols 我猜你可以查看它是否是一个已请求的功能以及进展如何,或者跟进提到的开源项目链接。 - QHarr
1个回答

4
很抱歉,只使用rdlc渲染是无法实现所需的行为。在我的搜索中,我偶然发现了QHarr发布的同样链接:https://social.msdn.microsoft.com/Forums/en-US/3ddf11bf-e10f-4a3e-bd6a-d666eacb5ce4/report-viewer-export-ms-report-data-to-excel-with-formula?forum=vsreportcontrols
他们建议的解决方案可能是您最好的选择,但很遗憾我没有时间测试它,如果您测试,请分享您的结果。
我想到了以下解决方法,它似乎大多数情况下都有效,但并不可靠,因为公式有时会显示为全文而不是被计算。但我想这可以通过在导出后编辑Excel文件并更改包含公式的列的单元格属性或仅触发“计算”来解决。
使用内置字段Globals!RenderFormat.Name,您可以确定呈现模式,这样当报表呈现到与Excel不同的内容时,您可以正确地显示结果。当您导出到Excel时,您可以将单元格的值更改为实际的公式。
要形成公式,您需要自己解决,但RowNumber(Scope as String)函数在此处可以派上用场,以确定单元格的行号。
这里是一个可能的示例,用于您的金额列的表达式值。
=IIF(Globals!RenderFormat.Name LIKE "EXCEL*", "=E" & Cstr(RowNumber("DataSet1")+2) & "*F" & Cstr(RowNumber("DataSet1")+2) ,Fields!Rate.Value * Fields!Qty.Value )

考虑到这个公式有时会以全文形式显示,并且您可能需要在渲染后编辑文件。如果确定单元格位于哪一行/列太复杂,也可以在渲染后进行此操作。但我相信上述表达式应该足够容易使用,以便在渲染后不必做太多事情即可获得所需的结果。


更新:以下代码可用于强制计算公式(渲染后)

var fpath = @"C:\MyReport.xlsx";
using (var fs = File.Create(fpath))
{
    var lr = new LocalReport();
    //Initializing your reporter
    lr.ReportEmbeddedResource = "MyReport.rdlc";

    //Rendering to excel
    var fbytes = lr.Render("Excel");
    fs.Write(fbytes, 0, fbytes.Length);
}

var xlApp = new Microsoft.Office.Interop.Excel.Application() { Visible = false };
var wb = xlApp.Workbooks.Open(fpath);
var ws = wb.Worksheets[1];
var range = ws.UsedRange;
foreach (var cell in range.Cells)
{
    var cellv = cell.Text as string;
    if (!string.IsNullOrWhiteSpace(cellv) && cellv.StartsWith("="))
    {
        cell.Formula = cellv;
    }
}
wb.Save();
wb.Close(0);
xlApp.Quit();

Globals!RenderFormat.Name 仅在 SQL Server Reporting Services 2008 R2server report 中可用。 目前,所有版本的本地报表(.rdlc)都不包括此内置功能。 - Abdul Rasheed
@AbdulRasheed - 在设计师中,“名称”部分被下划线标记,好像这是错误的代码,但我向您保证它是有效的。我使用了一个本地报表,在其中传递了一个数据集,没有任何SQL Server交互。但如果对您不起作用,根据您的要求,我希望您仍然可以找到解决方法。例如,如果您只需要将报告呈现为Excel,则甚至不需要该属性。否则,恐怕您必须在呈现后编辑单元格。祝好运! - Oceans
感谢您的支持,我刚刚测试了您建议的解决方法。几乎接近解决了。但是现在公式=E*F直接显示在Excel列中,当我只选择该单元格并按下ENTER键时,公式才会被执行并计算出值,否则它直接显示为文本。有什么想法吗? - Abdul Rasheed
@AbdulRasheed - 我现在添加了一个示例,根据启动渲染的操作,您可以在之后排队类似于我的示例的内容。 - Oceans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接