我有一个MVC Razor应用程序,我将返回一个视图。 我已经重载我的动作以接受一个无法使用的“导出”bool,它将通过添加标题来更改操作,但仍然返回与文件相同的视图(在新窗口中)。
//if there is a value passed in, set the bool to true
if (export.HasValue)
{
ViewBag.Exporting = true;
var UniqueFileName = string.Format(@"{0}.xls", Guid.NewGuid());
Response.AddHeader("content-disposition", "attachment; filename="+UniqueFileName);
Response.ContentType = "application/ms-excel";
}
由于文件是基于视图生成的,因此它不是.xls文件,因此在打开文件时,我收到消息“文件格式和扩展名不匹配”。所以在Google之后,我在SO上找到了THIS POST,其中一个答案使用VBA在服务器上打开文件(包括HTML标记),然后再次保存(如.xls)。
我希望这样做,调用控制器动作,它将调用视图并在服务器上创建.xls文件,然后让服务器打开它,保存它然后将其作为下载返回。
我不想做的是创建一个新视图来返回一个干净的文件,因为当前视图是一个非常复杂的页面,有很多逻辑,只需要重复(和维护)。
我在视图中所做的是在if statement
中包装除表之外的所有内容,以便只导出表而不是页面布局的其余部分。
这可能吗?
答案 0 :(得分:1)
您可以在.net
中实施VBAprivate void ConvertToExcel(string srcPath, string outputPath, XlFileFormat format)
{
if (srcPath== null) { throw new ArgumentNullException("srcPath"); }
if (outputPath== null) { throw new ArgumentNullException("outputPath"); }
var excelApp = new Application();
try
{
var wb = excelApp.Workbooks.Open(srcPath);
try
{
wb.SaveAs(outputPath, format);
}
finally
{
Marshal.ReleaseComObject(wb);
}
}
finally
{
excelApp.Quit();
}
}
您必须安装Microsoft.Office.Interop并添加对名为Microsoft Excel XX.0对象库的COM对象的引用
样本用法:
//generate excel file from the HTML output of GenerateHtml action.
var generateHtmlUri = new Uri(this.Request.Url, Url.Action("GenerateHtml"));
ConvertToExcel(generateHtmlUri.AbsoluteUri, @"D:\output.xlsx", XlFileFormat.xlOpenXMLStrictWorkbook);
但是我不鼓励这个解决方案,因为:
我建议直接生成excel,因为除了使用Excel本身或DocRaptor之外,似乎没有更好的方法将HTML转换为Excel。