2017-05-25 86 views
2

我正在做一个使用C#导出和导入数据到.csv文件的项目。我在导出数据时遇到困难,因此我编写了下面的代码,但它不那么灵活。我想用较少的时间导出它。以下代码需要更多时间。我将使用查询从SQL Server中获取大量数据。如何使从SQL Server到CSV的快速导出数据

public static void ExportPlantData(string channelId) 
{ 
    string query = string.Empty; 

    DataService dataService = new DataService(); 
    DbCommand dataCmd = null; 
    DataTable contentToExport = new DataTable(); 

    try 
    { 
     query = "SELECT * from tablename"; 

     dataCmd = dataService.Database.GetSqlStringCommand(query); 
     contentToExport = dataService.ExecuteDataTable(dataCmd); 
     ExportToCSV(contentToExport); 
    }  
} 

我从表中提取了大量数据。之后,我将这些数据导出为.csv,但它需要很长的时间来使用此代码导出:

public static void ExportToCSV(DataTable contentToexport) 
{ 
    string csvData = string.Empty; 
    string headers = string.Empty; 

    foreach (DataRow row in contentToexport.Rows) 
    { 
     headers = string.Empty; 

     foreach (DataColumn column in contentToexport.Columns) 
     { 
      csvData += row[column].ToString() + ","; 
      headers += column.ColumnName + ","; 
     } 

     csvData += "\r\n"; 
     headers += "\r\n"; 
    } 

    string contentToExport = headers + csvData; 
    string attachment = "attachment; filename=export.csv"; 

    HttpContext.Current.Response.Clear(); 
    HttpContext.Current.Response.ClearHeaders(); 
    HttpContext.Current.Response.ClearContent(); 
    HttpContext.Current.Response.AddHeader("content-disposition", attachment); 
    HttpContext.Current.Response.ContentType = "application/csv"; 
    HttpContext.Current.Response.AddHeader("Pragma", "public"); 
    HttpContext.Current.Response.Write(contentToExport); 

    System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest(); 
} 
+0

如果没有业务规则,并且您同样想要通过select语句获得的内容导出为csv,那么我认为您应该在所有行的单列中选择所有列值作为逗号分隔值。 所以你得到1列多行。然后,您需要遍历应用程序中的唯一一行。 –

+1

你应该使用一个StringBuilder对象。 –

+1

为什么**再次重新发明了车轮?**使用许多**现成的** CSV导出库中的任何一个,例如[由Josh Close提供的CSVHelper](https://joshclose.github.io/CsvHelper/) –

回答

1

它之所以慢,是因为你一直在建立字符串导致内存重新分配。改为使用StringBuilder。其次,你有一个错误,你保持每行的标题,而不是一次。

public static void ExportToCSV(DataTable contentToexport) 
     { 
      var csvData = new StringBuilder(); 

      foreach (DataColumn column in contentToexport.Columns) 
      { 
       if (csvData.Length > 0) csvData.Append(","); 
       csvData.Append(column.ColumnName); 
      } 
      csvData.Append(Environment.NewLine); 

      foreach (DataRow row in contentToexport.Rows) 
      { 
       var newLine = true; 
       foreach (DataColumn column in contentToexport.Columns) 
       { 
        if (!newLine) csvData.Append(","); 
        newLine = false; 
        var cellValue = row[column].ToString(); 
        var cellValueHasQuotes = cellValue.Contains("\""); 
        if (cellValueHasQuotes) 
        { 
         csvData.Append("\""); 
         cellValue = cellValue.Replace("\"", "\"\""); 
        } 
        csvData.Append(cellValue); 
        if (cellValueHasQuotes) 
        { 
         csvData.Append("\""); 
        } 
       } 

       csvData.Append(Environment.NewLine); 
      } 

      string contentToExport = csvData.ToString(); 
      string attachment = "attachment; filename=export.csv"; 

      HttpContext.Current.Response.Clear(); 
      HttpContext.Current.Response.ClearHeaders(); 
      HttpContext.Current.Response.ClearContent(); 
      HttpContext.Current.Response.AddHeader("content-disposition", attachment); 
      HttpContext.Current.Response.ContentType = "application/csv"; 
      HttpContext.Current.Response.AddHeader("Pragma", "public"); 
      HttpContext.Current.Response.Write(contentToExport); 
      System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest(); 
     } 

另一种可能性是直接写入响应主体并进行一些修改。

1

更改您的字符串变量,并使其财产以后像

public static void ExportToCSV(DataTable contentToexport) 
{ 
    StringBuilder csvData = new StringBuilder(); 
    StringBuilder headers = new StringBuilder(); 

    foreach (DataRow row in contentToexport.Rows) 
    { 
     headers = string.Empty; 
     foreach (DataColumn column in contentToexport.Columns) 
     { 
      csvData.Append(row[column].ToString() + ","); 
      headers.Append(column.ColumnName + ","); 
     } 

     csvData.Append("\r\n"); 
     headers.Append("\r\n"); 
    } 

    string contentToExport = headers.Append(csvData.ToString()).ToString(); 
    string attachment = "attachment; filename=export.csv"; 

    HttpContext.Current.Response.Clear(); 
    HttpContext.Current.Response.ClearHeaders(); 
    HttpContext.Current.Response.ClearContent(); 
    HttpContext.Current.Response.AddHeader("content-disposition", attachment); 
    HttpContext.Current.Response.ContentType = "application/csv"; 
    HttpContext.Current.Response.AddHeader("Pragma", "public"); 
    HttpContext.Current.Response.Write(contentToExport); 
    System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest(); 
} 

这将做你的工作比以前的版本快。

相关问题