将 DataTable 打印到 .NET 中的文本框/文本文件

2024-05-01

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



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

Edit

这是一个初始版本 (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

我建议你看看我的文章数据表格式化程序 http://bassem-mohsen.com/2011/08/06/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) 给出如下结果




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

  

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 DataTable 打印到 .NET 中的文本框/文本文件 的相关文章

  • 将对象列表添加到 ef 中的上下文

    是否可以在不使用 foreach addObject 的情况下将对象列表添加到实体框架中的 Context 感谢帮助 从 EntityFramework 6 开始 您可以使用DbSet AddRange 方法 IEnumerable htt
  • 使用 Firestore 和 Flutter 填充数据表(使用 StreamBuilder)

    如何使用 StreamBuilder 填充数据表 下面是我的代码 new StreamBuilder stream widget returnStreamWithActiveKeysOnly builder BuildContext con
  • 当您在 .net 项目中添加 dll 的引用时会发生什么

    我在 net 中有一个类库项目 名为 A 构建时将创建一个 dll 即 A dll 我有另一个项目 B 该项目包含 dll A dll 的引用 当我在 B 中添加 A 的引用时到底会发生什么 谁能告诉我在编译时和运行时会发生什么 编译器将
  • 如何将一个控件的属性绑定到另一个控件的属性?

    我希望当表单被禁用时 表单中的 保存 按钮消失 我这样做 this formStackPanel IsEnabled someValue if this formStackPanel IsEnabled this saveButton Vi
  • 在 .NET 并发线程之间传递数据的最佳方式是什么?

    我有两个线程 一个需要轮询一堆单独的静态资源以查找更新 另一种需要获取数据并将其存储在数据库中 线程1如何告诉线程2有东西要处理 如果数据块是独立的 则将数据块视为要由线程池处理的工作项 使用线程池和QueueUserWorkItem将数据
  • 如何使用合并或替换来更新 R 中具有多列的表

    我想做一些与这个问题非常相似的事情 如何使用 merge 更新 R 中的表 https stackoverflow com questions 3190118 how to use merge to update a table in r
  • 如何使用 Roslyn 通过扩展方法、静态类中的方法以及带有 ref/out 参数的方法来访问调用

    我正在致力于创建一个开源项目 用于创建 NET UML 序列图 该项目利用名为 js sequence diagrams 的 javascript 库 我不确定 Roslyn 是适合这项工作的工具 但我想我应该尝试一下 所以我整理了一些概念
  • 用于连接 DataTable 上的动态列的动态 LINQ

    我目前遇到的情况不确定如何继续 我有两个从数据库填充的数据表 我还有一个可用的列名称列表 可用于将这两个数据表连接在一起 我希望编写一组 LINQ 查询 这些查询将 显示两个数据表中的行 内部联接 用于从一个数据表更新另一个数据表 显示一个
  • rabbitmq 的 REST API

    有没有办法从 ajax 向 RabbitMQ 发送数据 我的应用程序由数千个 Web 客户端 用 js 编写 和 WCF REST 服务组成 现在我试图弄清楚如何为我的应用程序创建可扩展点 这个想法是有一个rabbitmq实例 它从放置在一
  • 在同一进程中混合 .NET 3.5 与 4/4.5 程序集

    我想将基于 NET 3 5 WinForms 的应用程序迁移到最新的 NET 版本 4 5 该应用程序使用当前也基于 NET 3 5 的 外部 组件 可以视为插件 我想知道我们转换时使用哪些运行时 核心库仅应用程序使用 NET 4 5 进行
  • 使用另一个 MEF 程序集中的类而不引用它

    我有 2 个 MEF 组件 设其为A成分和B成分 我需要的是能够从组件 A 中的组件 B 访问一个类 而不需要引用它 然后我想手动实例化该类的对象 目前我看到 MEF 允许使用 Import 自动实例化对象 它使用需要引用的接口 我可以使用
  • 使用 System.IO.compressing.Gzip 压缩和解压缩非常大的文件

    我的问题可以用以下语句来描述 我希望我的程序能够压缩和解压缩选定的文件 我有非常大的文件 20 GB 可以安全地假设该大小永远无法装入内存 即使压缩后 压缩文件可能仍然无法放入内存 我想使用 System IO Compression Gz
  • Python 3 print() 到变量

    在Python 3中 您可以使用 print 函数将数据写入文件 例如print my data file my open file 这很好 而且非常酷 但你可以吗print到 字符串 变量 如果是这样 怎么办 在我的特定用例中 我试图避免
  • xmlns 元素的顺序重要吗

    我不知道如何在 google 中搜索此内容 但是 xmlns 元素的问题在 XML 文件中重要吗 我正在 ASP NET VB 中使用 XMLWriter 创建一个 XML 文件 并且尝试匹配我提供的示例
  • Thread.sleep vs Monitor.Wait vs RegisteredWaitHandle?

    以下项目有不同的目标 但我很有趣知道它们如何 暂停 问题 Thread sleep 它会影响系统性能吗 它是否会占用线程的等待时间 关于什么Monitor Wait 他们 等待 的方式有何不同 他们的等待会占用一个线程吗 关于什么Regis
  • Silverlight 打印中“对话框必须由用户启动”安全异常的另一个技巧

    当我尝试在 Silverlight 中打印一些内容时 我收到臭名昭著的 对话框必须由用户启动 安全异常 正如您所看到的 该对话框尽可能由用户启动 约翰爸爸也帮不了我太多 http johnpapa net silverlight print
  • ODP.Net - OracleDataReader.读取速度非常慢

    我在 ODP Net 中的 OracleDataReader 方面遇到很多麻烦 基本上 我有一个参数化查询 需要 1 5 秒的时间来运行 返回大约 450 条记录 然后需要 60 90 秒的时间来循环 甚至没有代码在循环中运行 实际上是迭代
  • .NET 中应用程序域的常见用途和最佳实践?

    关于何时在应用程序中创建新的应用程序域 有哪些准则和最佳实践 另外 有哪些常见用途以及如何在应用程序中使用多个应用程序域的示例 我见过的最常见的场景是能够通过与主程序不同的安全模型提供可扩展性 在单独的 AppDomain 中加载插件可以实
  • data.table 相当于 dplyr::filter_at

    考虑数据 library data table library magrittr vec1 lt c Iron Copper vec2 lt c Defective Passed Error set seed 123 a1 lt sampl
  • 我的 C# .NET 团队是否应该迁移到 Windows Presentation Foundation? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • Windows API 代码包 - ShellFile 不生成 PDF 位图

    使用之前堆栈溢出问题中的代码 System Drawing Bitmap image ShellFile f ShellFile FromFilePath fileLocation image f Thumbnail ExtraLargeB
  • 如何在 Postgres 中对包含语义版本的列进行排序

    有没有办法高效存储https semver org https semver orgPostgres 中的版本字符串 然后执行最新查询 例如假设列的值为 1 1 0 1 0 0 1 2 0 1 0 1 rc 1 B001 我想排序并获取最新
  • Socket IO聊天例子很慢

    我是 Node js 和 Socket IO 的新手 我想尝试一下解释的示例 https socket io get started chat https socket io get started chat 我做了我必须做的一切 它起作用
  • 不同 Perl 安装造成的混乱

    我尝试升级 Perl 却把我的电脑搞得一团糟 我目前运行的是 RHEL6 5 64 位 事情是这样的 我安装了 perl 5 10 1 并且运行良好 这是安装好的 我可以从百胜看到它 我想安装 Padre 一个 Perl IDE 但这至少需
  • 删除查询字符串参数

    Is there any way to remove query string parameters from url in azure api management Thanks in advance 是的 您可以通过在发布者门户的操作屏
  • 角度锚标记单击的元素 ID 未显示

    我正在尝试获取单击的锚元素的 id 这是我的 HTML div class list group col md 4 a href class list group item img src book image alt p strong P
  • 如何在android文本视图的任意一端插入文本?

    是否可以有一个文本视图 其中在文本视图的最左侧包含一些文本 在文本视图的最右侧包含一些文本 例如 我想要一个应该像这样显示的文本视图 文字 a 可以使用单个 TextView 只需将文本放入 HTML 格式即可 例如
  • Firebase 动态链接无法获取参数

    我正在我的应用程序中处理邀请 我希望用户推荐其他人 推荐人将在他们推荐的人注册后获得奖励 我正在关注这个firebase 邀请教程 https firebase google com docs dynamic links use cases
  • 有没有办法运行查询并检查聚合数据而无需再次重新运行查询?

    在决定枚举 LINQ 查询的结果集之前 我想查看查询结果计数 可能还有其他聚合数据 几乎每个 LINQ 示例都会立即枚举 foreach 循环中的结果 但我想检查计数以确定是否需要循环每个结果 有没有办法运行查询并检查聚合数据而无需再次重新
  • jQuery 绑定 ajax:成功无法在 Rails 3 应用程序中为新创建的(ajax)项目工作

    编辑这篇文章是因为我发现问题实际上在于rails无法绑定到ajax success函数 使用导轨3 2 3 感谢您花时间阅读并尝试提供帮助 我在 ajax success 删除项目上添加一个简单的淡出功能 如下所示 document rea
  • 在所有设备上使用 jquery 垂直对齐?

    我发现在不更改其他元素布局的情况下垂直对齐页面上的某些元素是有问题的 这个问题在移动设备上更加严重 如此多的屏幕尺寸 分辨率 纵向 横向 var x window innerHeight myDiv height myDiv css mar
  • Android ArrayList 的 IndexOutOfBoundsException [重复]

    这个问题在这里已经有答案了 我遇到了一个非常烦人的问题 一些代码抛出 IndexOutOfBoundsException 我真的不明白为什么 logcat 指向以下代码的 addTimetableItem 我们将对此进行更多解释 if so
  • 测试涉及打开文件夹/工作区的 VSCode 扩展

    我正在开发一个 VSCode 扩展 它将当前在工作区中打开的文件的路径考虑在内 因此 为了进行可重现的测试 我尝试在 VSCode 中打开测试文件夹本身 然后打开其中的测试文件 如下所示 import as vscode from vsco
  • 学说和大量数据

    我有一个返回约 50k 行的查询 似乎学说将整个结果放入内存中超出了内存限制 128M 我发现节省一些内存的唯一解决方案是 result gt execute array Doctrine Core HYDRATE NONE 但还是超出了极
  • 在运行时拖动窗体上的控件

    我刚刚开始使用 WPF 但我正在尝试添加我的代码 来自 Winforms 使用户能够在运行时将任何控件拖动到他们想要的任何位置 但我似乎无法获取鼠标当前的位置 呃 没有鼠标位置 在 Mouse 事件中 您可以使用 e GetPosition
  • 如何让 CompletionService 知道项目中的其他文档?

    我正在构建一个允许用户定义 编辑和执行 C 脚本的应用程序 定义由方法名称 参数名称数组和方法的内部代码组成 例如 名称 脚本1 参数名称 arg1 arg2 代码 return Arg1 arg1 Arg2 arg2 基于这个定义 可以生
  • 安装 mariadb 包时找不到 mariadb_config [重复]

    这个问题在这里已经有答案了 我尝试在 ubuntu 20 04 上安装 mariadb 软件包 并收到以下消息 Collecting mariadb Using cached mariadb 1 1 3 tar gz 80 kB Prepa
  • StorageFile比IsolatedStorageFile慢50倍

    当我发现在 Lumia 920 上运行的应用程序的 WP7 版本加载数据的速度是在同一设备上运行的 WP8 版本的 2 倍时 我正在对多种算法进行基准测试 以找到加载应用程序中所有数据的最快方法 然后 我编写了以下独立代码来测试 WP8 中
  • python tarfile 中 tar --strip 的等效功能

    我有一个具有以下目录结构的 tar 文件 a b c xyz txt 我想通过忽略父目录 a 来从此 tar 文件中提取文件 提取后 我期望以下目录结构 b c xyz txt 对于 tar 命令 我们可以使用 strip 1 选项 如何在
  • 将 DataTable 打印到 .NET 中的文本框/文本文件

    是否有预定义或 简单 的方法将数据表写入文本文件或 TextBox 控件 使用等宽字体 例如 DataTable Print Column1 Column2 v1 v2 v3 v4 v5 v6 Edit 这是一个初始版本 vb net 如果