2

Currently i am trying to export the data from the data table to the excel sheet in c# asp.net mvc3. I surf on the internet and found some codes to export the datatable to the excel sheet. It executes with out any error. But no excel sheet will be created. Any suggestions to do this.

            string filename = "DownloadMobileNoExcel.xls";
            DataGrid dgGrid = new DataGrid();
            dgGrid.DataSource = dt;
            dgGrid.DataBind();
            Response.Clear();
            Response.AddHeader("content-disposition", "attachment;filename=" 
              + filename + "");
            Response.Charset = "";
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.ContentType = "application/vnd.ms-excel";

            //Convert the rendering of the gridview to a string representation 
            StringWriter sw = new StringWriter();
            HtmlTextWriter htw = new HtmlTextWriter(sw);
            dgGrid.RenderControl(htw);

            //Open a memory stream that you can use to write back to the response
            byte[] byteArray = Encoding.ASCII.GetBytes(sw.ToString());
            MemoryStream s = new MemoryStream(byteArray);
            StreamReader sr = new StreamReader(s, Encoding.ASCII);

            //Write the stream back to the response
            Response.Write(sr.ReadToEnd());
            Response.End();

2 Answers 2

3
protected void ExportToExcel(object sender, EventArgs e)
{

    //Get the data from database into datatable
    string strQuery = "select CustomerID, ContactName, City, PostalCode" +" from customers";
    SqlCommand cmd = new SqlCommand(strQuery);
    DataTable dt = GetData(cmd);
    //Create a dummy GridView
    GridView GridView1 = new GridView();
    GridView1.AllowPaging = false;
    GridView1.DataSource = dt;
    GridView1.DataBind();
    Response.Clear();
    Response.Buffer = true;
    Response.AddHeader("content-disposition","attachment;filename=DataTable.xls");
    Response.Charset = "";
    Response.ContentType = "application/vnd.ms-excel";
    StringWriter sw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(sw);
    for (int i = 0; i < GridView1.Rows.Count; i++)
    {
        //Apply text style to each Row
        GridView1.Rows[i].Attributes.Add("class", "textmode");
    }
    GridView1.RenderControl(hw);
    //style to format numbers to string
    string style = @"<style> .textmode { mso-number-format:\@; } </style>";
    Response.Write(style);
    Response.Output.Write(sw.ToString());
    Response.Flush();
    Response.End();
}

Source: http://www.aspsnippets.com/Articles/Export-DataSet-or-DataTable-to-Word-Excel-PDF-and-CSV-Formats.aspx

Sign up to request clarification or add additional context in comments.

7 Comments

Sorry Daredev. This also is executing well but no excel sheet will be created :(
@ArunKumarT: But it works for me... :) Is dataTable really having any data? Try binding your datatble to a pre-existing gridview to make sure that data exists
Ya it consists of data. I watched it with the help of break point. And i am using MVC. Are you tried in MVC?
@ArunKumarT: Ohh... yeah... missed the MVC & Response disconnection... Try this: if it could help in someway: public class MyActionResult : ActionResult { public override void ExecuteResult(ControllerContext context) { context.HttpContext.Response.Write("something"); } } Make appropraite changes... :)
ArunKumarT: Try this as well... billsternberger.net/asp-net-mvc/…
|
1

U can use Microsoft.Office.Interop.Excel libary

using Microsoft.Office.Interop.Excel;

using System.Reflection;

     Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbook ObjWorkBook;
            Microsoft.Office.Interop.Excel.Worksheet ObjWorkSheet;
            ObjWorkBook = ObjExcel.Workbooks.Add(System.Reflection.Missing.Value);
            ObjWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ObjWorkBook.Sheets[1];

            int counter = 1;
            foreach (var item in SomeDataCollection)
            {
                ObjWorkSheet.Cells[counter, 1] = item.some_property1;
                ObjWorkSheet.Cells[counter, 2] = item.some_property2;
                ObjWorkSheet.Cells[counter, 3] = item.some_property3;     
                counter++;
            }
            ObjWorkSheet.Columns.AutoFit();
            ObjWorkSheet.Columns.get_Range("M1", "M60").ColumnWidth = 25;
    string filename;    
            string[] file_parts = Convert.ToString(DateTime.Now).Split(' ');
            filename = file_parts[0].Replace("/", ".") + "(" + file_parts[1].Replace(":", "-") + ")" + "-file.xls";
            string save_path = AppDomain.CurrentDomain.BaseDirectory + "Content/files/" + filename;

            ObjWorkBook.SaveAs(save_path, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal,
                                            System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                                            System.Reflection.Missing.Value, System.Reflection.Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive,
                                            System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                                            System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                                            System.Reflection.Missing.Value);

            ObjWorkBook.Close(false, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
            ObjExcel.Workbooks.Close();
            ObjExcel.Quit();

file download. im using search form, so when form submited with no ajax im return excel file else just returl list of items

[HttpPost]
    public ActionResult Search(MyModel model)
    {
        model.GetCollection();
        if (Request.IsAjaxRequest())
        {
            return PartialView("_listItems", model.SomeCollection);
        }
        else
        {           
            string filename = model.GetExcel();
            string save_path = AppDomain.CurrentDomain.BaseDirectory + "Content/Personal/" + filename;
            HttpContext.Response.Clear();
            HttpContext.Response.ClearContent();
            HttpContext.Response.ClearHeaders();
            HttpContext.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", filename));
            HttpContext.Response.ContentType = "application/excel";
            HttpContext.Response.WriteFile(save_path);
            HttpContext.Response.End();
            System.IO.File.Delete(save_path);
            return new EmptyResult();
        }              

    }

10 Comments

sorry maxs87. I cant able to access the "using Microsoft.Office.Interop.Excel;" alternatively i can able to access only outlook.
How can i access the "using Microsoft.Office.Interop.Excel;" i am using excel 2007. Weather i need to install any thing?
Sorry i cant remember from where i get this lib. this assembly loads from C:\Program Files\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Office.Interop.Excel.dll
this will only works if request is not ajax so before submit u need to set ajax property in ur form tag to false with javascript or use another way. For example load exel from some link.
try $("#form_id").attr("data-ajax", "false").attr("method", "post");$("#form_id").submit(); for excel only
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.