Search code examples
asp.net-mvcasp.net-mvc-3excelasp.net-mvc-4export-to-excel

File name changes after opening downloaded excel file in .Net C# MVC


I am trying to export data as Excel in my C#.Net MVC Application. I have used return file() in Actionresult. The file is returned and downloaded successfully.

But there is error while opening file and the file names gets changed when it is opened. Downloaded file name is ExportFilterCRMdoctorRequest.xls but after opening it changes to Book1. code for Exporting file:

public ActionResult ExportFilterCRMdoctorRequest() 
        {
            var stream = new MemoryStream();
            var serializer = new XmlSerializer(typeof(List<CDRFilterCRMDoctorRequest>));

            //We load the data
            List<CDRFilterCRMDoctorRequest> data = (List<CDRFilterCRMDoctorRequest>)Session["filterCRMRequestList"]; //Retriving data from Session

            //We turn it into an XML and save it in the memory
            serializer.Serialize(stream, data);
            stream.Position = 0;

            //We return the XML from the memory as a .xls file
            return File(stream, "application/vnd.ms-excel", "ExportFilterCRMdoctorRequest.xls");
        }

enter image description here

enter image description here

The file name got changed to "Book1"


Solution

  • This is called Extension Hardening. Execute steps to avoid this error.

    1. Open your Registry (Start -> Run -> regedit.exe) Navigate to
    2. HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\OFFICE\12.0\EXCEL\SECURITY
    3. Right click in the right window and choose New -> DWORD Type
    4. “ExtensionHardening” as the name (without the quotes)
    5. Verify that the data has the value “0″

    NOTE

    There is one thing that has to be borne in mind when serializing in XML. XML is not Excel’s standard format and it has to open the file as XML data. This means that when opening the file it will issue a couple of warnings which are more of a nuisance than anything else.

    Back to your original Query : Replicated your issue and below is the fix

    Sample Class

    public class StudentModel
    {
        public string Name { get; set; }
        public string Address { get; set; }
        public string Class { get; set; }
        public string Section { get; set; }
    }
    

    Sample Data

    private List<StudentModel> StudentData()
    {
        List<StudentModel> objstudentmodel = new List<StudentModel>();
        objstudentmodel.Add(new StudentModel { Name = "Name1", Class = "1", 
                                             Address = "Address1", Section = "A" });
        objstudentmodel.Add(new StudentModel { Name = "Name2", Class = "2", 
                                             Address = "Address2", Section = "A" });
        return objstudentmodel;
    }
    

    Action Method

    public ActionResult Index()
    {
        List<StudentModel> objstudent = new List<StudentModel>();
        objstudent = StudentData();
        StringBuilder sb = new StringBuilder();
        sb.Append("<table border='" + "1px" + "'b>");
        //code section for creating header column
        sb.Append("<tr>");
        sb.Append("<td><b><font size=2>NAME</font></b></td>");
        sb.Append("<td><b><font size=2>CLASS</font></b></td>");
        sb.Append("<td><b><font size=2>ADDRESS</font></b></td>");
        sb.Append("<td><b><font size=2>SECTION</font></b></td>");
        sb.Append("</tr>");
    
        //code for creating excel data
        foreach (StudentModel item in objstudent)
        {
            sb.Append("<tr>");
            sb.Append("<td><font>" + item.Name.ToString() + "</font></td>");
            sb.Append("<td><font>" + item.Class.ToString() + "</font></td>");
            sb.Append("<td><font>" + item.Address.ToString() + "</font></td>");
            sb.Append("<td><font>" + item.Section.ToString() + "</font></td>");
            sb.Append("</tr>");
        }
        sb.Append("</table>");
        HttpContext.Response.AddHeader("content-disposition", 
                                       "attachment; filename=student_" + 
                                       DateTime.Now.Year.ToString() + ".xls");
        this.Response.ContentType = "application/vnd.ms-excel";
    
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(sb.ToString());
        return File(buffer, "application/vnd.ms-excel");
    }