如何将 SQL 语句结果导出到 Excel 文件

Posted

技术标签:

【中文标题】如何将 SQL 语句结果导出到 Excel 文件【英文标题】:How to export SQL statement results to an Excel File 【发布时间】:2017-04-05 18:59:39 【问题描述】:

我在 Excel VBA 中有一个 Access 数据库和一个表单。我输入DB的所有数据都是通过VBA表单输入的。

此数据库包含我们今年在公司收到的所有福利卡。但是同一个员工可以两次或多次索取卡,所以我们在数据库中为他提供了不止一条记录。

我需要的是当记录数大于1时,SQL语句结果应该出现在Excel报告中。

我使用SELECT (*) COUNT 语句来了解何时有多个记录与搜索条件兼容。但我不能让结果出现在 Excel 文件中。

这是我的代码:

Public Function Relatorio()
    Dim sql As String
    Dim cn  As ADODB.Connection
    Dim rs  As ADODB.Recordset
    Dim rel As String

    Set cn = New ADODB.Connection
    cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & enderecoDB & ";Jet OLEDB:Database"
    cn.Open
    Set rs = New ADODB.Recordset
    sql = "INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=" & enderecoDB & ";', 'SELECT * FROM [Planilha1$]') SELECT * FROM controle WHERE BP = " & controlectform.nmbpbox.Value & ";"
    rs.Open sql, cn
End Function

当我运行此代码时,它会给我一条消息,内容如下:

找不到 OPENROWSET 表出口

我无法安装新程序,因此我只需要使用 Excel VBA 和 Access DB 来安装。

我怎样才能做到这一点?

【问题讨论】:

尝试将此查询作为视图放入访问中,而不是从 vba 查询新视图 我使用表单中的一个字段来进行“选择”。即使我将查询放入访问权限,我是否可以继续使用表单字段进行“选择”? 【参考方案1】:

我不相信 Access 支持您正在使用的 OPENROWSET 动态表。我有很多旧项目都这样做,所以这是我的方法

Public Function Relatorio()

    Dim sql As String
    Dim cn  As ADODB.Connection
    Dim rs  As ADODB.Recordset
    Dim rel As String


    Set cn = New ADODB.Connection

    cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & enderecoDB & ";Jet OLEDB:Database"

    cn.Open

    Set rs = New ADODB.Recordset

    dim path_To_XLSX
    dim name_of_sheet
    path_To_XLSX = "c:\temp\output.xlsx"
    name_of_sheet = "Planilha1"
    sql = sql = "SELECT * INTO [Excel 12.0;Database=" & path_To_XLSX & "]." & name_of_sheet & " FROM controle WHERE BP = '" & controlectform.nmbpbox.Value & "';" 

    rs.Open sql, cn

    'If this application is in an unsecure environment, use the following code instead!  This is to prevent a SQL injection, security concern here.
    'As it is an Access Database, this is likely overkill for this project
    'Create Command Object.
    Set Cmd1 = New ADODB.Command
    Cmd1.ActiveConnection = cn
    cmd1.CommandText = "SELECT * FROM controle INTO [Excel 12.0;Database=" & path_To_XLSX & "]." & name_of_sheet & " WHERE BP = ?"
    ' Create Parameter Object.
    Set Param1 = Cmd1.CreateParameter(, adInteger, adParamInput, 5) 'use adVarchar for strings(versus adInteger), https://www.w3schools.com/asp/met_comm_createparameter.asp
    Param1.Value = controlectform.nmbpbox.Value
    Cmd1.Parameters.Append Param1
    Set Param1 = Nothing
    Set Rs = Cmd1.Execute()

End Function

【讨论】:

您的回答对我帮助很大。 Excel 不能接受 sql 语句。在 FROM 子句上给我一个错误。我在网上搜索,发现它是另一个适用于代码的 sql 语句。 sql = "SELECT * INTO [Excel 12.0;Database=" & path_To_XLSX & "]。" & name_of_sheet & " FROM controle WHERE BP = '" & controlectform.nmbpbox.Value & "';"非常感谢。 我有两次INTO。将使用您的修复程序编辑我的答案。很高兴这有帮助!【参考方案2】:

很多年前我就遇到过这个挑战,以至于我不记得了,但是这个链接敲响了警钟。检查它是否有帮助。

https://***.com/a/28889774/382588

尝试 connw.Open(); OleDbCommand 命令; command = new OleDbCommand("Update Deliveries" + "SET Deliveries.EmployeeID = ?, Deliveries.FIN = ?, Deliveries.TodaysOrders = ?, connw); command.Parameters.Add(new OleDbParameter("@EMPID", Convert.ToDecimal (empsplitIt[1]))); command.Parameters.Add(new OleDbParameter("@FIN", truckSplit[1].ToString())); command.Parameters.Add(new OleDbParameter("@TodaysOrder", "R ")); catchReturnedRows = command.ExecuteNonQuery();//提交 connw.Close(); catch (OleDbException 异常) MessageBox.Show(exception.Message, "OleDb Exception");

【讨论】:

这绝对是在 C# 中进行参数化查询的好方法,但在这种情况下,他在使用 VBA(VB6 时代,而不是 VB.NET)的 Access 中工作。实际上,我正要为 VB.NET 应用程序编写其中一个查询(当然要减去花括号,哈哈) 我相信命令字符串是棘手的部分......如果我是对的(不确定)......采用 c# oledb-with 命令函数并嵌入这个查询可能会......这个是我想尝试的【参考方案3】:

您可以使用它来打印实际的 SQL。

Private Sub Command2_Click()

Dim db As Database
Dim qr As QueryDef

Set db = CurrentDb

For Each qr In db.QueryDefs
  TextOut (qr.Name)
  TextOut (qr.SQL)
  TextOut (String(100, "-"))
Next

End Sub

Public Sub TextOut(OutputString As String)

    Dim fh As Long

    fh = FreeFile
    Open "C:\Users\rs17746\Desktop\Text_Files\sample.txt" For Append As fh
    Print #fh, OutputString
    Close fh

End Sub

这里还有一个版本供您使用。这会将每个查询的结果导出到一个单独的文本文件中。

Private Sub Command0_Click()


Dim qdf As QueryDef
Dim strFileName As String
For Each qdf In CurrentDb.QueryDefs
If Left(qdf.Name, 1) <> "~" Then

'you need to figure out TransferText command. Maybe
'you won't be lazy and expect people to read it to
'you and tutor you on how it works.
strFileName = qdf.Name

'Docmd.TransferText ....
DoCmd.TransferText transferType:=acExportDelim, TableName:=strFileName, FileName:="C:\test\" & strFileName & ".txt", hasfieldnames:=True

End If
Next qdf
MsgBox "Done"


End Sub

【讨论】:

以上是关于如何将 SQL 语句结果导出到 Excel 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SQL 结果生成到 Excel 工作表 (Oracle)

在SQL中如何将查询结果直接导出为EXCEL表格

将SQL查询分析器查询的结果用SQL语句导出到Excel表格的语句怎么写?

怎样将SQL数据导出到EXCEL中

sqlserver将数据库的数据导成excel文档方法

怎样将SQL数据导出到EXCEL中