Solved

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

Posted on 2010-09-14
3
668 Views
Last Modified: 2012-05-10
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

0
Comment
Question by:Sirdots
3 Comments
 
LVL 44

Expert Comment

by:Arthur_Wood
ID: 33679030
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
 
LVL 42

Accepted Solution

by:
sedgwick earned 500 total points
ID: 33679811
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
 

Author Closing Comment

by:Sirdots
ID: 33855368
The file dialog was not shown here
0

Featured Post

Efficient way to get backups off site to Azure

This user guide provides instructions on how to deploy and configure both a StoneFly Scale Out NAS Enterprise Cloud Drive virtual machine and Veeam Cloud Connect in the Microsoft Azure Cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article discusses the ASP.NET AJAX ModalPopupExtender control. In this article we will show how to use the ModalPopupExtender control, how to display/show/call the ASP.NET AJAX ModalPopupExtender control from javascript, how to show/display/cal…
International Data Corporation (IDC) prognosticates that before the current the year gets over disbursing on IT framework products to be sent in cloud environs will be $37.1B.
This Micro Tutorial will teach you how to censor certain areas of your screen. The example in this video will show a little boy's face being blurred. This will be demonstrated using Adobe Premiere Pro CS6.
Established in 1997, Technology Architects has become one of the most reputable technology solutions companies in the country. TA have been providing businesses with cost effective state-of-the-art solutions and unparalleled service that is designed…

809 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question