2016-02-16 3 views
2

При экспорте моих данных из sql в excel он начинается со второй строки, а не первой. Я думаю, что я сузил проблему в разделе streamwriter кода, но не могу понять, где это происходит! Это код;C# экспорт данных sql в csv

public static void ToCsv3(IDataReader myReader, string fileName, bool includeHeaderAsFirstRow) 

    { 
     const string Separator = ","; 
     Stream s = File.Create(fileName + ".txt"); 
     StreamWriter streamWriter = new StreamWriter(s, Encoding.Unicode); 


     StringBuilder sb = null; 

     if (includeHeaderAsFirstRow) 
     { 
      sb = new StringBuilder(); 
      for (int index = 0; index < myReader.FieldCount; index++) 
      { 
       if (myReader.GetName(index) != null) 
        sb.Append(myReader.GetName(index)); 

       if (index < myReader.FieldCount - 1) 
        sb.Append(Separator); 
      } 
      streamWriter.WriteLine(sb.ToString()); 
     } 
     int j = 0; 
     while (myReader.Read()) 
     { 
      sb = new StringBuilder(); 


      for (int index = 0; index < myReader.FieldCount - 1; index++) 
      { 


       if (!myReader.IsDBNull(index)) 
       { 
        string value = myReader.GetValue(index).ToString(); 
        if (myReader.GetFieldType(index) == typeof(String)) 
        { 
         if (value.IndexOf("\"") >= 0) 
          value = value.Replace("\"", "\"\""); 
         if (value.IndexOf(Separator) >= 0) 
          value = "\"" + value + "\""; 
        } 
        if (j != 0) 
        { 
         if (index == 0) 
         { 
          sb.Append(Environment.NewLine); 
         } 
        } 
        sb.Append(value); 

        j = j + 1; 
       } 


       if (index < myReader.FieldCount - 1) 
        sb.Append(Separator); 

      } 


      if (!myReader.IsDBNull(myReader.FieldCount - 1)) 
       sb.Append(myReader.GetValue(myReader.FieldCount).ToString().Replace(Separator, " ")); 


      streamWriter.Write(sb.ToString()); 
     } 



     myReader.Close(); 
     streamWriter.Close(); 


    } 
+0

Является ли вопрос о том, что заголовок вы генерируете не записываются в файл, когда 'includeHeaderAsFirstRow' является «истинным» или это то, что данные записываются в файл, начинающийся со строки 2, а не в строку 1, даже если это заголовок? –

+0

Он записывает заголовок, затем пропускает следующую строку (первую строку данных) и записывает со второй строки данных в таблице/базе данных. –

+1

Может ли быть, что DataReader переместил одну строку * до того, как вы ее передали? – Shnugo

ответ

2

Я предпочел бы разложить решение в создании CSV и сохранить его в файл:

public static IEnumerable<String> ToCsv(IDataReader reader, 
    Boolean includeHeaderAsFirstRow, 
    Char separator = ',', 
    Char quotation = '"') { 

    if (null == reader) 
    throw new ArgumentNullException("reader"); 

    String qt = quotation.ToString(); 

    StringBuilder Sb = new StringBuilder(); 

    if (includeHeaderAsFirstRow) { 
    for (int i = 0; i < reader.FieldCount; ++i) { 
     if (i > 0) 
     Sb.Append(separator); 

     String name = reader.GetName(i); 

     if (name.Contains(separator) || name.Contains(quotation)) 
     name = qt + name.Replace(qt, qt + qt) + qt; 

     Sb.Append(name); 
    } 

    yield return Sb.ToString(); 
    } 

    while (reader.Read()) { 
    Sb.Clear(); 

    for (int i = 0; i < reader.FieldCount; ++i) { 
     if (i > 0) 
     Sb.Append(separator); 

     if (!reader.IsDBNull(i)) { 
     String item = Convert.ToString(reader[i]); 

     if (item.Contains(separator) || item.Contains(quotation)) 
      item = qt + item.Replace(qt, qt + qt) + qt; 

     Sb.Append(item); 
     } 
    } 

    yield return Sb.ToString(); 
    } 
} 

public static void CsvToFile(String fileName, 
    IDataReader reader, 
    Char separator = ',', 
    Char quotation = '"') { 

    if (String.IsNullOrEmpty(Path.GetExtension(fileName))) 
    fileName += ".txt"; // ".csv" looks better here 

    File.WriteAllLines(fileName, ToCsv(reader, separator, quotation)); 
} 
+0

На самом деле это работает при изменении того, как я назвал includeHeaderAsFirstRow для bool! Все еще озадачен тем, почему мой оригинал не работает, но это делает работу (после удаления пустой последней строки, созданной после этого!). Спасибо –