Quiero conectar a una base de datos mongodb utilizando las macros de excel, ¿alguien sabe cómo efectuar esta tarea?

8 Comentarios

  1. 7

    El Shell Enfoque

    Casi cualquier cosa que se interconecta con la Línea de Comandos se puede acceder con Shell.

    Aquí un escueto ejemplo que se conecta a una marcha instancia de MongoDB y se imprime una consulta a la Ventana Inmediato. Usted tendrá que agregar una referencia a la Windows Script Host Object Model.

    Private Sub Test()
    
        Dim wsh As New WshShell
        Dim proc As WshExec
        Dim line As String
    
        Set proc = wsh.Exec("mongo")
    
        With proc
            .StdIn.WriteLine "use test"
            .StdIn.WriteLine "db.restaurants.find({""address.zipcode"":""10075""})"
            .StdIn.WriteLine "quit()"
    
            Do While .Status = WshRunning
                line = .StdOut.ReadLine
                If line = "Type ""it"" for more" Then
                    .StdIn.WriteLine "it"
                ElseIf line Like "{*" Then
                    Debug.Print line
                End If
                DoEvents
            Loop
        End With
    End Sub

    De impresión sólo la cruda cadenas JSON no es muy interesante o útil, sin embargo. Podría escribir su propio JSON parser pero, para este ejemplo, vamos a utilizar VBA-JSON por Tim Hall (puede encontrar en GitHub).

    En el momento de la escritura, hay un problema con VBA-JSON que tiene que ser abordado cuando se utiliza para analizar cadenas regresó de MongoDB. Los valores que contienen paréntesis, por ejemplo,"_id": ObjectId("..."), se producirá un error. Rápido y sucio solución para esto es usar RegEx para limpiar la cadena para el analizador. Usted tendrá que hacer referencia a la Microsoft VBScript Regular Expressions 5.5 biblioteca para la siguiente función.

    Private Function CleanString(str As String) As String
    
        Dim temp As String
        Dim rx As New RegExp
    
        With rx
            .IgnoreCase = True
            .Global = True
    
            .Pattern = "[a-z]*\(" ' Left
            temp = .Replace(str, "")
            .Pattern = "\)" ' Right
            temp = .Replace(temp, "")
        End With
    
        CleanString = temp
    End Function

    Podemos, a continuación, analizar el JSON devuelto de MongoDB y agregar cada objeto a un Collection. El acceso a los valores es bastante simple.

    Private Sub Mongo()
    
        Dim wsh As New WshShell
        Dim proc As WshExec
        Dim line As String
        Dim response As New Collection
        Dim json As Object
    
        Set proc = wsh.Exec("mongo")
    
        With proc
            .StdIn.WriteLine "use test"
            .StdIn.WriteLine "db.restaurants.find({""address.zipcode"":""10075""})"
            .StdIn.WriteLine "quit()"
    
            Do While .Status = WshRunning
                line = .StdOut.ReadLine
                If line = "Type ""it"" for more" Then
                    .StdIn.WriteLine "it"
                ElseIf line Like "{*" Then
                    response.Add ParseJson(CleanString(line))
                End If
                DoEvents
            Loop
        End With
    
        For Each json In response
            Debug.Print json("name"), json("address")("street")
        Next
    End Sub

    … Que producirá la siguiente salida de la MongoDB Ejemplo De Conjunto De Datos.

    Nectar Coffee Shop          Madison Avenue
    Viand Cafe                  Madison Avenue
    Don Filippo Restaurant      Lexington Avenue
    Lusardi'S Restaurant        Second Avenue
    Due                         Third Avenue
    Lenox Hill Grill/Pizza      Lexington Avenue
    Quatorze Bistro             East   79 Street
    Luke'S Bar & Grill          Third Avenue
    Starbucks Coffee            Lexington Avenue
    New York Jr. League         East   80 Street
    Doc Watsons                 2 Avenue
    Serafina Fabulous Pizza     Madison Avenue
    Canyon Road Grill           1 Avenue
    Sushi Of Gari East          78 Street

    Trampas

    • ReadLine y WriteLine son el bloqueo de las funciones de.
    • La ventana abierta por Exec no puede ser escondida.

    Una solución para ambas sería el uso de una capa doble de enfoque, donde VBA llamadas de un guión oculto utilizando wsh.Run, que a continuación, ejecuta el Exec (así como cualquier otro código que interactúa con el proc). La desventaja de este enfoque es que la Entrada estándar (y hasta cierto punto, StdOut) tiene que ser escrito a un archivo.

    • Esta es la mejor solución. No requiere de licencias, ninguna capa adicional (python/c#), no hay ningún archivo de gestión, y es realmente muy elegante. Hay un par de extraños métodos para ocultar el exec de la ventana, mencionadas aquí – stackoverflow.com/questions/32297699/…, pero no he attmepted ellos.
  2. 5

    Manera sencilla es

    1. crear un C# dll para interactuar con Mongo db a través de c# controladores.
    2. Hacer Com visible (en Assemblyinfo.cs), construir y registrar
    3. Ir a la macro de excel – > editor de visual basic
    4. Haga clic en herramientas->referencia y seleccione su registrados asamblea
    5. Y utilizar en su VBA, como este.

    .

    Private Sub CallMongo()
        Dim mongoObj As New MyMongoAssembly
        mongoObj.AddItem("adas");
    End Sub

    eso es todo..

    • está usted bromeando?
    • hay algo gracioso?
    • Debería considerar seriamente la eliminación de la palabra «simple» de la primera frase de su respuesta. Esta es sin duda una solución viable para alguien con todas las habilidades necesarias, y el tiempo, pero ciertamente no es una simple.
    • Para el promedio de Excel chico, esto no va a ser del todo útil………
  3. 2

    Hay controladores ODBC disponibles de progreso (mencionados abajo), de easysoft y cdata.

    He intentado con el progreso y se hace bien el trabajo.
    Todos estos conductores tienen licencia de software y la versión de prueba está disponible también.

    El más fácil de usar es el cdata Excel Add-In que puede consultar, actualizar
    y también permite el uso de excel basado en la fórmula & VBA. Licenciado demasiado.

    Una forma más en la que se consulta mediante pymongo en python en lugar de mongo cliente,
    la descarga de los resultados a un archivo csv e Importar el csv a través de VBA.
    Consultar mongoDB desde python es bastante fácil.

    Aquí está el ejemplo a la consulta de MongoDB Ejemplo de conjunto de datos.

    El archivo de Python para la consulta, «queryMongoDB.py»

    SERVER = "192.168.43.22" # Replace wit with Server IP or Hostname running mongod
    PORT   = "27017"
    
    def queryMongoDB():
        try:
           from pymongo import MongoClient
           client = MongoClient("mongodb://" + SERVER + ":" + PORT)
           db = client.test
           queryResp = db.restaurants.find({'address.zipcode': "11215", 'cuisine': 'Indian'}, {'name': 1, 'address.building': 1, 'address.street': 1, 'borough': 1, '_id': 0})
    
           if queryResp.count() > 0 :
              for row in queryResp:
                 printStr = ""
                 if 'name' in row:
                    printStr = row['name'] + ","
                 else:
                    printStr = ","
                 if 'building' in str(row):
                    printStr = printStr + row['address']['building'] + ","
                 else:
                    printStr = printStr + ","
                 if 'street' in str(row):
                    printStr = printStr + row['address']['street'] + ","
                 else:
                    printStr = printStr + ","
                 if 'borough' in row:
                    printStr = printStr + row['borough']
                 print(printStr)
           else:
              return -2
           return 0
        except ImportError:
           return -1
    
    queryMongoDB()

    La ejecución de este script va a imprimir en la salida estándar como

    Kinara Indian Restaurant,473,5 Avenue,Brooklyn
    Baluchi'S,310,5 Avenue,Brooklyn
    Kanan Indian Restaurant,452,3Rd Ave,Brooklyn
    New Aarpan,396,5Th Ave,Brooklyn
    Indian Spice,351,7Th Ave,Brooklyn

    La macro VBA de Excel utilizando WshShell, macro_queryMongoDB()

    Sub macro_queryMongoDB()
       Dim pythonExecutable  As String
       Dim pythonQueryScript As String
       pythonExecuatble = "python.exe" ' Path to python interpreter
       pythonQueryScript = "queryMongoDB.py" 'Full path to the above Python script
    
       If Dir(pythonExecuatble) <> "" And Dir(pythonQueryScript) <> "" Then
          Dim objShell         As Object
          Dim objWshScriptExec As Object
          Dim objStdOut        As Object
    
          Set objShell = CreateObject("WScript.Shell")
          Set objWshScriptExec = objShell.Exec(pythonExecuatble & " " & pythonQueryScript) ' Execute the Python script
          Set objStdOut = objWshScriptExec.StdOut
    
          Set mybook = Excel.ActiveWorkbook
          Set mybookSheet = mybook.ActiveSheet
    
          Dim rline            As String
          Dim strline          As String
          Dim lineCount        As Long
    
          ' Parse the results
          lineCount = 1
          While Not objStdOut.AtEndOfStream
             rline = objStdOut.ReadLine
             If rline <> "" Then
                strline = rline & vbCrLf
                mybookSheet.Range(mybookSheet.Cells(lineCount, "A"), mybookSheet.Cells(lineCount, "D")).Value = Split(strline, ",")
                lineCount = lineCount + 1
             End If
          Wend
          MsgBox "Query Successful"
       Else
          MsgBox "Python executable or Python query DB script doesn't exist."
       End If
    End Sub

    De ejecutar esta macro, se completará separados por comas datos en filas como

    Cómo conectar Mongodb desde Excel

  4. 1

    Puedo eco de las otras respuestas que se refieren al uso de un controlador ODBC para conectarse a MongoDB datos en Excel. El problema, claro, es que no hay manera de que el uso de macros.

    Como Irfan menciona el CData Excel Add-In le permitirá hacer justamente eso. (Revelación completa, yo trabajo para CData Software). Usted puede leer acerca de la conexión a MongoDB uso de macros en nuestro Documentación de ayuda, pero he incluido un relevante fragmento de código aquí para demostrar la funcionalidad básica de la lectura de su MongoDB datos en excel:

    Sub DoSelect()
      On Error GoTo Error
      p_id = InputBox("_id:", "Get _id")
      If p_id = False Then
        Exit Sub
      End If
      Dim module As New ExcelComModule
      module.SetProviderName ("MongoDB")
      Cursor = Application.Cursor
      Application.Cursor = xlWait
      Dim nameArray
      nameArray = Array("_idparam")
      Dim valueArray
      valueArray = Array(p_id)
      Query = "SELECT City, CompanyName FROM Customers WHERE _id = @_idparam"
      module.SetConnectionString ("Server=127.0.0.1;Port=27017;Database=test;User=test;Password=test;")
      If module.Select(Query, nameArray, valueArray) Then
        Dim ColumnCount As Integer
        ColumnCount = module.GetColumnCount
        For Count = 0 To ColumnCount - 1
          Application.ActiveSheet.Cells(1, Count + 1).Value = module.GetColumnName(Count)
        Next
        Dim RowIndex As Integer
        RowIndex = 2
        While (Not module.EOF)
          For columnIndex = 0 To ColumnCount - 1
            If Conversion.CInt(module.GetColumnType(columnIndex)) = Conversion.CInt(vbDate) And Not IsNull(module.GetValue(columnIndex)) Then
              Application.ActiveSheet.Cells(RowIndex, columnIndex + 1).Value = Conversion.CDate(module.GetValue(columnIndex))
            Else
              Application.ActiveSheet.Cells(RowIndex, columnIndex + 1).Value = module.GetValue(columnIndex)
            End If
          Next
          module.MoveNext
          RowIndex = RowIndex + 1
        Wend
        MsgBox "The SELECT query successful."
      Else
        MsgBox "The SELECT query failed."
      End If
      Application.Cursor = Cursor
      Exit Sub
    Error:
      MsgBox "ERROR: " & Err.Description
      Application.Cursor = Cursor
    End Sub

    Nuestro 2016 Versión está actualmente en Beta, así que usted puede empezar a trabajar con su MongoDB datos en Excel de forma gratuita hoy.

  5. 0

    Creo que la mejor respuesta sería escribir o encontrar un controlador ODBC para MongoDB. Déjeme saber si usted encuentra uno.

    Aparte de eso, usted podría escribir una interfaz web de mongodb que hace la correspondiente consulta a una tabla de HTML, y el uso de Excel con la función de analizar las tablas en HTML de las páginas web. No es tan limpio como ODBC, pero mejor que la exportación de los CSVs una y otra vez.

  6. 0

    siempre puedes mirar en esta solución, no lo he probado yo y no requiere de un par de saltos:
    http://sqlmag.com/blog/integrating-mongodb-and-open-source-data-stores-power-pivot

    • Tenga en cuenta que link-sólo respuestas se desanime, de MODO que las respuestas deben ser el punto final de una búsqueda de una solución (frente a otra escala de referencias, que tienden a obtener obsoletos con el tiempo). Por favor, considere la adición de un stand-alone sinopsis aquí, manteniendo el vínculo como una referencia.
  7. 0

    Dicen que hay una 3ª parte de Mongodb COM conductor alrededor:
    http://na-s.jp/MongoCOM/index.en.html
    Después de instalar y hacer referencia a él, usted puede ejecutar consultas como

        Dim oConn
        Dim oCursor,o
    
        Set oConn = oMng.NewScopedDBConnection( cHostAndPort )                  
        Set oCursor = oConn.Query( "ec.member", oMng.FJ("{ ""age"": 37 }")
        Do While oCursor.More
            Set o = oCursor.Next
            MsgBox "mname: " & o("mname")
            MsgBox "dept: "  & o("dept")
            MsgBox "age: "   & o("age")     
        Loop

    Esto es para aquellos que piensa que de-normalización de MongoDb estructuras y transformarlas en SQL-que se puede consultar de forma sobre la marcha, cada vez que necesite algún fragmento de datos es una exageración 😉

Dejar respuesta

Please enter your comment!
Please enter your name here