【问题标题】:C# OpenXML make Excel file downloadableC# OpenXML 使 Excel 文件可下载
【发布时间】:2021-02-16 12:52:12
【问题描述】:
[EnableCors(origins: "*", headers: "*", methods: "*")]
public class ExcelReportsController : Controller
{

    private ExcelContext db = new ExcelContext();

    [Route("/ExportToExcel")]
    [HttpGet]
    public void ExportPersonsToExcel()
    {
        var sqlParameters = new List<SqlParameter>();
        sqlParameters.Add(new SqlParameter("@id", "1"));
        var persons = db.Database.SqlQuery<TestExcel>("SELECT * FROM persons(@id)", sqlParameters.ToArray()).ToArray();
        DataTable table = (DataTable)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(persons), (typeof(DataTable)));
        using (SpreadsheetDocument document = SpreadsheetDocument.Create("TestNewData.xlsx", SpreadsheetDocumentType.Workbook))
        {
            WorkbookPart workbookPart = document.AddWorkbookPart();
            workbookPart.Workbook = new Workbook();

            WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
            var sheetData = new SheetData();
            worksheetPart.Worksheet = new Worksheet(sheetData);

            Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets());
            Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" };

            sheets.Append(sheet);
            Row headerRow = new Row();
            List<String> columns = new List<string>();
            foreach (DataColumn column in table.Columns)
            {
                columns.Add(column.ColumnName);
                Cell cell = new Cell();
                cell.DataType = CellValues.String;
                cell.CellValue = new CellValue(column.ColumnName);
                headerRow.AppendChild(cell);
            }

            sheetData.AppendChild(headerRow);
            foreach (DataRow dsrow in table.Rows)
            {
                Row newRow = new Row();
                foreach (String col in columns)
                {
                    Cell cell = new Cell();
                    cell.DataType = CellValues.String;
                    cell.CellValue = new CellValue(dsrow[col].ToString());
                    newRow.AppendChild(cell);
                }

                sheetData.AppendChild(newRow);
            }
            workbookPart.Workbook.Save();
        }
    }
}
}

我有以下代码,但是当我要求提供 excel 文件时,没有任何反应。我希望它在我输入该 URL 时自动下载。有什么解决办法吗?

也许是流?但是我将如何实现呢?我是使用这个库的新手——所以请耐心等待。

【问题讨论】:

  • 在 Asp.Net 中你可以只使用 FileResult:please have a look
  • @newbie 你需要从你的方法中返回一些东西,现在它是一个public void 方法。 returning-a-file-to-view-download-in-asp-net-mvc
  • 所以,如果我返回一个“文件”。我怎样才能做到这一点?返回新文件(工作簿等)
  • “我该怎么做?” 给了你两个例子^^。看看他们。如果它们不适合您,请告诉我们原因。

标签: c# openxml


【解决方案1】:

首先,将方法的返回类型更改为IActionResult

然后,在 using 块之后,添加:

var stream = System.IO.File.Open("TestNewData.xlsx", FileMode.Open);
return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

它从您的文件中创建一个FileStream,然后返回一个FileStreamResult。长字符串是MIME type for Microsoft Excel (OpenXML)。注意,FileStreamResult 应该是automatically dispose 流。

如果您希望为下载的文件提供名称,可以使用File 的重载版本,因此只需传递第三个参数(字符串类型),如下所示:

return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "CustomName.xlsx");

【讨论】:

  • 当我将此解决方案与 IHttpActionResult (return Ok(File(etc..))) 一起使用时,我收到以下错误:不可调用的成员 'File' 不能像方法一样使用。
  • 您使用的是 Web API 2 (ASP.NET 4.x) 吗?我的回答假设 .NET Core 或 .NET 5。
【解决方案2】:

我找到了解决办法。

我们必须返回一个 HttpResponseMessage。然后在“使用”块之后,我们添加以下代码:

var path = "TestNewData.xlsx";
        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        var stream = new FileStream(path, FileMode.Open, FileAccess.Read);
        result.Content = new StreamContent(stream);
        result.Content.Headers.ContentType =
            new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        return result;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多