2017-08-11 74 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 

希望這會有所幫助。