【发布时间】:2011-08-12 13:35:06
【问题描述】:
一个 MVC 应用程序的小问题,我不知道如何解决。
基本上,我正在向最初由其他人 (c#) 创建的系统添加附加功能。对于报告系统,结果只显示在屏幕上。现在,我正在构建允许用户将报告下载为 Excel 文档的功能。
所以基本上,我有一个向用户显示日期范围和其他一些搜索优化选项的视图。我已经引入了一个单选按钮,如果选择该按钮,它将下载报告,而不是在屏幕上显示它。
这是我在 ReportController 中的三个操作:
public ActionResult Index()
{
return View();
}
public ActionResult ProductReport(AdminReportRequest reportRequest, FormCollection formVariables)
{
AdminEngine re = new AdminEngine();
if (!reportRequest.Download)
{
AdminReport report = re.GetCompleteAdminReport(reportRequest);
return View(report);
}
Stream ExcelReport = re.GetExcelAdminReport(reportRequest);
TempData["excelReport"] = ExcelReport;
return RedirectToAction("ExcelProductReport");
}
public FileResult ExcelReport()
{
var ExcelReport = TempData["excelReport"] as Stream;
return new FileStreamResult(ExcelReport, "application/ms-excel")
{
FileDownloadName = "Report" + DateTime.Now.ToString("MMMM d, yyy") + ".xls"
};
}
我已经通过 AdminEngine 进行了调试,一切看起来都很好。但是,在 ExcelReport 操作中,在返回文件时 - 它没有。我看到的是屏幕上的很多字符(在“panelReport”div 中 - 见下文),与 excel 文件中的数据混合在一起。
我想我已经确定它显示在屏幕上的原因是由于某些代码
写在索引视图中:
<% using (Ajax.BeginForm("ProductReport", "Report", null,
new AjaxOptions
{
UpdateTargetId = "panelReport",
InsertionMode = InsertionMode.Replace,
OnSuccess = "pageLoaded",
OnBegin = "pageLoading",
OnFailure = "pageFailed",
LoadingElementId = ""
},
new { id = "SearchForm" })) %>
如您所见,Ajax.BeginForm 语句声明它应该更新到 panelReport div - 这就是它正在做的事情(通过 Product Report 部分视图)。虽然这非常适合需要在屏幕上显示报告的情况,但显然不适用于 excel 文件。
有没有办法在不过多更改现有代码的情况下解决此问题?
这是我为 excel 文件进行工作的课程,以防需要阐明情况:
报告类:
public Stream GetExcelAdminReport(AdminReportRequest reportRequest)
{
AdminReport report = new AdminReport();
string dateRange = null;
List<ProductSale> productSales = GetSortedListOfProducts(reportRequest, out dateRange);
report.DateRange = dateRange;
if (productSales.Count > 0)
{
report.HasData = true;
CustomisedSalesReport CustSalesRep = new CustomisedSalesReport();
Stream SalesReport = CustSalesRep.GenerateCustomisedSalesFile(productSales);
return SalesReport;
}
}
工薪阶层:
public class CustomisedSalesReport
{
public Stream GenerateCustomisedSalesFile(List<ProductSale> productSales)
{
MemoryStream ms = new MemoryStream();
HSSFWorkbook templateWorkbook = new HSSFWorkbook();
HSSFSheet sheet = templateWorkbook.CreateSheet("Sales Report");
//Workings
templateWorkbook.Write(ms);
ms.Position = 0;
return ms;
}
}
【问题讨论】:
标签: c# asp.net-mvc stream