【问题标题】:Web server to save a file, then open it and save as different type, then prompt user to downloadWeb服务器保存文件,然后打开并另存为不同类型,然后提示用户下载
【发布时间】:2014-01-28 13:27:33
【问题描述】:

我有一个 MVC Razor 应用程序,我在其中返回一个视图。 我已经重载了我的操作以接受一个可以为空的“导出”布尔值,这将通过添加标题来更改操作,但仍然返回与文件相同的视图(在新窗口中)。

        //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 文件,因此打开它时,我收到消息“文件格式和扩展名不匹配”。所以在谷歌之后,我在 SO 上找到了THIS POST,其中一个答案使用 VBA 打开服务器上的文件(包括 HTML 标记)然后再次保存(作为 .xls)。

我希望也这样做,调用将调用视图的控制器操作并在服务器上创建 .xls 文件,然后让服务器打开它,保存它然后将其作为下载返回。

我不想做的是创建一个新视图来返回一个干净的文件,因为当前视图是一个极其复杂的页面,其中包含许多只需要重复(和维护)的逻辑。 我在视图中所做的是将除表格之外的所有内容包装在 if statement 中,以便只导出表格而不导出页面布局的其余部分。

这可能吗?

【问题讨论】:

  • 所以你的视图除了你改变了内容类型并添加了 content-disposition 标头之外,仍然输出 HTML?
  • 是的,没错。我希望能够导出格式化的表格、颜色等。我遇到的问题是视图中有大量的逻辑,超过 400 行。我不想在控制器操作中重新编码每个视图。到目前为止它有效,但您收到有关文件格式的警告消息,但我试图让 Web 服务器打开文件然后执行“另存为”以尝试放弃导致警告的 html 并呈现格式化的 .xls 给用户。
  • 你想做的事是不可能的!您必须生成一个 excel 文件而不是 HTML
  • 哦...读完这篇文章stackoverflow.com/a/9575683/2394259 后我很乐观,但那是VBA,不是在控制器操作中完成的。回到绘图板 - 谢谢
  • 哦等等。我想念你的问题。控制器操作可以从另一个操作的 HTML 输出生成 excel 文件。虽然设计明智并且在服务器中运行 excel 可能是有问题的,但它很丑!我有过不好的经历。让我尝试编写代码。

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


【解决方案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. 您必须在 Web 服务器中安装 MS Excel。
  2. MS Excel 有时可能会出现提示对话框等行为异常。
  3. 之后您必须想办法删除生成的 Excel 文件。
  4. 丑陋的设计。

我建议直接生成 excel,因为除了使用 Excel 本身或 DocRaptor 之外,似乎没有更好的方法将 HTML 转换为 Excel。

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 2013-05-07
    • 2018-12-20
    • 1970-01-01
    相关资源
    最近更新 更多