I have a requirement to export 2 csv files on a single button click. Below is my code to generate 2 csv files:
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.IO;
using System;
using System.Configuration;
using System.IO.Packaging;
using System.Web;
namespace ExportToCsv
{
public partial class WebForm1 : System.Web.UI.Page
{
//Build the CSV file data as a Comma separated string.
string csvHeader = string.Empty;
//Build the CSV file data as a Comma separated string.
string csvDetails = string.Empty;
protected void Page_Load(object sender, EventArgs e)
{
}
protected void ExportCSV(object sender, EventArgs e)
{
string constr = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand("select * from mytable-1")
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Connection = con;
sda.SelectCommand = cmd;
using (DataTable dt = new DataTable())
{
sda.Fill(dt);
//foreach (DataRow rows in dt.Rows)
//{
foreach (DataColumn column in dt.Columns)
{
//Add the Header row for CSV file.
csvHeader += column.ColumnName + ' ';
}
//Add new line.
csvHeader += "\r\n";
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn column in dt.Columns)
{
//Add the Data rows.
csvHeader += row[column.ColumnName].ToString().Replace(",", ";") + ' ';
}
//Add new line.
csvHeader += "\r\n";
}
//}
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=HeaderSection.txt");
Response.Charset = "";
Response.ContentType = "application/text";
Response.Output.Write(csvHeader);
}
}
}
using (SqlCommand cmd = new SqlCommand("select * from mytable-2")
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Connection = con;
sda.SelectCommand = cmd;
using (DataTable dt = new DataTable())
{
sda.Fill(dt);
//foreach (DataRow rows in dt.Rows)
//{
foreach (DataColumn column in dt.Columns)
{
//Add the Header row for CSV file.
csvDetails += column.ColumnName + ' ';
}
//Add new line.
csvDetails += "\r\n";
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn column in dt.Columns)
{
//Add the Data rows.
csvDetails += row[column.ColumnName].ToString().Replace(",", ";") + ' ';
}
//Add new line.
csvDetails += "\r\n";
}
//}
// Download the CSV file.
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=DetailSection.txt");
Response.Charset = "";
Response.ContentType = "application/text";
Response.Output.Write(csvDetails);
Response.Flush();
Response.End();
}
}
}
}
}
}
}
I am getting the data from 2 different tables and export the data in csv seperately. If I remove the second using
statement the functions works prefect but as I added the second using
statement to write second csv my browser(Chrome) gives the error Err_Response_Headers_Multiple_Content_Disposition
Please help.
I solved with this article
This error was bugging me whole of last week. This error is specific to Google Chrome. Not a bug in chrome itself though, as other browsers ignore duplicate headers, this seems like an issue with Chrome. This can be addressed easily the following ways, if you or your web app is sending out headers.
1 - Enclose filename using "". i.e
header('Content-Disposition: attachment; filename="'.$file_name.'"');
instead of
header('Content-Disposition: attachment; filename='.$file_name);
2 - If possible replace spaces and commas (,) with underscores (_)
$file_name = str_replace(array('"', "'", ' ', ','), '_', $file_name);
3 - Explicitly tell PHP to override headers by setting optional replace parameter to true.
header('Content-type: application/pdf', true);
Fix for Duplicate Headers Error 349
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With