既然你寫一個「文本」文件,一個方式來對齊文本得當可以使用空格正如其他人建議來完成。這將要求您爲每列設置一個「定義」列「寬度」。以你的圖片爲例,第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