Web服务器保存文件,然后打开它并保存为不同类型,然后提示用户下载

时间:2014-01-28 13:27:34

标签: asp.net-mvc excel razor export-to-excel

我有一个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中包装除表之外的所有内容,以便只导出表而不是页面布局的其余部分。

这可能吗?

1 个答案:

答案 0 :(得分:1)

您可以在.net

中实施VBA
private 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);

但是我不鼓励这个解决方案,因为:

  1. 您必须在网络服务器中安装MS Excel。
  2. MS Excel有时可能会出现错误行为,例如提示对话框。
  3. 之后您必须找到删除生成的Excel文件的方法。
  4. 丑陋的设计。
  5. 我建议直接生成excel,因为除了使用Excel本身或DocRaptor之外,似乎没有更好的方法将HTML转换为Excel。