【问题标题】:Printing a DataTable to textbox/textfile in .NET在 .NET 中将 DataTable 打印到文本框/文本文件
【发布时间】:2009-03-27 20:32:30
【问题描述】:

是否存在将数据表写入文本文件或 TextBox 控件(使用等宽字体)的预定义或“简单”方法,例如 DataTable.Print():

栏目1|栏目2| --------|--------| v1| v2| v3| v4| v5| v6|

编辑

这是一个初始版本 (vb.net) - 如果有人感兴趣或想要构建自己的版本:

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

【问题讨论】:

    标签: .net printing datatable writing


    【解决方案1】:

    我建议您查看我的文章DataTable Formatter
    我的 DataTableFormatter 类包含将 DataTable 格式化为基于字符的表格(您的要求)、HTML 表格或流文档表格的方法。

    您可以从我的网站下载包含该类的项目,但为方便起见,我将在此处发布代码。

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

    GetStringRepresentation(DataTable) 方法给出这样的结果

    +-----------------+----------------+------------- ------+ |项目 |库存单位 |单价 | +-----------------+----------------+------------- ------+ |钻孔机 | 1000 | 1,000,000 美元 | |背包 | 320 | 24 美元 | |巧克力棒 | 100000 | $2.00000000000000 | +-----------------+----------------+------------- ------+

    我应该承认这种表格样式是从 MySQL 命令行客户端欺骗的。

    【讨论】:

    • 非常感谢。正是我想要的。
    【解决方案2】:

    你可以使用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();
    }
    

    【讨论】:

      【解决方案3】:

      不,没有。您必须自己进行格式化,或者找到一个可以自己进行格式化的第三方库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-13
        • 1970-01-01
        • 2015-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-08
        相关资源
        最近更新 更多