user2132124
user2132124

Reputation: 73

EPP plus Excel as attachment

Hi I am using EPPPlus to return a excel file and also to send the same file as an attachment. I could open the excel file and also got attachement but when I open the email attachment I am getting error message saying File is corrupted. Please look at the belwo code and suggest me changes.

 MemoryStream outputStream = new MemoryStream();
                using (ExcelPackage pck = new ExcelPackage(outputStream))
                {
                    //Create the worksheet
                    ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Demo");

                    //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1
                    ws.Cells["A1"].LoadFromDataTable(tbl, true);

                    //Format the header for column 1-3
                    using (ExcelRange rng = ws.Cells[1, 1, 1, tbl.Columns.Count])
                    {
                        rng.Style.Font.Bold = true;
                        rng.Style.Fill.PatternType = ExcelFillStyle.Solid;                      //Set Pattern for the background to Solid
                        rng.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(79, 129, 189));  //Set color to dark blue
                        rng.Style.Font.Color.SetColor(Color.White);
                    }
                    //Example how to Format Column 1 as numeric 
                    using (ExcelRange col = ws.Cells[2, 1, 2 + tbl.Rows.Count, 1])
                    {
                        col.Style.Numberformat.Format = "#,##0.00";
                        col.Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
                    }
                    MailMessage mail = null;
                    try
                    {
                        mail = new MailMessage();
                        mail.From = new MailAddress("[email protected]", "Adidas SystemMail");
                        mail.To.Add(new MailAddress(emailAddress));
                        mail.Subject = "Store Finder Geocoding";
                        mail.IsBodyHtml = true;
                        string message = "";
                        message += ".LLHere is the attachment with list of stores and geocode values you requested." + "</br>";
                        mail.Body = message;
                        outputStream.Position = 0;
                        Attachment attachment = new Attachment(outputStream, "Geocoding.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                        mail.Attachments.Add(attachment);
                        mail.SubjectEncoding = System.Text.Encoding.UTF8;
                        mail.BodyEncoding = System.Text.Encoding.UTF8;
                        SmtpClient client = new SmtpClient("localhost");
                        client.Send(mail);
                    }
                    catch (Exception ex)
                    {
                        //throw ex;
                    }
                    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                    Response.AddHeader("content-disposition", String.Format(CultureInfo.InvariantCulture, "attachment; filename={0}", "geo.xlsx"));
                    Response.BinaryWrite(pck.GetAsByteArray());
                    Response.End();

Upvotes: 3

Views: 3202

Answers (1)

Anthony
Anthony

Reputation: 9581

I haven't tested this, but my guess is that you need to save the ExcelPackage before you create the outlook attachment. Something like:

// ...
mail.Body = message;

pck.Save();

outputStream.Position = 0;
Attachment attachment = new Attachment(outputStream, "Geocoding.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
mail.Attachments.Add(attachment);
// ...

Because it's never being saved, it isn't writing anything to the output stream. Empty stream would make for not properly formatted xlsx file.

Upvotes: 1

Related Questions