Проблемы с сохранением файла Excel через C # - PullRequest
0 голосов
/ 25 сентября 2019

Я создал API на C # и использую его как бэкэнд для моего углового проекта.Мне было поручено сохранить данные в виде файла Excel со своей страницы с помощью кнопки, выполненной в угловом формате.Логика в задней части.Я перепробовал все, чтобы добиться этого, но ничего не получается.Сейчас я использую EPPlus с методом SaveAs, преобразуя пакет Excel в байтовый массив.

Итак, вот моя функция в C #

public IHttpActionResult CreateExcelDocument()
    {
        //Creates a blank workbook. Using statement disposes the package.
        using (var p = new ExcelPackage())
        {
            var result = new MemoryStream();

            List<Hero> heroes = new List<Hero>();
            var documents = collection.Find(new BsonDocument()).ToList();
            foreach (BsonDocument docum in documents)
            {
                heroes.Add(BsonSerializer.Deserialize<Hero>(docum));
            }

            //Adding worksheet
            var ws = p.Workbook.Worksheets.Add("Heroes");

            //To set values in the spreadsheet use the Cells indexer.
            ws.Cells["A1"].Value = "ID";
            ws.Cells["B1"].Value = "Name";

            for(var row = 1; row <= heroes.Count(); row++)
            {
                ws.Cells[row, 1].LoadFromCollection(heroes[row].Id);
                ws.Cells[row, 2].LoadFromCollection(heroes[row].Name);
            }

            var stream = new MemoryStream(p.GetAsByteArray());

            //string filePath = @"c:\workbooks\myworkbook.xlsx";
            //FileInfo template = new FileInfo(filePath);
            //MemoryStream outputStream = new MemoryStream();
            p.SaveAs(stream);

            return Ok(stream);
        }
    }

Вот как это получаетсяэто

saveDocument(): Observable<any> {
return this.http.get<any>(this.heroesUrl)
  .pipe(
    tap(p => this.log('saved excel document' + p)),
    catchError(this.handleError<any>('saveDocument', []))
  );
}

Я создал компонент сообщения, который показывает мне состояние моих запросов API, поэтому с помощью saveDocument я получил следующее: HeroService: сохраненный документ Excel [объект объекта], [объект объекта], [объектОбъект], [Объект Объект], [Объект Объект], [Объект Объект], [Объект Объект], [Объект Объект], [Объект Объект], [Объект Объект]

Я использую MongoDB, Angular 8и ASP.NET Web API 2 (C #)

РЕДАКТИРОВАТЬ: здесь кнопка в угловом

<button (click)="saveDocument()"> Save heroes </button>

1 Ответ

0 голосов
/ 25 сентября 2019

Если у вас уже есть байтовый массив, почему бы вам просто не использовать?Команда SaveAs работает только для данного объекта Workbook, поскольку вы можете проверить здесь (https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.tools.excel.workbook.saveas?view=vsto-2017)

File.WriteAllBytes(filename, stream);

РЕДАКТИРОВАТЬ: ответ взят здесь и адаптирован к вашей проблеме: Сохранить как с использованием EPPlus?

byte[] data = p.GetAsByteArray();

string path = @"C:\test1.xlsx";
File.WriteAllBytes(path, data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...