Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何在VB.Net中使用数据库查询创建Excel文件?_Database_Vb.net_Excel_Sql Server 2008 - Fatal编程技术网

Database 如何在VB.Net中使用数据库查询创建Excel文件?

Database 如何在VB.Net中使用数据库查询创建Excel文件?,database,vb.net,excel,sql-server-2008,Database,Vb.net,Excel,Sql Server 2008,我想在VB.Net中使用数据库查询生成Excel文件。我怎么做 更准确地说:我想将查询(很像将查询绑定到GridView)绑定到Excel文件,以便表中的行占据新Excel文件中相应的单元格,并将该文件保存到我的计算机。然后,将该文件邮寄给某人 虽然我可以处理邮件部分,但我需要帮助创建这样一个文件。有人知道如何实现我想实现的目标吗 PS:我需要在VB.Net中执行此操作,并且我正在使用SQL Server 2008。好的,这并不完美,但应该可以让您开始。首先,您需要添加对正在使用的Excel版本

我想在VB.Net中使用数据库查询生成Excel文件。我怎么做

更准确地说:我想将查询(很像将查询绑定到GridView)绑定到Excel文件,以便表中的行占据新Excel文件中相应的单元格,并将该文件保存到我的计算机。然后,将该文件邮寄给某人

虽然我可以处理邮件部分,但我需要帮助创建这样一个文件。有人知道如何实现我想实现的目标吗


PS:我需要在VB.Net中执行此操作,并且我正在使用SQL Server 2008。

好的,这并不完美,但应该可以让您开始。首先,您需要添加对正在使用的Excel版本的引用。在我的例子中,它是12.0(2007),但是这段代码应该可以与最后的两个或三个版本一起使用,只需做一两个小改动。在页面顶部添加以下内容

导入Microsoft.Office.Interop

接下来添加一个函数来创建datatable

Public Function CreateTable() As DataTable
    Dim cn As New SqlConnection(My.Settings.con)
    Dim cmd As New SqlCommand
    Using da As New SqlDataAdapter()
        Dim dt As New DataTable()
        cmd.CommandType = CommandType.StoredProcedure
        cmd.CommandText = "[dbo].[MyStoredProcedure]"
        cmd.CommandTimeout = 0
        cn.Open()
        cmd.Connection = cn
        da.SelectCommand = cmd
        da.Fill(dt)
        cn.Close()
        Return dt
    End Using
End Function
接下来是获取该数据表并将其转储到Excel中的代码

Public Shared Sub PopulateSheet(ByVal dt As DataTable, ByVal File As String)
            Dim oXL As Excel.Application = CType(CreateObject("Excel.Application"), Excel.Application)
        Dim oWB As Excel.Workbook
        Dim oSheet As Excel.Worksheet
        Dim oRng As Excel.Range
        oXL.Visible = True

        oWB = oXL.Workbooks.Add
        oSheet = CType(oWB.ActiveSheet, Excel.Worksheet)

        Dim dc As DataColumn
        Dim dr As DataRow
        Dim colIndex As Integer = 0
        Dim rowIndex As Integer = 0
        For Each dc In dt.Columns
            colIndex = colIndex + 1
            oXL.Cells(1, colIndex) = dc.ColumnName
        Next
        For Each dr In dt.Rows
            rowIndex = rowIndex + 1
            colIndex = 0
            For Each dc In dt.Columns
                colIndex = colIndex + 1
                oXL.Cells(rowIndex + 1, colIndex) = dr(dc.ColumnName)
            Next
        Next

        oSheet.Cells.Select()
        oSheet.Columns.AutoFit()
        oSheet.Rows.AutoFit()

        oXL.Visible = True
        oXL.UserControl = True

        oWB.SaveAs(File)
        oRng = Nothing
        oXL.Quit()

        ExcelCleanUp(oXL, oWB, oSheet)
    End Sub
现在你可以通过按钮或任何你选择的事件来调用它

    Dim dt As New DataTable
    Try
        dt = CreateTable()
        PopulateSheet(dt, "c:\test\ExcelFile.xlsx")
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    Finally
        dt.Dispose()
    End Try
现在,这是非常基本的,但只需做一点工作,您就可以完成单元格格式设置、页面设置以及在Excel中使用菜单/选项可以完成的任何操作

我们还应该通过添加代码来完成这项工作

Private Shared Sub ExcelCleanUp( _
    ByVal oXL As Excel.Application, _
    ByVal oWB As Excel.Workbook, _
    ByVal oSheet As Excel.Worksheet)

    GC.Collect()
    GC.WaitForPendingFinalizers()

    Marshal.FinalReleaseComObject(oXL)
    Marshal.FinalReleaseComObject(oSheet)
    Marshal.FinalReleaseComObject(oWB)

    oSheet = Nothing
    oWB = Nothing
    oXL = Nothing

End Sub

您可以通过代码将这些值输入电子表格:

您可以在CodeProject上找到一些关于此的优秀文章:

:在本文中,您可以找到一个不使用任何office组件将数据导出到Excel的组件


:在本例中,作者使用Excel automation来完成此项工作。

Excel Cleanup应确保Excel关闭后,Excel进程不会在进程列表中继续运行,但按书面说明,它不会这样做。代码本身可以工作,但进程仍在运行。今天晚些时候,当我有更多的时间研究它时,我将尝试纠正这个问题。无论如何,这应该让你开始。我可以用列表来代替吗?而不是数据集?有直截了当的方法吗?谢谢谢谢大家!:)但我在发布问题后不久发现,我现在不需要这样做。但是,非常感谢,我相信总有一天它会派上用场的!:)