将 DataGridView 导出到文本文件,保持列对齐

Posted

技术标签:

【中文标题】将 DataGridView 导出到文本文件,保持列对齐【英文标题】:Export DataGridView to text file keeping columns lined up 【发布时间】:2017-08-11 23:18:24 【问题描述】:

我正在为学校做项目,使用 VB,我在 Visual Studio 2017 中工作。 我有一个需要导出到文本文件的 DataGridView。

对于从 VB 到文本文件的导出功能,我可以使用一些帮助。这是我正在使用的代码:

Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
        Dim numCols As Integer = dgvApplianceList.ColumnCount
        Dim numRows As Integer = dgvApplianceList.RowCount - 1
        Dim strDestinationFile As String = "exportappliance.txt"
        Dim tw As TextWriter = New StreamWriter(strDestinationFile)

        'writing the header
        For count As Integer = 0 To numCols - 1
            tw.Write(dgvApplianceList.Columns(count).HeaderText)
            If (count <> numCols - 1) Then
                tw.Write(vbTab)
            End If
        Next
        tw.WriteLine()

        For count As Integer = 0 To numRows - 1
            For count2 As Integer = 0 To numCols - 1
                tw.Write(dgvApplianceList.Rows(count).Cells(count2).Value)
                If (count2 <> numCols) Then
                    tw.Write(vbTab)
                End If
            Next
            tw.WriteLine()
        Next
        tw.Close()
    End Sub

【问题讨论】:

您没有做任何事情来使它们对齐,例如在“字段”或特定大小的虚拟列中填充文本。请阅读How to Ask 并采取tour 删除插入制表符的 if 语句,而在写入平面文件时使用 tw.Write(dgvApplianceList.Columns(count).HeaderText.PadRight(20))。您可以将 20 替换为您想要的任何宽度,或者如果您想要不同的列大小,则根据列索引进行更改 您能否仅识别每列中字符数最多的单元格并相应地填充 - 在执行导出之前使每个单元格都包含该数量的字符? 【参考方案1】:

由于您正在写入“文本”文件,因此可以使用其他人建议的空格来正确排列文本。这将要求您为每一列都有一个“已定义”的列“宽度”。以您的图片为例,第 0 列(零)将是“设备类型”,我们可以为该列指定一个最大“宽度”……比如二十五 (25) 个字符宽。第 2 列“kwh”可以设置为每列的最大列宽为 15,依此类推。

确定“列宽”后,只需将填充字符串所需的 X 个空格添加到列宽即可。例如,为了确保第 2 列与下一个第 2 列对齐,每个第 1 列字符串必须具有相同的长度。通过用空格填充每个第 1 列字符串以将字符串“填充”到第 1 列的长度,将确保第 2 列的文本正确排列。显然,相同的逻辑适用于后续列。

GetBufferedString 方法(如下)演示了一种将字符串缓冲到指定列宽的方法。该方法接受一个字符串originalString、一个int maxLength 和一个对齐类型。该方法将返回一个长度为maxLength 的字符串,这样,如果对齐类型为 LEFT,该方法将在给定字符串的末尾填充空格。如果对齐类型为 RIGHT,则该方法将返回一个字符串 maxLength,以便将空格添加到字符串的前面。最后,如果对齐类型是 CENTER,那么该方法将返回一个字符串,其中一半空格在字符串前面,另一半在末尾。如果给定字符串的长度大于maxLength,则返回的字符串将是给定字符串的maxLength 截断。

这应该使您能够独立设置每个列的对齐类型。下面的代码只是将每一行的对齐类型设置为右。

这是一个示例,希望对您有所帮助,但是对于网格中的实际列数和列宽数可能不匹配,不会进行错误检查。

一些全局变量...一个整数数组columnLengths 用于保存每个列的宽度...也是对齐类型的枚举;右,左,中。

Dim columnLengths(6) As Integer

Enum JustifyType
  LEFT
  RIGHT
  CENTER
End Enum

设置每列的宽度…

Private Sub FillColumnLength()
  columnLengths(0) = 25
  columnLengths(1) = 12
  columnLengths(2) = 12
  columnLengths(3) = 12
  columnLengths(4) = 12
  columnLengths(5) = 12
End Sub

更新的保存按钮单击事件以使用GetBufferedString 方法。

Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
  Dim numCols As Integer = dgvApplianceList.ColumnCount
  Dim numRows As Integer = dgvApplianceList.RowCount - 1
  Dim strDestinationFile As String = "D:\Test\exportappliance.txt"
  Dim tw As TextWriter = New StreamWriter(strDestinationFile)
  Dim textToOutput = ""
  For count As Integer = 0 To numCols - 1
    textToOutput = GetBufferedString(dgvApplianceList.Columns(count).HeaderText, columnLengths(count), JustifyType.CENTER)
    tw.Write(textToOutput)
  Next
  tw.WriteLine()
  For count As Integer = 0 To numRows - 1
    For count2 As Integer = 0 To numCols - 1
      textToOutput = GetBufferedString(dgvApplianceList.Rows(count).Cells(count2).Value, columnLengths(count2), JustifyType.RIGHT)
      tw.Write(textToOutput)
    Next
    tw.WriteLine()
  Next
  tw.Close()
End Sub

最后,GetBufferedString 方法。

Private Function GetBufferedString(originalString As String, maxLength As Int16, justifyType As JustifyType) As String
  If (originalString.Length < maxLength) Then
    Dim bufString = Space(maxLength - originalString.Length)
    Select Case justifyType
      Case JustifyType.LEFT
        Return originalString + bufString
      Case JustifyType.RIGHT
        Return bufString + originalString
      Case JustifyType.CENTER
        Dim halfString = bufString.Substring(bufString.Length / 2)
        originalString = halfString + originalString
        bufString = Space(maxLength - originalString.Length)
        Return originalString + bufString
      Case Else
        Return ""
    End Select
  Else
    Return originalString.Substring(0, maxLength)
  End If
End Function

希望这会有所帮助。

【讨论】:

以上是关于将 DataGridView 导出到文本文件,保持列对齐的主要内容,如果未能解决你的问题,请参考以下文章

C# 将 DataGridView 保存到文本文件

如何将.net中DataGridView中的数据导出到Excel文本(是在windows窗体中)

将datagridview导出到csv文件

将按钮列添加到 DataGridView 并将条件文本仅应用于单击的按钮

使用互操作将 datagridview 导出到 excel

在C#中将CSV文件导出到DataGridview