Convert datatable to excel or csv file and save to client computer(asp.net application)

On the click of a button I pass a datatable to a method to generate an excel file.
Since this is a web application I want to be able to use a file dialog to save the file
locally to my computer.

how can i acheive this pls ?




/// <summary>
    /// The click of this button will convert the datatable to csv format and save in the c:\directory
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnExcel_Click(object sender, EventArgs e)
    {
        SaveDataTableToCsvFile(@"c:\sample.csv", dtg, ",");
    }


    public static void SaveDataTableToCsvFile(string AbsolutePathAndFileName, DataTable TheDataTable, params string[] Options)
    {

        try
        {
            //variables
            string separator;
            if (Options.Length > 0)
            {
                separator = Options[0];
            }
            else
            {
                separator = ","; //default
            }
            string quote = "\"";

            //create CSV file
            StreamWriter sw = new StreamWriter(AbsolutePathAndFileName);
           
            //write header line
            int iColCount = TheDataTable.Columns.Count;
            for (int i = 0; i < iColCount; i++)
            {
                sw.Write(TheDataTable.Columns[i]);
                if (i < iColCount - 1)
                {
                    sw.Write(separator);
                }
            }
            sw.Write(sw.NewLine);

            //write rows
            foreach (DataRow dr in TheDataTable.Rows)
            {
                for (int i = 0; i < iColCount; i++)
                {
                    if (!Convert.IsDBNull(dr[i]))
                    {
                        string data = dr[i].ToString();
                        data = data.Replace("\"", "\\\"");
                        sw.Write(quote + data + quote);
                    }
                    if (i < iColCount - 1)
                    {
                        sw.Write(separator);
                    }
                }
                sw.Write(sw.NewLine);
            }
            sw.Close();
        }
        catch (Exception ex)
        {
            //MessageBox.Show(ex.Message);
        }
    }

Open in new window

SirdotsAsked:
Who is Participating?
 
Meir RivkinConnect With a Mentor Full stack Software EngineerCommented:
attached is a function which exports datatable to csv.

to enable saving it on the local computer you can stream the csv file to the client browser:

HttpContext.Current.Response.Buffer = true;
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
HttpContext.Current.Response.AddHeader( "content-disposition","attachment;
filename=" + <filename>);
HttpContext.Current.Response.BinaryWrite(File.ReadAllBytes(<filename>));
HttpContext.Current.Response.End();

<filename> - csv file path


http://dotnetguts.blogspot.com/2007/01/exporting-datatable-to-csv-file-format.html
http://www.velocityreviews.com/forums/t92977-csv-file-download-from-an-asp-net-page-issue.html
public static void ExportToCSV(DataTable dt, string strFilePath, string fileName)
        {
            var sw = new StreamWriter(strFilePath + fileName, false);

            // Write the headers.
            int iColCount = dt.Columns.Count;
            for (int i = 0; i < iColCount; i++)
            {
                sw.Write(dt.Columns[i]);
                if (i < iColCount - 1) sw.Write(",");
            }

            sw.Write(sw.NewLine);

            // Write rows.
            foreach (DataRow dr in dt.Rows)
            {
                for (int i = 0; i < iColCount; i++)
                {
                    if (!Convert.IsDBNull(dr[i]))
                    {
                        if (dr[i].ToString().StartsWith("0"))
                        {
                            sw.Write(@"=""" + dr[i] + @"""");
                        }
                        else
                        {
                            sw.Write(dr[i].ToString());
                        }
                    }

                    if (i < iColCount - 1) sw.Write(",");
                }
                sw.Write(sw.NewLine);
            }

            sw.Close();
        }

Open in new window

0
 
Arthur_WoodCommented:
Since the code you have will be executed on the SERVER, not on the client, you may have a bit of a problem.  

Generally, web apps do not have WRITE permission on the client - that would be a serious security hole.

AW
0
 
SirdotsAuthor Commented:
The file dialog was not shown here
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.