Angular 6 MVC захват проекта ActionResult в сервисе - PullRequest
0 голосов
/ 17 января 2019

В проекте Angular 6 C # / MVC я использую пакет Nuget ClosedXML для экспорта данных в Excel. Я попробовал это, напрямую вызвав метод ExportToExcel, установив его как метод действия в RouteCofing.cs action = "ExportToExcel", , и он работает нормально и создает файл xlsx, но в проекте Angular я не уверен, как вернуть управление обратно в класс обслуживания. Остальные методы в контроллере возвращают Task обратно, однако этот метод возвращает ActionResult, и я не уверен, как получить результаты обратно в класс обслуживания. Пожалуйста, смотрите прикрепленное изображение для ошибки.

Вот код:

[![public ActionResult ExportToExcel()
        {
              //var sheetNames = new List<string>() { "sheetName1", "sheetName2" };
              var sheetNames = new List<string>() { "sheetName1" };


            string fileName = "SubmissionForm_" + DateTime.Now + ".xlsx";
            GenerateBook gb = new GenerateBook();
            DataSet ds = gb.GetDSExportToExcel(); //gb.GetDataSetExportToExcel();

            XLWorkbook wbook = new XLWorkbook();

            for (int k = 0; k < ds.Tables.Count; k++)
            {
                DataTable dt = ds.Tables\[k\];
                IXLWorksheet Sheet = wbook.Worksheets.Add(sheetNames\[k\]);
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    Sheet.Cell(1, (i + 1)).Value = dt.Columns\[i\].ColumnName;
                }
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        Sheet.Cell((i + 2), (j + 1)).Value = dt.Rows\[i\]\[j\].ToString();
                    }
                }
            }

            Stream spreadsheetStream = new MemoryStream();
            wbook.SaveAs(spreadsheetStream);
            spreadsheetStream.Position = 0;

            return new FileStreamResult(spreadsheetStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { FileDownloadName = fileName };

        }\[!\[enter image description here\]\[1\]\]\[1\]
    enter code here][1]][1]

enter image description here

звонок из класса обслуживания:

private getExportExcelUrl = this.urlStr + '/ Home / ExportToExcel';
public SetExport (данные: любой) {

    return this.http.post(this.getExportExcelUrl, null).subscribe((data: any) => { });
        //.pipe(map(res => <any[]>res))
        //.pipe(catchError(this.handleError));
}

Ответы [ 2 ]

0 голосов
/ 17 января 2019

В вашем сообщении укажите параметр параметра для responseType из arrayBuffer или blob. Пример:

this.http.get(this.getExportExcelUrl, { responseType: 'blob' })

РЕДАКТИРОВАТЬ: я изменил запрос клиента на GET. Я не уверен, как ваши контроллеры направляют запросы. Я обычно сопоставляю свои собственные, используя атрибуты Route.

0 голосов
/ 17 января 2019

возвращаемый файл (память, GetMimeType (файл), имя файла);

Вам придется вернуть поток памяти (представленный ниже как «память»), затем mimeType и fileName.

  private string GetMimeType(string file)
  {
    string extension = Path.GetExtension(file).ToLowerInvariant();
    switch (extension)
    {
      case ".txt": return "text/plain";
      case ".pdf": return "application/pdf";
      case ".doc": return "application/vnd.ms-word";
      case ".docx": return "application/vnd.ms-word";
      case ".xls": return "application/vnd.ms-excel";
      case ".png": return "image/png";
      case ".jpg": return "image/jpeg";
      case ".jpeg": return "image/jpeg";
      case ".gif": return "image/gif";
      case ".csv": return "text/csv";
      default: return "";
    }
  }

Из вашего метода API:

      spreadsheetStream.Position = 0;
      return File(spreadsheetStream, GetMimeType(fileName), filename);

Подробнее см. в этом блоге .

Надеюсь, это поможет.

...