如何从vb.net中仅在DataGridView中导出CSV?

发布于 2025-02-10 00:10:27 字数 1101 浏览 3 评论 0 原文

我正在研究刮擦程序,从datagridview生成/导出到CSV文件后,我程序的下一步是从我的程序中开始的。我已经制作了以下保存代码,但我只想导出一个可见的列。我怎么能喜欢?

Private Sub CmdCSV_Click(sender As Object, e As EventArgs) Handles CmdCSV.Click
        Dim sfd As New SaveFileDialog()
        sfd.FileName = "export-csv"
        sfd.Filter = "CSV File | *.csv"

        If sfd.ShowDialog() = DialogResult.OK Then
            Using sw As StreamWriter = File.CreateText(sfd.FileName)
                Dim dgvColumnNames As List(Of String) = DataGridView1.Columns.Cast(Of DataGridViewColumn).ToList().Select(Function(c) c.Name).ToList()

                sw.WriteLine(String.Join(";", dgvColumnNames))

                For Each row As DataGridViewRow In DataGridView1.Rows
                    Dim rowData As New List(Of String)

                    For Each column As DataGridViewColumn In DataGridView1.Columns
                        rowData.Add(Convert.ToString(row.Cells(column.Name).Value))
                    Next
                    sw.WriteLine(String.Join(";", rowData))
                Next

            End Using
        End If
    End Sub

I'm working on scraping program, the next step from my program after scraping item is generate/export from datagridview into csv file. I have made the save code like below, but i just want to export only a visible column. How can i do like that?

Private Sub CmdCSV_Click(sender As Object, e As EventArgs) Handles CmdCSV.Click
        Dim sfd As New SaveFileDialog()
        sfd.FileName = "export-csv"
        sfd.Filter = "CSV File | *.csv"

        If sfd.ShowDialog() = DialogResult.OK Then
            Using sw As StreamWriter = File.CreateText(sfd.FileName)
                Dim dgvColumnNames As List(Of String) = DataGridView1.Columns.Cast(Of DataGridViewColumn).ToList().Select(Function(c) c.Name).ToList()

                sw.WriteLine(String.Join(";", dgvColumnNames))

                For Each row As DataGridViewRow In DataGridView1.Rows
                    Dim rowData As New List(Of String)

                    For Each column As DataGridViewColumn In DataGridView1.Columns
                        rowData.Add(Convert.ToString(row.Cells(column.Name).Value))
                    Next
                    sw.WriteLine(String.Join(";", rowData))
                Next

            End Using
        End If
    End Sub

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

山人契 2025-02-17 00:10:27

首先,在这里两次都没有点调用 TOLIST

Dim dgvColumnNames As List(Of String) = DataGridView1.Columns.Cast(Of DataGridViewColumn).ToList().Select(Function(c) c.Name).ToList()

您不需要通用 list 进行选择,因此请删除第一个 Tolist

Dim dgvColumnNames = DataGridView1.Columns.
                                   Cast(Of DataGridViewColumn).
                                   Select(Function(c) c.Name).
                                   ToList()

如果要过滤该列表以仅包含可见列,那就是您要做的。 其中方法是您的过滤方式:

Dim dgvColumnNames = DataGridView1.Columns.
                                   Cast(Of DataGridViewColumn).
                                   Where(Function(c) c.Visible).
                                   Select(Function(c) c.Name).
                                   ToList()

您还应该替换以下

Dim rowData As New List(Of String)

For Each column As DataGridViewColumn In DataGridView1.Columns
    rowData.Add(Convert.ToString(row.Cells(column.Name).Value))
Next

内容:

Dim rowData As New List(Of String)

For Each columnName In dgvColumnNames
    rowData.Add(Convert.ToString(row.Cells(columnName).Value))
Next

或者更简单地说:

Dim rowData = dgvColumnNames.Select(Function(s) row.Cells(columnName).Value.ToString()).ToList()

最后 tolist 也不需要,因为 string.join 接受 iEnumerable(String)。除非您实际需要一个,否则不要花更多的时间和精力将事物转换为通用列表。

Firstly, there's no point calling ToList twice here:

Dim dgvColumnNames As List(Of String) = DataGridView1.Columns.Cast(Of DataGridViewColumn).ToList().Select(Function(c) c.Name).ToList()

You don't need a generic List to do the Select, so drop the first ToList:

Dim dgvColumnNames = DataGridView1.Columns.
                                   Cast(Of DataGridViewColumn).
                                   Select(Function(c) c.Name).
                                   ToList()

If you want to filter that list to include only visible columns, that's what you do. The Where method is how you filter:

Dim dgvColumnNames = DataGridView1.Columns.
                                   Cast(Of DataGridViewColumn).
                                   Where(Function(c) c.Visible).
                                   Select(Function(c) c.Name).
                                   ToList()

You should also replace this:

Dim rowData As New List(Of String)

For Each column As DataGridViewColumn In DataGridView1.Columns
    rowData.Add(Convert.ToString(row.Cells(column.Name).Value))
Next

with this:

Dim rowData As New List(Of String)

For Each columnName In dgvColumnNames
    rowData.Add(Convert.ToString(row.Cells(columnName).Value))
Next

or, more simply, this:

Dim rowData = dgvColumnNames.Select(Function(s) row.Cells(columnName).Value.ToString()).ToList()

That last ToList isn't required either, because String.Join accepts an IEnumerable(Of String). Don't take the extra time and effort to convert things to a generic List unless you actually need one.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文