2017-08-11 2 views
0

Ich arbeite an einem Projekt für die Schule, mit VB, ich arbeite in Visual Studio 2017. Ich habe eine DataGridView, die ich in eine Textdatei exportieren muss.Exportieren von DataGridView in Textdatei mit Spalten aufgereiht

Ich könnte Hilfe mit einer Exportfunktion von VB zu einer Textdatei verwenden. Hier ist der Code ich verwende:

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

Sie tun nichts, um sie auszurichten, wie den Text in 'Feldern' oder virtuellen Spalten einer bestimmten Größe auffüllen. Bitte lesen Sie [ask] und nehmen Sie die [Tour] – Plutonix

+0

Nehmen Sie die if-Anweisungen heraus, die Registerkarten einfügen, und verwenden Sie 'tw.Write (dgvApplianceList.Columns (count) .HeaderText.PadRight (20))', wenn Sie schreiben die flache Datei. Sie können die 20 mit der von Ihnen gewünschten Breite ersetzen oder sie je nach Spaltenindex ändern, wenn Sie unterschiedliche Spaltengrößen wünschen. – soohoonigan

+0

Können Sie einfach die Zelle mit der größten Anzahl an Zeichen in jeder Spalte identifizieren und entsprechend auffüllen - jede Zelle enthält diese Anzahl der Zeichen vor dem Export? – ThatGuy

Antwort

0

Da Sie zu einer „Text“ Datei schreiben, eine Möglichkeit, Text aufreihen ordnungsgemäß durchgeführt werden kann mit Leerzeichen wie andere vorgeschlagen haben. Dies würde erfordern, dass Sie für jede Spalte eine "definierte" Spalte "width" haben. Wenn Sie Ihr Bild als Beispiel verwenden, wäre die Spalte 0 (Null) "Gerätetyp" und wir könnten dieser Spalte eine maximale "Breite" von ... sagen, 25 (25) Zeichen breit. Spalte 2 "kwh" könnte mit einer maximalen Spaltenbreite von 15 usw. für jede Spalte eingestellt werden.

Wenn die "Spaltenbreiten" festgelegt sind, sollte es eine einfache Angelegenheit sein, die Anzahl der X Leerzeichen hinzuzufügen, die benötigt werden, um die Zeichenfolge in die Spaltenbreite zu füllen. Beispiel: Um sicherzustellen, dass Spalte 2 mit der nächsten Spalte 2 übereinstimmt, muss jede Spalte 1 Zeichenfolge die gleiche Länge haben. Wenn Sie jede Spalte mit einer Zeichenfolge mit Leerzeichen füllen, um die Zeichenfolge auf die Länge von Spalte 1 zu "füllen", wird sichergestellt, dass der Text der Spalte 2 korrekt ausgerichtet ist. Offensichtlich gilt die gleiche Logik für nachfolgende Spalten.

Die Methode GetBufferedString (unten) demonstriert eine Möglichkeit, die Zeichenfolgen auf eine angegebene Spaltenbreite zu puffern. Die Methode verwendet eine Zeichenfolge originalString, eine int maxLength und einen Ausrichtungstyp. Die Methode gibt eine Zeichenfolge der Länge maxLength so zurück, dass die Methode die angegebene Zeichenfolge mit Leerzeichen am Ende füllt, wenn der Ausrichtungstyp LEFT ist. Wenn der Ausrichtungstyp RIGHT ist, gibt die Methode eine Zeichenfolge maxLength zurück, so dass Leerzeichen an der Vorderseite der Zeichenfolge hinzugefügt werden. Wenn der Ausrichtungstyp CENTER ist, gibt die Methode schließlich eine Zeichenfolge mit der Hälfte der Leerzeichen vor der Zeichenfolge und die andere Hälfte am Ende zurück. Wenn die Länge der angegebenen Zeichenfolge größer als maxLength ist, ist die zurückgegebene Zeichenfolge eine maxLength Kürzung der angegebenen Zeichenfolge.

Dies sollte Ihnen ermöglichen, jede Spaltenausrichtungsart unabhängig zu setzen. Der folgende Code setzt den Rechtentyp der Zeilen einfach nach rechts.

Dies ist ein Beispiel und ich hoffe, es hilft, aber es gibt keine Fehlerüberprüfung für eine mögliche Abweichung bei der Anzahl der tatsächlichen Spalten im Raster und die Anzahl der Spaltenbreiten.

Einige globale Variablen ... ein Integer-Array columnLengths wird verwendet, um jede Spaltenbreite zu halten ... auch eine Aufzählung für den Ausrichtungstyp; RECHTS, LINKS, MITTE.

Dim columnLengths(6) As Integer 

Enum JustifyType 
    LEFT 
    RIGHT 
    CENTER 
End Enum 

Set jeweils Spalten Breite ...

Private Sub FillColumnLength() 
    columnLengths(0) = 25 
    columnLengths(1) = 12 
    columnLengths(2) = 12 
    columnLengths(3) = 12 
    columnLengths(4) = 12 
    columnLengths(5) = 12 
End Sub 

Ein Speichern klicken Ereignis aktualisiert, um die GetBufferedString Methode zu verwenden.

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 

Schließlich die GetBufferedString Methode.

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 

Hoffe, das hilft.

Verwandte Themen