Home » excel » asp.net mvc – File name changes after opening downloaded excel file in .Net C# MVC

asp.net mvc – File name changes after opening downloaded excel file in .Net C# MVC

Posted by: admin April 23, 2020 Leave a comment

Questions:

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"

How to&Answers:

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");
}