Невозможно скачать файл Excel при звонке из Почтальона - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь загрузить файл Excel с помощью веб-API, но я не могу загрузить файл в почтальоне, поскольку, поскольку я могу загрузить файл Excel, когда я ввожу URL-адрес в браузере, хотя при открытии файла я получаю предупреждение, как показано ниже:

enter image description here

enter image description here

enter image description here

КогдаЯ нажал на конечную точку, используя POSTMAN, затем файл был поврежден, и он показывает ненужные символы.

Код:

protected virtual byte[] ExportToXlsx<T>(IEnumerable<T> itemsToExport)
        {
            using (var stream = new MemoryStream())
            {
                using (var xlPackage = new ExcelPackage())
                {
                    // get handles to the worksheets
                    var worksheet = xlPackage.Workbook.Worksheets.Add(typeof(T).Name);

                    //create Headers and format them 
                    var manager = new PropertyManager<T>(itemsToExport.First());
                    manager.WriteCaption(worksheet, SetCaptionStyle);

                    var row = 2;

                    foreach (var items in itemsToExport)
                    {
                        manager.CurrentObject = items;
                        manager.WriteToXlsx(worksheet, row++, false);
                    }

                    xlPackage.Save();
                }
                return stream.ToArray();
            }
        }



private readonly IServiceContext ctx;
public void Download(string guid)
{
   var bytes = ExportToXlsx(list);
   ctx.reqobj.HttpContext.Response.Headers.Add("Content-Disposition", "attachment; filename=\"demo.xlsx\"");
   ctx.reqobj.HttpContext.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
   ctx.reqobj.HttpContext.Response.Body.Write(bytes, 0, bytes.Length);
}

Примечание: я использую OfficeOpenXml для создания файла Excel.

Буду признателен за любую помощь.

Обновление: enter image description here

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Почтальон не загружает никаких файлов, просто возвращает вам данные, которые предоставляет сервер или ваша служба.У меня есть проект, в который можно загрузить Excel с помощью OpenXML. Вот пример, с которым вы можете использовать некоторые стили.

[HttpGet]
    public void DownloadTable(int id)
    {
        List<Employee> all = db.Employees.Where(x => x.ManagerId == id).ToList();
        String file = "Example.xlsx";
        String path = Path.Combine(HttpContext.Current.Server.MapPath("~/App_Data"), file);
        List<string[]> headerRow = new List<string[]>() { new string[] { "EmployeeId", "Name", "Shift", "Timestamp" } };
        string headerRange = "A2:" + Char.ConvertFromUtf32(headerRow[0].Length + 64) + "2";
        ExcelPackage excel = new ExcelPackage();
        excel.Workbook.Worksheets.Add("Employees");
        var page = excel.Workbook.Worksheets["Employees"];
        page.Cells["A1:D1"].Merge = true;
        page.Cells["A1:D1"].Value = "Supervisor: " + all.FirstOrDefault().Manager + " - " + id;
        page.Cells["A1:D1"].Style.Font.Bold = true;
        page.Cells[headerRange].LoadFromArrays(headerRow);

        int z = 3;
        foreach (Reporte r in all)
        {
            page.Cells["A" + z].Value = r.Id;
            page.Cells["B" + z].Value = r.Name;
            page.Cells["C" + z].Value = r.Shift;
            page.Cells["D" + z].Value = r.Timestamp;
            z++;
        }

        page.Cells["D3:D" + z].Style.Numberformat.Format = "dddd dd MMMM YYYY";
        page.Cells["A2:D2"].AutoFilter = true;

        page.Cells["A1:D" + z].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
        page.Cells["A1:D" + z].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
        page.Cells["A2:D" + z].AutoFitColumns();
        page.Cells["A1:D1"].Style.Fill.PatternType = ExcelFillStyle.Solid;
        page.Cells["A1:D1"].Style.Fill.BackgroundColor.SetColor(Color.FromArgb(1, 183, 222, 232));
        FileInfo excelFile = new FileInfo(path);
        excel.SaveAs(excelFile);

        System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
        response.ClearContent();
        response.Clear();
        response.ContentType = "text/plain";
        response.AddHeader("Content-Disposition",
                           "attachment; filename=" + file + ";");
        response.TransmitFile(path);
        response.Flush();
        response.End();
        File.Delete(path);
    }
0 голосов
/ 18 июня 2018

Попробуйте использовать «Отправить и скачать» вместо «Отправить»

https://www.getpostman.com/docs/v6/postman/sending_api_requests/responses

0 голосов
/ 13 июня 2018

Поток должен быть передан в пакет.

Сейчас пакету ничего не дается,

//...

using (var xlPackage = new ExcelPackage())

//...

Так что в поток ничего не сохраняется, поэтомуошибка отображается при попытке открыть файл.

Нет необходимости преобразовывать поток памяти в массив.Верните поток и передайте его вместе с ответом.

protected virtual Stream ExportToXlsx<T>(IEnumerable<T> itemsToExport) {
    var stream = new MemoryStream();
    using (var xlPackage = new ExcelPackage(stream)) { //<<< pass stream
        // get handles to the worksheets
        var worksheet = xlPackage.Workbook.Worksheets.Add(typeof(T).Name);
        //create Headers and format them 
        var manager = new PropertyManager<T>(itemsToExport.First());
        manager.WriteCaption(worksheet, SetCaptionStyle);
        var row = 2;
        foreach (var items in itemsToExport) {
            manager.CurrentObject = items;
            manager.WriteToXlsx(worksheet, row++, false);
        }
        xlPackage.Save();
    }
    return stream;
}

Действие контроллера для возврата файла будет выглядеть следующим образом

public IActionResult Download(string guid) {

    //...get list

    var file = ExportToXlsx(list);
    var contentType = "application/vnd.openxmlformats";
    var fileName = "demo.xlsx";

    return File(file, contentType, fileName); //returns a FileStreamResult
}

В комментариях было указано, что вышеуказанное выполненов методе поддержки.

При использовании того же подхода

private readonly IServiceContext ctx;

//...

public void Download(string guid) {

    //...get list

    using(var fileStream = ExportToXlsx(list)) {
        if (fileStream.CanSeek && fileStream.Position != 0) {
            fileStream.Seek(0, SeekOrigin.Begin);
        }
        var contentType = "application/vnd.openxmlformats";
        var fileName = "demo.xlsx";
        var response = ctx.reqobj.HttpContext.Response;
        response.Headers.Add("Content-Disposition", $"attachment; filename=\"{fileName}\"");
        response.Headers.Add("Content-Length", fileStream.Length.ToString());
        response.ContentType = contentType;
        fileStream.CopyTo(response.Body);
    }
}

сгенерированный файл копируется в тело ответа.

Как и в случае с почтальоном, инструментпросто показывая возврат содержимого в ответе.Он не пытается загрузить фактический файл как вложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...