【问题标题】:Getting F1 on Datagridview header when Importing from Excel (VB.Net)从 Excel (VB.Net) 导入时在 Datagridview 标题上获取 F1
【发布时间】:2016-01-19 20:11:42
【问题描述】:

我的项目中有 2 个按钮可以从 Excel 导入并导出到 Excel 和一个 datagridview。我可以毫无问题地导入 Excel 文件,但是当我从 datagridview 导出到 Excel 并尝试重新导入该文件时,我只得到一个带有“F1”的列标题:

这是导出按钮的代码:

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    'Creamos las variables
    Dim exApp As New Excel.Application
    Dim exLibro As Excel.Workbook
    Dim exHoja As Excel.Worksheet

    Try
        'Añadimos el Libro al programa, y la hoja al libro
        exLibro = exApp.Workbooks.Add
        exHoja = exLibro.Worksheets.Add()
        ' ¿Cuantas columnas y cuantas filas?
        Dim NCol As Integer = DataGridView1.ColumnCount
        Dim NRow As Integer = DataGridView1.RowCount
        'Aqui recorremos todas las filas, y por cada fila todas las columnas

        'y vamos escribiendo.
        For i As Integer = 1 To NCol
            exHoja.Cells.Item(1, i) = DataGridView1.Columns(i - 1).Name.ToString
        Next
        For Fila As Integer = 0 To NRow - 1
            For Col As Integer = 0 To NCol - 1
                exHoja.Cells.Item(Fila + 2, Col + 1) = DataGridView1.Item(Col, Fila).Value
            Next
        Next
        'Titulo en negrita, Alineado al centro y que el tamaño de la columna
        'se ajuste al texto
        exHoja.Rows.Item(1).Font.Bold = 1
        exHoja.Rows.Item(1).HorizontalAlignment = 3
        exHoja.Columns.AutoFit()

        'Aplicación visible
        exApp.Application.Visible = True
        exHoja = Nothing
        exLibro = Nothing
        exApp = Nothing
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

我能做些什么来解决它??

谢谢。

【问题讨论】:

  • 最好的猜测是您将需要在 Excel 的第一行列名。例如,如果您要使用 OleDb 导入并且第一行中没有列名,并且在连接的扩展属性下设置 HDR=“是”,如果 HDR=“没有列标题,则第一行将被视为数据不”反之。除了 OleDb 之外,我还没有看到 F1 问题,建议如此处所示 SELECT F1 As FirstName 而不是说 SELECT * 这会导致 Fn 其中 n 为工作表中的每一列递增
  • 能否也显示另一个按钮的代码?

标签: vb.net excel datagridview


【解决方案1】:

对于从 Excel 导入,顶部图像描述了使用 SELECT * 发生的情况

下图显示使用字段别名,如下面的代码所示

使用别名读取工作表数据的代码

Dim dt As New DataTable
Dim FileName As String = IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SampleData.xlsx")

Using cn As New OleDb.OleDbConnection With
    {
        .ConnectionString = ConnectionHelper.ConnectionString(FileName, "No")
    }
    Console.WriteLine(cn.ConnectionString)
    ' .CommandText = "SELECT F1 As FirstName, F2 As MiddleName, F3 As LastName FROM [PeopleData$] ORDER BY F3",

    Using cmd As New OleDb.OleDbCommand With
        {
            .CommandText = "SELECT F1 As FirstName, F2 As MiddleName, F3 As LastName FROM [Sheet1$] ORDER BY F3",
            .Connection = cn
        }
        cn.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
End Using
DataGridView1.DataSource = dt

上面设置连接的代码

Public Module ConnectionHelper
    Public Function ConnectionString(ByVal FileName As String) As String
        Dim Builder As New OleDb.OleDbConnectionStringBuilder
        If IO.Path.GetExtension(FileName).ToUpper = ".XLS" Then
            Builder.Provider = "Microsoft.Jet.OLEDB.4.0"
            Builder.Add("Extended Properties", "Excel 8.0;IMEX=2;HDR=No;")
        Else
            Builder.Provider = "Microsoft.ACE.OLEDB.12.0"
            Builder.Add("Extended Properties", "Excel 12.0;IMEX=2;HDR=No;")
        End If

        Builder.DataSource = FileName

        Return Builder.ConnectionString
    End Function
    Public Function ConnectionString(ByVal FileName As String, ByVal Header As String) As String
        Dim Builder As New OleDb.OleDbConnectionStringBuilder
        If IO.Path.GetExtension(FileName).ToUpper = ".XLS" Then
            Builder.Provider = "Microsoft.Jet.OLEDB.4.0"
            Builder.Add("Extended Properties", String.Format("Excel 8.0;IMEX=1;HDR={0};", Header))
        Else
            Builder.Provider = "Microsoft.ACE.OLEDB.12.0"
            Builder.Add("Extended Properties", String.Format("Excel 12.0;IMEX=1;HDR={0};", Header))
        End If

        Builder.DataSource = FileName

        Return Builder.ConnectionString
    End Function
End Module

注意工作表没有列名,只有数据。如果第一行有列名,则连接将 Yes 作为参数 2 而不是上面的 No .ConnectionString = ConnectionHelper.ConnectionString(FileName, "Yes")

【讨论】:

  • 谢谢凯伦,但我仍然有问题。
【解决方案2】:

我找到了解决方案,问题不是“导入”按钮,而是“导出”按钮,因为它导出的文件有某种损坏。我尝试使用我找到(导出)并工作的其他代码,这是工作代码:

 Dim stRuta As String = ""
    Dim openFD As New OpenFileDialog()
    With openFD
        .Title = "Seleccionar archivos"
        .Filter = "Archivos Excel(*.xls;*.xlsx)|*.xls;*xlsx|Todos los archivos(*.*)|*.*"
        .Multiselect = False
        .InitialDirectory = My.Computer.FileSystem.SpecialDirectories.Desktop
        If .ShowDialog = Windows.Forms.DialogResult.OK Then
            stRuta = .FileName
        End If
    End With
    Try
        'Dim stConexion As String = ("Provider=Microsoft.ACE.OLEDB.12.0­;" & ("Data Source=" & (stRuta & ";Extended Properties=""Excel 12.0;Xml;HDR=YES;IMEX=2"";")))
        Dim stConexion As String = ("Provider=Microsoft.ACE.OLEDB.12.0;" & ("Data Source=" & (stRuta & ";Extended Properties=""Excel 12.0;Xml;HDR=YES;IMEX=2"";")))
        Dim cnConex As New OleDbConnection(stConexion)
        Dim Cmd As New OleDbCommand("Select * From [Hoja1$]")
        Dim Ds As New DataSet
        Dim Da As New OleDbDataAdapter
        Dim Dt As New DataTable
        cnConex.Open()
        Cmd.Connection = cnConex
        Da.SelectCommand = Cmd
        Da.Fill(Ds)
        Dt = Ds.Tables(0)
        Me.DataGridView1.Columns.Clear()
        Me.DataGridView1.DataSource = Dt
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")
    End Try

谢谢大家:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 2014-02-18
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    相关资源
    最近更新 更多