Search code examples
c#excelexport-to-excelnancynpoi

NPOI return a .xls file with NancyFx


I am trying to create a export function where i send the created .xls file to the user.

I am using NancyFx for the requests and NPOI for the creation of the excel file. Can't figure out what is wrong with this code, i get a OK 200 response but not content/file returns back.

public class ExportService
    {
        private HSSFWorkbook HssfWorkbook { get; set; }

        public ExportService()
        {
            HssfWorkbook = new HSSFWorkbook();
        }

        public Response Export()
        {
            string fileName = "test2.xls";

            var response = new Response();

            response.Headers.Add("Content-Disposition", string.Format("attachment;filename={0}", fileName));

            InitializeWorkbook();
            GenerateData();

            response.Contents(WriteToStream());
            return response.AsAttachment(fileName, "application/vnd.ms-exce");
        }

        private MemoryStream WriteToStream()
        {
            //Write the stream data of workbook to the root directory
            MemoryStream file = new MemoryStream();
            HssfWorkbook.Write(file);
            return file;
        }

        private void GenerateData()
        {
            var sheet1 = HssfWorkbook.CreateSheet("Försäljning");

            sheet1.CreateRow(0).CreateCell(0).SetCellValue("Detta är ett test");
            int x = 1;
            for (int i = 1; i <= 15; i++)
            {
                var row = sheet1.CreateRow(i);
                for (int j = 0; j < 15; j++)
                {
                    row.CreateCell(j).SetCellValue(x++);
                }
            }
        }

        private void InitializeWorkbook()
        {
            ////create a entry of DocumentSummaryInformation
            var documentSummaryInformation = PropertySetFactory.CreateDocumentSummaryInformation();

            documentSummaryInformation.Company = "Test Company";

            HssfWorkbook.DocumentSummaryInformation = documentSummaryInformation;

            ////create a entry of SummaryInformation
            var summaryInformation  = PropertySetFactory.CreateSummaryInformation();
            summaryInformation.Subject = "Test Subject";
            HssfWorkbook.SummaryInformation = summaryInformation;
        }
    }

Solution

  • The problem was that my request came from an AJAX call. Need to save the file and then redirect the user to the file that was created in my AJAX response.