在特定位置导出和写入CSV

时间:2016-09-14 07:17:44

标签: c# asp.net csv export-to-csv

我陷入了逻辑,我遵循以下要求:

1 - 生成多个CSV文件。

2 - 将CSV文件导出到特定位置。

3 - 压缩该位置的所有文件。

之前我曾在一个按钮上点击here询问了与生成2个文件相关的问题。但后来我发现它不是 可以从ASP.NET中的单个响应中获取两个文件。所以我决定将我的文件压缩并下载到客户端的计算机上。 但是我在点击按钮时生成我的CSV文件而且我没有具体的位置,所以我决定先保存我的CSV文件 具体位置,然后压缩文件。

以下是我生成CSV文件的代码:

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();
  }
  }
  }
  }

  } 
  }
  }

我能够达到我的第一个要求,但无法达到第二和第三。

请帮忙。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我一直在试用您的代码,您应该更改代码的这一部分,

Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=HeaderSection.txt");
Response.Charset = "";
Response.ContentType = "application/text";
Response.Output.Write(csvHeader);

至此,

System.IO.File.WriteAllText("C://csvHeader.csv", csvHeader);

System.IO.File.WriteAllText 将根据您的字符串输入创建文件库,在本例中为 csvHeader csvDetail ,您还可以可以将路径" C://csvHeader.csv" 更改为您想要的其他指定位置。

然后在您需要在指定位置创建的所有文件之后,您可以使用 System.IO.Compression 来压缩您创建的所有csv,或者您可以使用外部库,如< strong> Ionic Zip ,如果您对使用 Ionic Zip Library 感兴趣,可以使用一些代码,

using (ZipFile zip = new ZipFile())
{
   zip.AddFile("C://csvHeader.csv");
   zip.AddFile("C://csvDetail.csv");

   Response.ClearContent();
   Response.ClearHeaders();
   Response.AppendHeader("content-disposition", "attachment; filename=csv.zip");

   zip.Save(Response.OutputStream);
}

它应该以CSV格式下载

修改:如果您没有具体位置,则可以使用Path.GetTempPath()