2009-03-27 6 views
5

Czy istnieje predefiniowany lub „łatwy” sposób pisania DataTable do pliku tekstowego lub TextBox sterującego (z czcionką o stałej szerokości), takie jak DataTable.Print():Drukowanie DataTable do pola tekstowego/textfile w .NET

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

Edit

Oto wstępna wersja (vb.net) - w przypadku gdy ktoś jest zainteresowany lub chce budować własne:

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 

Odpowiedz

1

Nie, nieprawdaż "t. Będziesz musiał sam wykonać formatowanie lub znaleźć bibliotekę firm trzecich, która zrobi to samodzielnie.

+0

Tak, dziękuję, będę zajęty pisaniem własnych. – user79755

3

można użyć 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

Dziękujemy za próbkę kodu. – user79755

4

Polecam sprawdzić mój artykuł DataTable Formatter.
Moja klasa DataTableFormatter zawiera metody formatowania DataTables jako tabele oparte na znakach (twoje wymagania), tabele HTML lub tabele dokumentów przepływu.

Możesz pobrać projekt zawierający klasę z mojej strony internetowej, ale dla wygody opublikuję tutaj kod.

/// <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(); 
} 

Sposób GetStringRepresentation (DataTable) daje rezultaty takie jak ten

 

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

muszę przyznać, że ten styl stół jest oszukany z MySQL wiersza poleceń klienta.

+0

+1 Właśnie tego szukałem. – blak3r

+0

Wielkie dzięki. Właśnie tego chciałem. – captonssj