首页 > 解决方案 > 在 VB.NET 中从 ListView 导出 CSV

问题描述

我在从 VB.NET 的列表视图中导出数据时遇到了一些问题,我已经包含了我所看到的屏幕截图,基本上我只想在导出 csv 文件时看到它的值,

如您所见,我看到了列表框显示的内容,这些值来自导出前的列表视图。我还需要将导出放在 1 列中,而不是如图所示的行

任何帮助都会很棒..

导出的 CSV

CSV-GUI

'''' 
  Imports System.IO
  Imports System.IO.StreamReader
  Imports System.IO.StreamWriter
  Imports System.Data.DataSet

  Public Class Form1

Private Sub startcol_Click(sender As Object, e As EventArgs) Handles startcol.Click
    Timer1.Enabled = True
End Sub

Private Sub stopcol_Click(sender As Object, e As EventArgs) Handles stopcol.Click
    Timer1.Enabled = False

End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Const MIN As Double = 5.0
    Const MAX As Double = 400.0
    Const DEC_PLACES As Integer = 2

    Dim rnd As New Random
    Dim list As Integer()

    'Generate a random number X where MIN <= X < MAX and then round to DEC_PLACES decimal places.
    Dim dbl As Double = Math.Round(rnd.NextDouble() * (MAX - MIN) + MIN, DEC_PLACES)
    weight.Text = dbl


    Dim newItem As New ListViewItem(weight.Text)
    newItem.SubItems.Add(weight.Text)

    'newItem.SubItems.Add(TextBox3.Text)
    ListBox1.Items.Add(newItem)
    ListView1.Items.Add(newItem)
    rowcnt.Text = ListView1.Items.Count

End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Timer1.Enabled = True

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' ExportDatasetToCsv(List)
    'WriteToTextFile()
    Me.DoSave()

End Sub


Private Sub DoSave()
    Dim SFD As New SaveFileDialog()
    Try
        With SFD
            .AddExtension = True
            .CheckPathExists = True
            .CreatePrompt = False
            .OverwritePrompt = True
            .ValidateNames = True
            .ShowHelp = True
            .DefaultExt = "txt"
            .Filter = _
            "CSV Files (*.csv)|*.csv|" & _
            "All files|*.*"
            .FilterIndex = 1

            If .ShowDialog() = Windows.Forms.DialogResult.OK Then
                Me.DoSaveItems(.FileName)
            End If

        End With
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.Exclamation, Me.Text)
    End Try
End Sub

' save All values from ListView1
Private Sub DoSaveItems(ByVal fileName As String)
    If fileName Is Nothing = False Then
        If fileName.Length > 0 Then
            Using writer As New System.IO.StreamWriter(fileName)
                For Each currentItem As Object In Me.ListView1.Items
                    writer.Write(currentItem.ToString() & ",")
                Next
            End Using
        End If
    End If

End Sub

Public Function ExportListViewToCSV(ByVal filename As String, ByVal lv As ListView) As Boolean

    Try

        ' Open output file
        Dim os As New StreamWriter(filename)

        ' Write Headers

        For i As Integer = 0 To lv.Columns.Count - 1
            ' replace quotes with double quotes if necessary
            os.Write("""" & lv.Columns(i).Text.Replace("""", """""") & """,")
        Next

        os.WriteLine()

        ' Write records
        For i As Integer = 0 To lv.Items.Count - 1
            For j As Integer = 0 To lv.Columns.Count - 1
                os.Write("""" & lv.Items(i).SubItems(j).Text.Replace("""", """""") + """,")
            Next

            os.WriteLine()

        Next

        os.Close()

    Catch ex As Exception
        ' catch any errors
        Return False
    End Try

    Return True

End Function

Public Sub TestExportToCSV()

    Dim dlg As New SaveFileDialog
    dlg.Filter = "CSV files (*.CSV)|*.csv"
    dlg.FilterIndex = 1
    dlg.RestoreDirectory = True

    If dlg.ShowDialog = Windows.Forms.DialogResult.OK Then

        If ExportListViewToCSV(dlg.FileName, ListView1) Then

            Process.Start(dlg.FileName)

        End If

    End If

End Sub


   Private Sub Button3_Click(sender As Object, e As EventArgs) Handles             Button3.Click
    'TestExportToCSV()


    End Sub
 End Class
''''

标签: vb.netcsvexport

解决方案


由于您没有向我们展示您的代码,我们无法告诉您如何具体修改它。不过,一般而言,您可以将 ListView 视为 2D 数组,循环遍历行和列以获取数据。这意味着您可以像这样将数据输出到 CSV:

Using writer As New StreamWriter(filePath)
    For rowIndex = 0 To myListView.Items.Count - 1
        Dim item = myListView.Items(rowIndex)

        'Write a line break before all but the first line.
        If rowIndex > 0 Then
            writer.WriteLine()
        End If

        For columnIndex = 0 To myListView.Columns.Count - 1
            Dim subItem = item.SubItems(columnIndex)

            'Write a field delimiter before all but the first field.
            If columnIndex > 0 Then
                write.Write(",")
            End If

            writer.Write(subItem.Text)
        Next
    Next
End Using

那是老派的方式。有更简洁的选择,尤其是随着 LINQ 的出现:

File.WriteAllLines(filePath,
                   myListView.Items.
                              Cast(Of ListViewItem)().
                              Select(Function(item) String.Join(",",
                                                                item.SubItems.
                                                                     Cast(Of ListViewItem.ListViewSubItem)().
                                                                     Select(Function(subItem) subItem.Text))))

推荐阅读