将 DataGridView 导出到文本文件,保持列对齐
Export DataGridView to text file keeping columns lined up
我正在为学校做项目,使用 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
由于您正在写入“文本”文件,因此可以像其他人建议的那样使用空格来正确排列文本的一种方法。这将要求您为每一列都有一个“定义的”列“宽度”。以您的图片为例,第 0 列(零)将是“设备类型”,我们可以为该列指定最大“宽度”……比如二十五 (25) 个字符宽。第 2 列“kwh”可以设置为每列的最大列宽为 15,依此类推。
随着“列宽”的建立,将填充字符串所需的X个空格添加到列宽应该是一件简单的事情。例如,为了确保第 2 列与下一个第 2 列对齐,每个第 1 列字符串的长度都必须相同。通过用空格填充每个第 1 列字符串以将字符串“填充”到第 1 列的长度,将确保第 2 列的文本正确排列。显然,相同的逻辑适用于后续列。
GetBufferedString
方法(如下)演示了一种将字符串缓冲到指定列宽的方法。该方法采用字符串 originalString
、整数 maxLength
和对齐类型。该方法将 return 一个长度为 maxLength
的字符串,这样,如果对齐类型为 LEFT,该方法将在末尾用空格填充给定的字符串。如果对齐类型为 RIGHT,则该方法将 return 一个 maxLength
的字符串,以便在字符串的前面添加空格。最后,如果对齐类型是 CENTER,那么该方法将 return 一个字符串,其中一半的空格在字符串的前面,另一半在字符串的末尾。如果给定字符串的长度大于 maxLength
,则 returned 字符串将是给定字符串的 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
希望这对您有所帮助。
我正在为学校做项目,使用 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
由于您正在写入“文本”文件,因此可以像其他人建议的那样使用空格来正确排列文本的一种方法。这将要求您为每一列都有一个“定义的”列“宽度”。以您的图片为例,第 0 列(零)将是“设备类型”,我们可以为该列指定最大“宽度”……比如二十五 (25) 个字符宽。第 2 列“kwh”可以设置为每列的最大列宽为 15,依此类推。
随着“列宽”的建立,将填充字符串所需的X个空格添加到列宽应该是一件简单的事情。例如,为了确保第 2 列与下一个第 2 列对齐,每个第 1 列字符串的长度都必须相同。通过用空格填充每个第 1 列字符串以将字符串“填充”到第 1 列的长度,将确保第 2 列的文本正确排列。显然,相同的逻辑适用于后续列。
GetBufferedString
方法(如下)演示了一种将字符串缓冲到指定列宽的方法。该方法采用字符串 originalString
、整数 maxLength
和对齐类型。该方法将 return 一个长度为 maxLength
的字符串,这样,如果对齐类型为 LEFT,该方法将在末尾用空格填充给定的字符串。如果对齐类型为 RIGHT,则该方法将 return 一个 maxLength
的字符串,以便在字符串的前面添加空格。最后,如果对齐类型是 CENTER,那么该方法将 return 一个字符串,其中一半的空格在字符串的前面,另一半在字符串的末尾。如果给定字符串的长度大于 maxLength
,则 returned 字符串将是给定字符串的 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
希望这对您有所帮助。