Puisque vous écrivez à un fichier « texte », une façon d'aligner le texte peut bien être accompli en utilisant des espaces comme d'autres l'ont suggéré. Cela nécessiterait que vous ayez une "largeur" de colonne "définie" pour chaque colonne. En utilisant votre image comme exemple, la colonne 0 (zéro) serait "Type d'appareil" et nous pourrions donner à cette colonne une "largeur" maximale de ... disons vingt-cinq (25) caractères de large. La colonne 2 "kwh" peut être définie avec une largeur de colonne maximale de 15 et ainsi de suite pour chaque colonne. Avec les "largeurs de colonne" établies, il suffirait d'ajouter X nombre d'espaces nécessaires pour remplir la chaîne à la largeur des colonnes. Par exemple, pour s'assurer que la colonne 2 s'aligne avec la colonne suivante 2, chaque colonne 1 DOIT avoir la même longueur. En remplissant chaque colonne 1 chaîne avec des espaces pour "remplir" la chaîne à la longueur de la colonne 1, s'assurera que le texte de la colonne 2 s'alignera correctement. Évidemment, la même logique s'applique aux colonnes suivantes.
La méthode GetBufferedString
(ci-dessous) illustre un moyen de mettre en mémoire tampon les chaînes à une largeur de colonne spécifiée. La méthode prend une chaîne originalString
, un int maxLength
et un type de justification. La méthode renverra une chaîne de longueur maxLength
de sorte que, si le type de justification est LEFT, la méthode remplira la chaîne donnée avec des espaces à la fin. Si le type de justification est RIGHT, la méthode renvoie une chaîne de maxLength
de sorte que des espaces sont ajoutés au début de la chaîne. Enfin, si le type de justification est CENTER, la méthode renvoie une chaîne avec la moitié des espaces devant la chaîne et l'autre moitié à la fin. Si la longueur de la chaîne donnée est supérieure à maxLength
, la chaîne renvoyée sera une troncature maxLength
de la chaîne donnée.
Ceci devrait vous permettre de définir indépendamment chaque type de justification de colonnes. Le code ci-dessous définit simplement chaque type de justification de lignes à droite. Ceci est un exemple et j'espère que cela aide, mais il n'y a pas de vérification d'erreur pour une éventuelle incompatibilité sur le nombre de colonnes réelles dans la grille et le nombre de largeurs de colonnes.
Certaines variables globales ... un tableau d'entiers columnLengths
est utilisé pour contenir chaque largeur de colonnes ... également une énumération pour le type de justification; DROIT, GAUCHE, CENTRE.
Dim columnLengths(6) As Integer
Enum JustifyType
LEFT
RIGHT
CENTER
End Enum
Réglage de la largeur des colonnes ... chaque
Private Sub FillColumnLength()
columnLengths(0) = 25
columnLengths(1) = 12
columnLengths(2) = 12
columnLengths(3) = 12
columnLengths(4) = 12
columnLengths(5) = 12
End Sub
Une mise à jour bouton Enregistrer événement click pour utiliser la méthode 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
Enfin, la méthode 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
Espérons que cela aide.
Vous ne faites rien pour les aligner, comme le remplissage du texte dans des 'champs' ou des colonnes virtuelles d'une certaine taille. Veuillez lire [ask] et prendre le [tour] – Plutonix
Sortez les instructions if qui insèrent les onglets, et utilisez à la place 'tw.Write (dgvApplianceList.Columns (count) .HeaderText.PadRight (20))' lorsque vous écrivez le fichier plat. Vous pouvez remplacer le 20 avec la largeur que vous voulez, ou le changer selon l'index de la colonne si vous voulez des tailles de colonnes différentes. – soohoonigan
Pourriez-vous simplement identifier la cellule avec le plus grand nombre de caractères dans chaque colonne et remplir en conséquence? nombre de caractères avant d'effectuer votre exportation? – ThatGuy