2017-05-25 56 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(); 
} 

這將做你的工作比以前的版本快。

相關問題