如何在从.rdlc导出到excel时包含单元格公式
在my如何在从.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发布的相同链接:
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();