2017-08-11 3 views
0

Je travaille sur un projet pour l'école, en utilisant VB, je travaille dans Visual Studio 2017. J'ai un DataGridView que j'ai besoin d'exporter dans un fichier texte.Exporter DataGridView vers des colonnes de maintien de fichier texte alignées

Je pourrais utiliser de l'aide avec une fonctionnalité d'exportation de VB vers un fichier texte. Voici le code que je utilise:

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

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

+0

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

+0

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

Répondre

0

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.