导出并在特定位置写入 CSV

Export And Write CSV In Specific Location

我被困在一个逻辑中,我有以下要求:

1- 生成多个 CSV 文件。

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

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

之前我曾问过有关单击一个按钮生成 2 个文件的问题 here。但是后来发现不是 可以从 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();
  }
  }
  }
  }

  } 
  }
  }

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

请帮忙。提前致谢。

我试过你的代码,你应该修改这部分代码,

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,或者您可以使用外部像 Ionic Zip 这样的库,如果你有兴趣使用 Ionic Zip 库

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 的 Zip

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