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

如何在从.rdlc导出到excel时包含单元格公式,excel,report,export-to-excel,rdlc,reportviewer,Excel,Report,Export To Excel,Rdlc,Reportviewer,在myrdlc报告中,有以下列 SlNo, Item, Uom, Qty, Rate, Amount 此处的金额字段是一个公式(费率*数量) 报告工作正常,当我导出到excel时,显示的值也正确无误。 但我的问题是,导出到excel后,当我更改excel文件中的数量或费率列时,金额不会自动更改,因为excel单元格中缺少公式。 在从.rdlc导出到excel时,我们如何在金额列中包含公式?我担心,仅使用rdlc呈现,不可能真正实现所需的行为 在我的搜索中,我偶然发现了QHarr发布的相同链接:

在my
rdlc
报告中,有以下列

SlNo, Item, Uom, Qty, Rate, Amount
此处的
金额
字段是一个公式(
费率*数量

报告工作正常,当我导出到excel时,显示的值也正确无误。 但我的问题是,导出到excel后,当我更改excel文件中的
数量
费率
列时,
金额
不会自动更改,因为excel单元格中缺少公式。
在从
.rdlc
导出到excel时,我们如何在
金额
列中包含公式?

我担心,仅使用rdlc呈现,不可能真正实现所需的行为

在我的搜索中,我偶然发现了QHarr发布的相同链接:
我还没有尝试过他们建议的项目,但如果可行的话,这可能是你最好的解决方案。不幸的是,我没有时间自己测试,所以如果你测试这个,请分享你的结果


我想到了下面的解决方法,它似乎在大多数情况下都有效,但实际上并不可靠,因为公式有时会显示为全文而不是计算。但我想这可以通过在导出后编辑excel文件,更改包含公式的列的单元格属性或触发计算来解决


使用内置字段
Globals!RenderFormat.Name
您可以确定渲染模式,这样,当报表被渲染为不同于Excel的格式时,您可以正确显示结果。导出到Excel时,可以将单元格的值更改为实际公式
要形成公式,您需要自己解决这个问题,但是这里可以使用
行数(范围为字符串)
函数来确定单元格的行数

下面是amount列的表达式值的可能示例

现在考虑到这个公式有时会显示为全文,您可能需要在渲染后编辑文件。如果确定单元格所在的行/列太复杂,也可以进行后期渲染。但是我相信上面的表达式应该足够容易使用,以获得您想要的结果,而无需在渲染后做很多工作


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


这是一篇老文章,所以我不知道从那以后事情是否发生了变化。我想你可以检查一下这是否是一个请求的特性,以及它是如何进展的,或者是对所提到的开源项目的链接进行后续操作。
Globals!RenderFormat.Name
仅在SQL Server Reporting Services 2008 R2和服务器报表中可用。目前,所有版本的本地报表(
.rdlc
)都不包含此内置功能。@AbdulRasheed-在设计器中,
名称
部分加下划线,好像这是错误的代码,但我向您保证它可以工作。我使用了一个本地报告,在该报告中,我在没有任何SQL Server交互的情况下传递数据集。但是,如果它不适合你,根据你的要求,我希望你仍然可以找到一个解决办法。例如,如果只将报表呈现给Excel,则甚至不需要该属性。否则,恐怕您必须在渲染后编辑单元格。好运气谢谢你的支持,我刚刚测试了你建议的解决方法。快关门了。但是现在公式
=E*F
直接显示在excel列中,当我只选择该单元格并按
ENTER键时,只有执行的公式和计算的值,否则它直接将公式显示为文本。有什么想法吗?@AbdulRasheed-我现在添加了一个示例,取决于启动渲染的操作,您可以在之后像我的示例中那样排队。
=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();