在我的rdlc
报表中有以下列:
SlNo, Item, Uom, Qty, Rate, Amount
这里的 Amount
字段是一个公式 (Rate*Qty
)
报表正常工作,导出到Excel后,显示的值也是正确的。但是我的问题是,在Excel中更改 Qty
或 Rate
列后,Amount
不会自动更改,因为Excel单元格中缺少公式。我们如何在从 .rdlc
导出到Excel时将公式包含在 Amount
列中?
在我的rdlc
报表中有以下列:
SlNo, Item, Uom, Qty, Rate, Amount
这里的 Amount
字段是一个公式 (Rate*Qty
)
报表正常工作,导出到Excel后,显示的值也是正确的。但是我的问题是,在Excel中更改 Qty
或 Rate
列后,Amount
不会自动更改,因为Excel单元格中缺少公式。我们如何在从 .rdlc
导出到Excel时将公式包含在 Amount
列中?
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 R2
和 server report
中可用。
目前,所有版本的本地报表(.rdlc
)都不包括此内置功能。 - Abdul Rasheed=E*F
直接显示在Excel列中,当我只选择该单元格并按下ENTER键
时,公式才会被执行并计算出值,否则它直接显示为文本。有什么想法吗? - Abdul Rasheed