2009-03-27 7 views
5

Y at-il une méthode prédéfinie ou « facile » d'écrire un datatable dans un fichier texte ou TextBox contrôle (avec police à espacement fixe):tels que DataTable.Print() Impression d'un DataTable zone de texte/fichier texte dans .NET

 
Column1| Column2| 
--------|--------| 
     v1|  v2| 
     v3|  v4| 
     v5|  v6| 

Modifier

est ici une première version (vb.net) - au cas où quelqu'un est intéressé ou veut construire leur propre:

Public Function BuildTable(ByVal dt As DataTable) As String 

    Dim result As New StringBuilder 
    Dim widths As New List(Of Integer) 
    Const ColumnSeparator As Char = "|"c 
    Const HeadingUnderline As Char = "-"c 

    ' determine width of each column based on widest of either column heading or values in that column 
    For Each col As DataColumn In dt.Columns 
     Dim colWidth As Integer = Integer.MinValue 
     For Each row As DataRow In dt.Rows 
      Dim len As Integer = row(col.ColumnName).ToString.Length 
      If len > colWidth Then 
       colWidth = len 
      End If 
     Next 
     widths.Add(CInt(IIf(colWidth < col.ColumnName.Length, col.ColumnName.Length + 1, colWidth + 1))) 
    Next 

    ' write column headers 
    For Each col As DataColumn In dt.Columns 
     result.Append(col.ColumnName.PadLeft(widths(col.Ordinal))) 
     result.Append(ColumnSeparator) 
    Next 
    result.AppendLine() 

    ' write heading underline 
    For Each col As DataColumn In dt.Columns 
     Dim horizontal As String = New String(HeadingUnderline, widths(col.Ordinal)) 
     result.Append(horizontal.PadLeft(widths(col.Ordinal))) 
     result.Append(ColumnSeparator) 
    Next 
    result.AppendLine() 

    ' write each row 
    For Each row As DataRow In dt.Rows 
     For Each col As DataColumn In dt.Columns 
      result.Append(row(col.ColumnName).ToString.PadLeft(widths(col.Ordinal))) 
      result.Append(ColumnSeparator) 
     Next 
     result.AppendLine() 
    Next 

    Return result.ToString() 

End Function 

Répondre

1

Non, il n 't. Vous devrez effectuer le formatage vous-même ou trouver une bibliothèque tierce qui le fera vous-même.

+0

Oui, merci, je serai occupé à écrire le mien. – user79755

3

Vous pouvez utiliser un DataTableReader:

public static string PrintTable(this DataTable dt) 
{ 
    DataTableReader dtReader = dt.CreateDataReader(); 
    StringBuilder result = new StringBuilder(); 
    while (dtReader.Read()) 
    { 
     for (int i = 0; i < dtReader.FieldCount; i++) 
     { 
      result.AppendFormat("{0} = {1}", 
       dtReader.GetName(i).Trim(), 
       dtReader.GetValue(i).ToString().Trim()); 
     } 
     result.AppendLine(); 
    } 
    dtReader.Close(); 
    return result.ToString(); 
} 
+0

Merci pour l'exemple de code. – user79755

4

Je vous recommande de vérifier mon article DataTable Formatter.
Ma classe DataTableFormatter contient des méthodes de mise en forme de DataTables en tant que tables basées sur des caractères (votre exigence), tables HTML ou tables de document de flux.

Vous pouvez télécharger le projet contenant la classe de mon site Web, mais pour plus de commodité, je vais poster le code ici.

/// <summary> 
/// Gets a string representation of the <see cref="System.Data.DataTable" />. 
/// </summary> 
/// <remarks>The string representation should be displayed with a monospaced font.</remarks> 
public static string GetStringRepresentation(DataTable dataTable) 
{ 
    if (dataTable == null) 
     throw new ArgumentNullException("'dataTable' cannot be null."); 

    StringWriter representationWriter = new StringWriter(); 

    // First, set the width of every column to the length of its largest element. 
    int[] columnWidths = new int[dataTable.Columns.Count]; 
    for (int columnIndex = 0; columnIndex < dataTable.Columns.Count; columnIndex++) 
    { 
     int headerWidth = dataTable.Columns[columnIndex].ColumnName.Length; 
     int longestElementWidth = dataTable.AsEnumerable() 
      .Select((row) => row[columnIndex].ToString().Length) 
      .Max(); 
     columnWidths[columnIndex] = Math.Max(headerWidth, longestElementWidth); 
    } 

    // Next, write the table 
    // Write a horizontal line. 
    representationWriter.Write("+-"); 
    for (int columnIndex = 0; columnIndex < dataTable.Columns.Count; columnIndex++) 
    { 
     for (int i = 0; i < columnWidths[columnIndex]; i++) 
      representationWriter.Write("-"); 
     representationWriter.Write("-+"); 
     if (columnIndex != dataTable.Columns.Count - 1) 
      representationWriter.Write("-"); 
    } 
    representationWriter.WriteLine(" "); 
    // Print the headers 
    representationWriter.Write("| "); 
    for (int columnIndex = 0; columnIndex < dataTable.Columns.Count; columnIndex++) 
    { 
     string header = dataTable.Columns[columnIndex].ColumnName; 
     representationWriter.Write(header); 
     for (int blanks = columnWidths[columnIndex] - header.Length; blanks > 0; blanks--) 
      representationWriter.Write(" "); 
     representationWriter.Write(" | "); 
    } 
    representationWriter.WriteLine(); 
    // Print another horizontal line. 
    representationWriter.Write("+-"); 
    for (int columnIndex = 0; columnIndex < dataTable.Columns.Count; columnIndex++) 
    { 
     for (int i = 0; i < columnWidths[columnIndex]; i++) 
      representationWriter.Write("-"); 
     representationWriter.Write("-+"); 
     if (columnIndex != dataTable.Columns.Count - 1) 
      representationWriter.Write("-"); 
    } 
    representationWriter.WriteLine(" "); 

    // Print the contents of the table. 
    for (int row = 0; row < dataTable.Rows.Count; row++) 
    { 
     representationWriter.Write("| "); 
     for (int column = 0; column < dataTable.Columns.Count; column++) 
     { 
      representationWriter.Write(dataTable.Rows[row][column]); 
      for (int blanks = columnWidths[column] - dataTable.Rows[row][column].ToString().Length; 
       blanks > 0; blanks--) 
       representationWriter.Write(" "); 
      representationWriter.Write(" | "); 
     } 
     representationWriter.WriteLine(); 
    } 

    // Print a final horizontal line. 
    representationWriter.Write("+-"); 
    for (int column = 0; column < dataTable.Columns.Count; column++) 
    { 
     for (int i = 0; i < columnWidths[column]; i++) 
      representationWriter.Write("-"); 
     representationWriter.Write("-+"); 
     if (column != dataTable.Columns.Count - 1) 
      representationWriter.Write("-"); 
    } 
    representationWriter.WriteLine(" "); 

    return representationWriter.ToString(); 
} 

La méthode GetStringRepresentation (DataTable) donne des résultats tels que cette

 

    +------------------+----------------+-------------------+ 
    | Item    | Units in Stock | Unit Price  | 
    +------------------+----------------+-------------------+ 
    | Drilling machine | 1000   | $1,000,000  | 
    | Backpack   | 320   | $24    | 
    | Chocolate bar | 100000   | $2.00000000000000 | 
    +------------------+----------------+-------------------+ 

j'admettre que ce style de table est triché à partir du client de ligne de commande MySQL.

+0

+1 Juste ce que je cherchais. – blak3r

+0

Merci beaucoup. Juste ce que je voulais. – captonssj

Questions connexes