2017-08-11 57 views
0

我工作的项目学校,使用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 

Current Export results

+0

你没有做任何事情来使它们像填充'字段'或特定大小的虚拟列中的文本一样对齐。请读[ask]并参加[tour] – Plutonix

+0

取出插入选项卡的if语句,而在写入时使用'tw.Write(dgvApplianceList.Columns(count).HeaderText.PadRight(20))'平面文件。你可以用任何你想要的宽度来代替20,或者根据列索引来更换它,如果你想要不同的列大小 – soohoonigan

+0

你能不能确定每个列中填充字符数最多的单元格,并相应填充 - 使每个单元格都包含执行导出前的字符数量? – ThatGuy

回答

0

既然你写一个“文本”文件,一个方式来对齐文本得当可以使用空格正如其他人建议来完成。这将要求您为每列设置一个“定义”列“宽度”。以你的图片为例,第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 

希望这会有所帮助。