簡體   English   中英

C# OpenXML 使 Excel 文件可下載

[英]C# OpenXML make Excel file downloadable

[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 時自動下載。 有什么解決辦法嗎?

也許是 stream? 但是我將如何實現呢? 我是使用這個庫的新手——所以請耐心等待。

首先,將方法的返回類型更改為IActionResult

然后,在using塊之后,添加以下內容:

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

它從您的文件創建一個FileStream ,然后返回一個FileStreamResult 長字符串是Microsoft Excel (OpenXML) 的 MIME 類型 注意, FileStreamResult應該自動處理stream。

如果您希望為下載的文件提供名稱,可以使用重載版本的File ,因此只需傳遞第三個參數(字符串類型),如下所示:

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

我找到了解決方案。

我們必須返回一個 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM