出口DataGridView的文本文件保存列一字排开
我工作的项目学校,使用VB,我在Visual Studio 2017年 工作,我有一个DataGridView,我需要导出到一个文本文件中。出口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
,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
希望这会有所帮助。
你没有做任何事情来使它们像填充'字段'或特定大小的虚拟列中的文本一样对齐。请读[ask]并参加[tour] – Plutonix
取出插入选项卡的if语句,而在写入时使用'tw.Write(dgvApplianceList.Columns(count).HeaderText.PadRight(20))'平面文件。你可以用任何你想要的宽度来代替20,或者根据列索引来更换它,如果你想要不同的列大小 – soohoonigan
你能不能确定每个列中填充字符数最多的单元格,并相应填充 - 使每个单元格都包含执行导出前的字符数量? – ThatGuy