Solved

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

Posted on 2010-11-17
10
299 Views
Last Modified: 2012-05-10
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
Comment
Question by:Sirdots
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 4
10 Comments
 
LVL 11

Expert Comment

by:jasonduan
ID: 34156988
Impossible.

The code runs on the server. It cannot write files to user's computer.
0
 
LVL 7

Accepted Solution

by:
mr_nadger earned 500 total points
ID: 34157030
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
 
LVL 11

Expert Comment

by:jasonduan
ID: 34157052
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
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:Sirdots
ID: 34157126
Thanks jasonduan: How do I apply the code above to the method I have? where do i put it?
0
 
LVL 11

Expert Comment

by:jasonduan
ID: 34157181
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
 

Author Comment

by:Sirdots
ID: 34158076
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
 
LVL 11

Expert Comment

by:jasonduan
ID: 34158206
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
 

Author Closing Comment

by:Sirdots
ID: 34158483
Thanks to everyone
0
 
LVL 11

Expert Comment

by:jasonduan
ID: 34158711
Hi Sirdots, just curious why my apporoach does not work?
0
 

Author Comment

by:Sirdots
ID: 34158751
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

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

This article demonstrates how to create a simple responsive confirmation dialog with Ok and Cancel buttons using HTML, CSS, jQuery and Promises
Performance in games development is paramount: every microsecond counts to be able to do everything in less than 33ms (aiming at 16ms). C# foreach statement is one of the worst performance killers, and here I explain why.
In this tutorial viewers will learn how add a scalable full-width header using CSS3. Create a new HTML document with an internal stylesheet. Set a tiled background.:  Create a new div and name it Header. Position it with position:absolute at the top…
In this tutorial viewers will learn how to style a decorative dropcap for the first letter in a paragraph using CSS. In CSS, create a new paragraph class by typing "p.fancy": Then, to style only the first letter of the first sentence, include the ps…

691 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