[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 318
  • Last Modified:

Ability to save datable as csv file and give it a name on a web application using asp.net c#

I have a web application and am passing a datatable to a method which then converts this to a csv file and save to my c drive.
I want my users to be able to save this file with their own names and specify a location to save this to on their computer. Here is my code below. I am using asp.net c#
Here is how I call the method
SaveDataTableToCsvFile(@"c:\filename.csv", datatable, ",");

Here is the method:

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);
            //System.IO.StringWriter sw = new System.IO.StringWriter(); 

            //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
Sirdots
Asked:
Sirdots
  • 5
  • 4
1 Solution
 
jasonduanCommented:
Impossible.

The code runs on the server. It cannot write files to user's computer.
0
 
mr_nadgerCommented:
a colleague has been using this

http://mattberseth.com/blog/2007/04/export_gridview_to_excel_1.html

put a hidden gridview on the page, bind the table to it and off you go :)
0
 
jasonduanCommented:
However, you can use the following code to "push" the file to browser, and the user can choose to where save the file and spefify filename.

response.ClearContent();
response.ClearHeaders();
response.AppendHeader( "content-disposition" , String.Format( "attachment; filename={0}" , attachmentName ) );

response.ContentType = "text/ascii"
response.Write( data );
response.End();
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
SirdotsAuthor Commented:
Thanks jasonduan: How do I apply the code above to the method I have? where do i put it?
0
 
jasonduanCommented:
I would guess you have a button to trigger the process. The button's event handler will look like this:
protected void btnMyButton_Click(object sender, EventArgs e)
{
    // call your function to generate the file data
   string data = ......;  

   // specity the default file name
   string attachmentName = .....;  

   // send the file content to browser
   response.ClearContent();
   response.ClearHeaders();
   response.AppendHeader( "content-disposition" , String.Format( "attachment; filename={0}" ,    attachmentName ) );

   response.ContentType = "text/ascii"
   response.Write( data );
   response.End();
}
0
 
SirdotsAuthor Commented:
Thanks Jasonduan. You are not looking at my code below.  I know I have to call this from a button click event but where will your own code fall within my method. This is what I will like to know.

SaveDataTableToCsvFile(@"c:\filename.csv", datatable, ",");

Here is the method:


SaveDataTableToCsvFile(@"c:\filename.csv", datatable, ",");

Here is the method:

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);
            //System.IO.StringWriter sw = new System.IO.StringWriter(); 

            //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
 
jasonduanCommented:
I would do the following:
1. change your method signature to:
    public static void SaveDataTableToCsvFile(StreamWriter sw, DataTable TheDataTable, params string[] Options)
  and remove line: StreamWriter sw = new StreamWriter(AbsolutePathAndFileName);
   since you don't need to create a physical file on server

2. replace the calling method with:

string data;

using(MemoryStream mem = new MemoryStream())
using (StreamWriter sw = new StreamWriter(mem))
{
      SaveDataTableToCsvFile(sw, datatable, ",");

      // convert to string
    byte[] bytes = mem.ToArray();
    int dataLength = (int)mem.Length;
    data = Encoding.UTF8.GetString(bytes, 0, dataLength);
}

// specity the default file name
string attachmentName = .....;  

// send the file content to browser
response.ClearContent();
response.ClearHeaders();
response.AppendHeader( "content-disposition" , String.Format( "attachment; filename={0}" ,    attachmentName ) );

response.ContentType = "text/ascii"
response.Write( data );
response.End();


if it is not called within a web page, replace "response" with "HttoContext.Current.Response"

Hope this helps!
0
 
SirdotsAuthor Commented:
Thanks to everyone
0
 
jasonduanCommented:
Hi Sirdots, just curious why my apporoach does not work?
0
 
SirdotsAuthor Commented:
I was getting a lot of errors on the lines below. I forgot to save the error message. Looks like it didnt like it. I got frustrated and decided to solve it the other way.

using(MemoryStream mem = new MemoryStream())
using (StreamWriter sw = new StreamWriter(mem))

Thanks.
0

Featured Post

The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

  • 5
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now