DataGridView文本导出为CSV

时间:2019-04-09 20:57:00

标签: vb.net

我想将所有数据从DataGridView导出到CSV文件,但是日期格式错误。 我想要的日期格式为“ dd-MMM-yy”

完整代码:

Imports System.Data.OracleClient
Imports System.IO
Imports System.Text

Public Class Form1
    Private da As OracleDataAdapter
    Private cb As OracleCommandBuilder
    Private ds As DataSet

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim oradb As String = "Data Source=testdb;User Id=teszt;Password=teszt;"
        Dim conn As New OracleConnection(oradb)
        conn.Open()
        Dim cmd As New OracleCommand

        Dim sql As String = "select * from dont"
        cmd = New OracleCommand(sql, conn)
        cmd.CommandType = CommandType.Text

        da = New OracleDataAdapter(cmd)
        cb = New OracleCommandBuilder(da)
        ds = New DataSet()

        da.Fill(ds)

        DataGridView1.DataSource = ds.Tables(0)

        Dim xRowCount As Integer = 0
        Do Until xRowCount = DataGridView1.RowCount
            DataGridView1.Rows(xRowCount).Cells(2).Style.Format = Format("dd-MMM-yy")
            DataGridView1.Rows(xRowCount).Cells(1).Style.Format = Format("dd-MMM-yy")
            xRowCount = xRowCount + 1
        Loop
        conn.Dispose()
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim StrExport As String = ""

        For Each C As DataGridViewColumn In DataGridView1.Columns
            StrExport &= """" & C.HeaderText & ""","
        Next
        StrExport = StrExport.Substring(0, StrExport.Length - 1)
        StrExport &= Environment.NewLine

        For Each R As DataGridViewRow In DataGridView1.Rows
            For Each C As DataGridViewCell In R.Cells
                If Not C.Value Is Nothing Then
                    StrExport &= """" & C.Value.ToString & ""","
                Else
                    StrExport &= """" & "" & ""","
                End If
            Next
            StrExport = StrExport.Substring(0, StrExport.Length - 1)
            StrExport &= Environment.NewLine
        Next

        Dim tw As IO.TextWriter = New IO.StreamWriter("C:\Users\rg\teszt.csv")
        tw.Write(StrExport)
        tw.Close()
    End Sub
End Class

我正在使用Oracle SQL数据库

我尝试过:

 Dim StrExport As String = ""
     For Each C As DataGridViewColumn In DataGridView1.Columns
        StrExport &= """" & C.HeaderText & ""","
    Next
    StrExport = StrExport.Substring(0, StrExport.Length - 1)
    StrExport &= Environment.NewLine
    For Each R As DataGridViewRow In DataGridView1.Rows
        For Each C As DataGridViewCell In R.Cells
            If Not C.Value Is Nothing Then
                StrExport &= """" & C.Value.ToString & ""","
            Else
                StrExport &= """" & "" & ""","
            End If
        Next
        StrExport = StrExport.Substring(0, StrExport.Length - 1)
        StrExport &= Environment.NewLine
    Next
    Dim tw As IO.TextWriter = New IO.StreamWriter("C:\Users\rg\teszt.csv")
    tw.Write(StrExport)
    tw.Close()

当前看起来像这样,这不好:

“ 264117”,“ 2019.01.14。0:00:00”,“ 2019.06.01。0:00:00”,“ sikereseredmény”,“továbbrajogosult” “ 264547”,“ 2019.01.15。0:00:00”,“ 2019.06.02。0:00:00”,“ sikereseredmény”,“továbbranem jogosult”

我希望它在csv文件中看起来像这样:

“ 264117”,“-14年1月19日”,“-6月19日-01”,“ sikereseredmény”,“továbbrajogosult”
“ 264547”,“-15年1月19日”,“-02年6月19日”,“ sikereseredmény”,“továbbranem jogosult”

2 个答案:

答案 0 :(得分:0)

对于每个作为日期的C.ValueType,都应使用tostring(“ yy-MMM.-dd”)。

答案 1 :(得分:0)

https://github.com/plataformatec/devise类用于读取结构化文本文件。
它允许指定字段分隔符和记录格式的其他变体。例如,我们可以使用TextFieldParser属性指定字段值是否用引号引起来。

这只是一个解析器,我们不能使用它将其写入文件,而只能从其中读取。
但是,当然,我们可以在需要时使用它来验证CSV格式的文件。

这是一种通用方法,可将DataGridView内容的结构和值写入文件。
然后,使用 import React, { useState, useEffect } from "react"; const Menu = props => <div onClick={props.click}>Toggle Foo</div>; const Test = props => { useEffect(() => { console.log("mounted"); return () => console.log("unmounted"); }, []); return null; }; const App = props => { const [foo, setFoo] = useState(false); // this is the root of the problem // move this line outside of the function body // and it mounts/unmounts correctly const AppCore = props => <Test />; return ( <> <Menu click={() => setFoo(!foo)} /> <AppCore /> </> ); }; export default App; 类来验证此方法生成的输出。

您可以将一些参数传递给 TextFieldParser 方法:

  • 将在其中存储数据的文件的路径。如果文件不存在,将创建它。 TextFieldParser.HasFieldsEnclosedInQuotes用于将数据写入文件。请注意,即使它是默认设置,我也已将Encoding设置为 CSVSaveDGVData :只是提醒您,如果需要,可以指定其他Encoding。
  • 作为数据源的DataGridView。
  • 当单元格类型为UTF8DateTime)时要使用的特定格式。
  • 特定的 Date ,如果十进制值需要使用特定的区域性格式进行格式化。如果未指定,则默认为 CultureInfo

关于InvariantCulture / null处理的重要说明:当前的 DBNull 转换将Cell.Value / null值处理为空字符串:字段的空格式实际上取决于什么是读回这些值的。如果需要其他功能,则需要对其进行调整。

通话示例:

DBNull

Dim culture = CultureInfo.CreateSpecificCulture("hu-HU")
If CSVSaveDGVData("test.csv", DataGridView1, "dd-MMM.-yy", culture) Then
    'All good
End If