Question

Hi I am using closedxML DLL for exporting to excel i have static method like this below

    public static void WriteToExcel(string fileName, List<CP> pages)
    {
        var wb = new XLWorkbook();
        byte[] file;


        var ws = wb.Worksheets.Add("CPs");
        WriteCostHeader(ws);

        ////write all the header columns
        //for (int i = 0; i < pages.Count; i++)
        int iRow = 2;
        foreach(var page in pages)
        {
            WriteCostPage(ws, page, iRow++);                

            WriteCostItemHead(ws, iRow++);

            foreach(var item in page.Items)
            {
                WriteCostItem(ws, item, iRow++);
            }
            iRow++;
        }

       wb.SaveAs(fileName);           
    }

I am calling above function in a method like this below

public  static List<CP> Init()
{

    //binding items to to list
}

static void Main(string[] args)
{
      byte[] file;
      file = ExcelProvider.WriteToExcel("D:\\Temp\\Test1.xls", Init());
      //Console.WriteLine("done");
      //Console.ReadLine();
 }

 public byte[] CreatePackage()
 {
     string fileName = string.Format("{0}.xlsx", "Generated");
     byte[] excelFile;         
     // getting error here cannot convert void to byte[]  
     excelFile =  ExcelProvider.WriteToExcel(fileName, Init());            
 }

but i need to get that result excel sheet in bytes, I need to store it in memory stream later i can use for further purpose ..

But I am not sure how can i get the created excel file in bytes format...

Would any one pls give any idea or solutions on this one ... Many thanks In advance ...

Was it helpful?

Solution 2

Please do this:-

//Open the File into file stream
FileStream fileStream = new FileStream(Server.MapPath(fileName), FileMode.Open, FileAccess.Read, FileShare.Read);

//Create and populate a memorystream with the contents of the
MemoryStream mstream = StreamToMemory(fileStream);

// delete the file when it is been added to memory stream
File.Delete(Server.MapPath(fileName));

//Convert the memorystream to an array of bytes.
byte[] byteArray = mstream.ToArray();

//Clean up the memory stream
mstream.Flush();
mstream.Close();

// Clear all content output from the buffer stream
Response.Clear();

// Add a HTTP header to the output stream that specifies the default filename
// for the browser's download dialog
Response.AddHeader("Content-Disposition", "attachment; filename=QatargasTimesheet-" + ((DateTime)rdDate.SelectedDate).ToString("MMM yyyy") + ".xls");

// Add a HTTP header to the output stream that contains the 
// content length(File Size). This lets the browser know how much data is being transfered
Response.AddHeader("Content-Length", byteArray.Length.ToString());

// Set the HTTP MIME type of the output stream
Response.ContentType = "application/octet-stream";

// Write the data out to the client.
Response.BinaryWrite(byteArray);

OTHER TIPS

Closed XML workbooks are saved to a stream. You can use a memory stream. Then call MemoryStream.ToArray() to get its bytes. So...

var wb = new XLWorkbook();
//...
var workbookBytes = new byte[0];
using (var ms = new MemoryStream())
{
    wb.SaveAs(ms);
    workbookBytes = ms.ToArray();
}

I know this question is old but for those stumbling their way here.

On the Work Book you can use the SaveAs method to save it to a stream and then return the bytes using MemoryStream

public byte[] GetExcelAsBytes()
{
    try
    {
        using (MemoryStream fs = new MemoryStream())
        {
            mWorkBook.SaveAs(fs);
            fs.Position = 0;
            return fs.ToArray();
        }
    }
    catch(Exception ex)
    {
        return new byte[] { };
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top