Экспорт CSV из ListView в VB.NET

#vb.net #csv #export

Вопрос:

у меня возникла небольшая проблема с экспортом моих данных из списка в VB.NET я включил скриншоты того, что я вижу, в основном я хочу видеть только значения в своем csv-файле при его экспорте,

как вы можете видеть, я вижу, что показывает окно списка, эти значения поступают из представления списка перед экспортом. также мне нужно, чтобы экспорт был в 1 столбце, а не в строках, как показано на рисунке

любая помощь была бы очень кстати..

Экспортированный CSV

CSV-ГРАФИЧЕСКИЙ интерфейс

 '''' 
  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|" amp; _
            "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() amp; ",")
                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("""" amp; lv.Columns(i).Text.Replace("""", """""") amp; """,")
        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("""" amp; 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
''''
 

Комментарии:

1. Показать используйте код для создания записей csv. Очень похоже на ваш экспорт элементов ListViewItem, а не на элемент ListViewItem. Ценности

2. Если это не работает, значит, вы делаете это неправильно. Если вы не покажете нам, что вы делаете, мы не сможем сказать вам, что с этим не так. Нам НИКОГДА не придется просить вас ПОКАЗАТЬ НАМ КОД. Вам нужно опубликовать ВСЮ соответствующую информацию, и код, который не работает, ВСЕГДА актуален.

3. @Херси, Правильная скамья, неправильная церковь. 🙂 ListViewItem не имеет свойства Value. У него есть свойство Text, которое должно решить проблему операции.

4. Это довольно распространенное требование, и оно выполнялось много раз. Вот учебник с кодом: dotnetref.blogspot.com/2008/03/… (один из многих доступных онлайн) Надеюсь, это поможет.

5. Я добавил свой полный исходный код

Ответ №1:

Поскольку вы не показали нам свой код, мы не можем сказать вам, как конкретно его изменить. В целом, однако, вы можете рассматривать представление списка как 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))))