2010-10-24 180 views
17

我想用excel宏连接到mongodb数据库,有人知道如何完成这个任务吗?如何从Excel连接Mongodb

+2

由于几乎早在这个问题有人问,一票在跟踪器已经存在了MongoDB的请求同样的事情:https://jira.mongodb.org/browse/SERVER-2 063 – 2012-05-30 18:56:54

回答

3

简单的方法是

  1. 创建一个C#DLL通过可用的C#与司机蒙戈DB进行交互。
  2. 让它的COM可见(在AssemblyInfo.cs中),它建立并注册
  3. 转到Excel宏 - > Visual Basic编辑器
  4. 点击工具 - >参考,并选择您所注册的组件
  5. 并在你的VBA中使用它,像这样。

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

多数民众赞成..

+2

你在开玩笑吗? – 2013-05-08 05:29:51

+0

有什么好笑的? – RameshVel 2013-05-08 06:02:59

+9

我会认真考虑从您的回复的第一句中删除“简单”一词。对于具备所有必要技能和时间的人来说,这当然是一个可行的解决方案,但这当然不是一个简单的解决方案。 – 2013-05-10 17:56:14

0

我认为最好的答案是写或寻找MongoDB的ODBC驱动程序。让我知道如果你找到一个。除了这个,你可以为mongodb编写一个web前端,将合适的查询呈现到HTML表格中,并使用Excel的功能从网页中解析HTML表格。不像ODBC一样干净,但是要比反复导出CSV更好。

0

你总是可以看看这个解决方案,还没有尝试过自己,这确实需要一对夫妇跳跃: http://sqlmag.com/blog/integrating-mongodb-and-open-source-data-stores-power-pivot

+0

请注意,[仅限链接](http://meta.stackoverflow.com/tags/link-only -answers/info),所以SO答案应该是搜索解决方案的终点(而另一个引用的中途停留时间往往会随着时间的推移而变得过时)。请考虑在此添加独立的摘要,并将链接保留为参考。 – kleopatra 2013-09-26 09:30:31

3

自己的解决方案是让Python的胶水他们在一起使用pymongo和win32com。无论你想要什么,它都是非常简单的。在我的例子中,我使用Python循环连续地“听”某些Excel单元格,从Mongo调用它所需要的,然后将其放回到Excel中。它很灵活,许多事情都可以通过这种方式完成。以下是完整的代码库,但您必须更改对Mongodb的调用以匹配您自己的数据库。在这里,您还将看到某些方法可以在Python中更改Excel单元格的颜色和东西。噢,我应该提到它充满了ansi转义序列,因此您可能想从ansiconConEmu运行Python。

import win32com.client as win32 
import time # will need this for time parsing 
from optparse import OptionParser 
import pdb  # debugger, when necessary 
import string # for string parsing and the alphabet 
from pymongo import MongoClient 
import inspect 
from datetime import datetime, timedelta, tzinfo 
from dateutil import tz 
from bson.son import SON 
import msvcrt # for getch 
import os 
import sys # for stdout.write 
from collections import OrderedDict 


def parseCmdLine(): 
    parser = OptionParser(description="Retrieve realtime data.") 
    parser.add_option("--f", 
         dest="file", 
         help="filename", 
         default="bbcapture.xls") 
    parser.add_option("--mongohost", 
         dest="mongohost", 
         default="192.168.1.30") 
    parser.add_option("--mongoport", 
         dest="mongoport", 
         type="int", 
         default=27017) 

    (options, args) = parser.parse_args() 
    return(options) 

options = parseCmdLine() # parse the commandline 
client = MongoClient(options.mongohost, options.mongoport) # link to mongo 
db = client.bb # the database 
bbsecs = db.bbsecs # now all the collections 
bbdaily = db.bbdaily 
bbticks = db.bbticks 
linkstatusperiod = False # for the moving period in the top left excel cell showing we're linked 

def ansi(colour = "white", bright = False, back = "black"): 
# ansi colour sequences 
    brit = {True:  "\033[1m", 
      False:  "\033[0m"} 
    colo = {"black": "\033[30m", 
      "red":  "\033[31m", 
      "green": "\033[32m", 
      "yellow": "\033[33m", 
      "blue":  "\033[34m", 
      "magenta": "\033[35m", 
      "cyan":  "\033[36m", 
      "white": "\033[37m"} 
    bakk = {"black": "\033[40m", 
      "red":  "\033[41m", 
      "green": "\033[42m", 
      "yellow": "\033[43m", 
      "blue":  "\033[44m", 
      "magenta": "\033[45m", 
      "cyan":  "\033[46m", 
      "white": "\033[47m"} 
    sys.stdout.write(brit[bright]) 
    sys.stdout.write(colo[colour]) 
    sys.stdout.write(bakk[back]) 


def mdaily(ticker = "USDEUR Curncy", field = "LAST_PRICE", sortdirection = 1, numget = 1000000): 
    ansi("cyan", False) 
    print "\nGetting", ticker, "field", field, "from Mongo...", 
    lister = OrderedDict() 
    #for post in bbdaily.find({"ticker": ticker, "fieldname": field}).limit(numget).sort("time", sortdirection): 
    for post in bbdaily.find({"$query": {"ticker": ticker, "fieldname": field}, "$orderby": {"time": -1}}).limit(numget): 
     lister[str(post["time"])] = post["fieldvalue"] 
    ansi("cyan", True) 
    print "got", len(lister), "values", 
    ansi() 
    return lister 

def mtick(tickers, sortdirection = 1, numget = 1000000): 
    if len(tickers) == 0: 
     return [] 
    else: 
     ansi("green", False) 
     print "\n Getting minutes for for", tickers, 
     tickerdic = OrderedDict() 
     for eachticker in tickers: 
      eachdic = dict() 
      print numget 
      for post in bbticks.find({"ticker": eachticker}).limit(numget): 
       eachdic[post["time"]] = [post["open"], post["high"], post["low"], post["close"]] 
      ansi("green") 
      tickerdic[eachticker] = eachdic 
      print "got", len(eachdic), "for ticker", eachticker, 
     ansi("green", True) 
     print "got", len(tickerdic), "tickers", 
     dates = [set(tickerdic[x].keys()) for x in tickerdic] # get all the dates 
     dates = set.intersection(*dates) # get the unique ones 
     dates = [x for x in dates] # convert to list 
     if sortdirection == -1: 
      dates = sorted(dates, reverse = True) 
     else: 
      dates = sorted(dates, reverse = False) 
     retlist = [[[x, tickerdic[y][x][0], tickerdic[y][x][1], tickerdic[y][x][2], tickerdic[y][x][3]] for x in dates] for y in tickerdic.keys()] 
     ansi() 
     return retlist 

def getsecs(): 
    seclist = [] 
    for post in bbsecs.find(): 
     seclist.append(post["ticker"]) 
    return(seclist) 




def offsetString(startrow, startcol, endrow, endcol): 
    startrowstr = str(startrow) 
    endrowstr = str(endrow) 
    if(startcol > 26): 
     startcolstr = string.uppercase[startcol/26 - 1] + string.uppercase[startcol % 26 - 1] 
    else: 
     startcolstr = string.uppercase[startcol - 1] 
    if(endcol > 26): 
     endcolstr = string.uppercase[endcol/26 - 1] + string.uppercase[endcol % 26 - 1] 
    else: 
     endcolstr = string.uppercase[endcol - 1] 
    return(startcolstr + startrowstr + ":" + endcolstr + endrowstr) 

def main(): 
    excel = win32.gencache.EnsureDispatch("Excel.Application") 
    excel.Visible = 1 
    try: # try to link to the file 
     ansi("red", False) 
     print "Linking to", options.file 
     wb = excel.Workbooks(options.file) 
     ws = wb.Worksheets("MongoData") 
     ansi() 
    except: # not open then try to load it 
     try: 
      ansi("red", False) 
      print "Not open.... trying to open in current directory", os.getcwd() 
      ansi() 
      wb = excel.Workbooks.Open(os.getcwd() + "\\" + options.file) 
      ws = wb.Worksheets("MongoData") 
      ansi() 
     except: # can't load then ask to create it 
      ansi("red", True) 
      print options.file, "not found here. Create? (y/n) ", 
      ansi("yellow", True) 
      response = msvcrt.getch() 
      print response 
      ansi() 
      if response.upper() == "Y": 
       wb = excel.Workbooks.Add() 
       ws = excel.Worksheets.Add() 
       ws.Name = "MongoData" 
       wb.SaveAs(os.getcwd() + "\\" + options.file) 
      else: # don't wanna create it then exit 
       print "bye." 
       return 
    # see if ticks sheet works otherwise add it 
    try: 
     wst = wb.Worksheets("MongoTicks") 
    except: 
     wst = excel.Worksheets.Add() 
     wst.Name = "MongoTicks" 
     wst.Cells(3, 2).Value = 1 
    # see if securities list sheet works otherwise add it 
    try: 
     wall = wb.Worksheets("AllSecurities") 
     wall.Cells(1, 1).Value = "List of all securities" 
     wall.Range("A1:A1").Interior.ColorIndex = 8 
     wall.Range("A:A").ColumnWidth = 22 
    except: 
     wall = excel.Worksheets.Add() 
     wall.Name = "AllSecurities" 
     wall.Cells(1, 1).Value = "List of all securities" 
     wall.Range("A1:A1").Interior.ColorIndex = 8 
     wall.Range("A:A").ColumnWidth = 22 

    ansi("green", True) 
    print "talking to", options.file, 
    ansi("green", False) 
    print "... press any key when this console has the focus, to end communication" 
    ansi() 
    def linkstatusupdate(): 
     global linkstatusperiod 
     if linkstatusperiod: 
      ws.Cells(1, 1).Value = "Talking to Python|" 
      wst.Cells(1, 1).Value = "Talking to Python!" 
      linkstatusperiod = False 
     else: 
      ws.Cells(1, 1).Value = "Talking to Python|" 
      wst.Cells(1, 1).Value = "Talking to Python!" 
      linkstatusperiod = True 
     ws.Cells(1, 2).Value = datetime.now() 
    # daily worksheet header formatting 
    ws.Cells(1, 1).Value = "Excel linked to Python" 
    ws.Cells(1, 3).Value = "Sort direction:" 
    ws.Cells(1, 4).Value = 1 
    ws.Cells(1, 5).Value = "Fetch max:" 
    ws.Cells(2, 1).Value = "Enter tickers:" 
    ws.Cells(3, 1).Value = "Start data:" 
    ws.Cells(4, 1).Value = "End data:" 
    ws.Range("A:A").ColumnWidth = 22 
    ws.Range("B:B").ColumnWidth = 20 
    ws.Range("A2:GS2").Interior.ColorIndex = 19 # beige 200 columns 
    ws.Range("A3:GS4").Interior.ColorIndex = 15 # grey 
    ws.Range("A2").Interior.ColorIndex = 3 # red 
    ws.Range("A3:A4").Interior.ColorIndex = 16 # dark grey 
    # minute worksheet header formatting 
    wst.Cells(1, 1).Value = "Excel linked to Python" 
    wst.Cells(2, 1).Value = "Enter tickers:" 
    #wst.Cells(3, 1).Value = "Enter periodicity:" 
    wst.Cells(1, 3).Value = "Sort direction:" 
    wst.Cells(1, 4).Value = 1 
    wst.Cells(1, 5).Value = "Fetch max:" 
    wst.Range("A:A").ColumnWidth = 22 
    wst.Range("B:B").ColumnWidth = 20 
    wst.Range("A2:GS3").Interior.ColorIndex = 19 # beige 200 columns 
    wst.Range("A4:GS5").Interior.ColorIndex = 15 # grey 
    wst.Range("A2:A3").Interior.ColorIndex = 4 # red 
    wst.Range("6:100000").Clear() 
    linkstatusperiod = False 
    oldsecd = [] 
    oldseci = [] 
    oldnumget = oldsortdir = toldnumget = toldsortdir = 0 
    while not msvcrt.kbhit(): 
     try: 
      print "...", wb.Name, 
      securities = ws.Range("B2:GS2").Value[0] 
      sortdir = ws.Cells(1, 4).Value 
      if sortdir == None: 
       sortdir = 1 
      sortdir = int(sortdir) 
      numget = ws.Cells(1, 6).Value 
      if numget == None: 
       numget = 1000000 
      numget = int(numget) 
      securities = [x for x in securities if x is not None] 
      if not ((oldsecd == securities) and (oldnumget == numget) and (oldsortdir == sortdir)): # clear content of cells 
       ws.Range("5:1000000").Clear() 
       ws.Range("B3:GS4").Clear() 
       ws.Range("B3:GS4").Interior.ColorIndex = 15 # grey 
       oldsecd = securities 
       oldnumget = numget 
       oldsortdir = sortdir 
      currentcol = 0 
      for sec in securities: 
       linkstatusupdate() 
       secdata = mdaily(sec, "LAST_PRICE", sortdir, numget) 
       currentrow = 0 
       vallist = [] 
       datelist = [] 
       if sortdir == -1: 
        sortedkeys = sorted(secdata, reverse = True) 
       else: 
        sortedkeys = sorted(secdata, reverse = False) 
       for eachkey in sortedkeys: 
        datelist.append(eachkey) 
        vallist.append(secdata[eachkey]) 
       #now stick them in Excel 
       ws.Range(offsetString(5 + currentrow, 2 + currentcol, 5 + currentrow + len(vallist) - 1, 2 + currentcol)).Value = \ 
         tuple([(x,) for x in vallist]) 
       if currentcol == 0: 
        ws.Range(offsetString(5 + currentrow, 1, 5 + currentrow + len(vallist) - 1, 1)).Value = \ 
         tuple([(x,) for x in datelist]) 
       if len(sortedkeys) > 0: 
        ws.Cells(3, 2 + currentcol).Value = sortedkeys[len(sortedkeys) - 1].split()[0] # start data date 
        ws.Cells(4, 2 + currentcol).Value = sortedkeys[0].split()[0] # end data date 
       currentcol += 1 
      # now do the tick data 
      securitiest = wst.Range("B2:GS2").Value[0] 
      securitiest = [x for x in securitiest if x is not None] 
      tsortdir = wst.Cells(1, 4).Value 
      if tsortdir == None: 
       tsortdir = 1 
      tsortdir = int(tsortdir) 
      tnumget = wst.Cells(1, 6).Value 
      if tnumget == None: 
       tnumget = 1000000 
      tnumget = int(tnumget) 
      if not ((oldseci == securitiest) and (toldnumget == tnumget) and (toldsortdir == tsortdir)): # clear the contents of the cells 
       wst.Range("6:1000000").Clear() 
       wst.Range("B4:GS5").Clear() 
       wst.Range("B4:GS5").Interior.ColorIndex = 15 # grey 
       oldseci = securitiest 
       toldnumget = tnumget 
       toldsortdir = tsortdir 
      secdata = mtick(securitiest, tsortdir, tnumget) 
      currentsec = 0 
      for x in secdata: 
       sender = [tuple(y[1:5]) for y in x] 
       wst.Range(offsetString(6, 2 + currentsec * 4, 6 + len(x) - 1, 5 + currentsec * 4)).Value = sender 
       if currentsec == 0: # then put the dates in 
        dates = [tuple([y[0], ]) for y in x] 
        wst.Range(offsetString(6, 1, 6 + len(x) - 1, 1)).Value = dates 
       wst.Range(offsetString(5, 2 + currentsec * 4, 5, 5 + currentsec * 4)).Value = ["open", "high", "low", "close"] 
       currentsec += 1 
      for x in range(0, len(securitiest)): 
       wst.Cells(4, 2 + x * 4).Value = securitiest[x] 
      linkstatusupdate() 
      allsecs = tuple([(yy,) for yy in getsecs()]) 
      wall.Range(offsetString(2, 1, len(allsecs) + 1, 1)).Value = allsecs 

     except: 
      print "\nExcel busy", 
     time.sleep(1) 

    endchar = msvcrt.getch() # capture the last character so it doesn't go to console 
    print "\nbye." 


if __name__ == "__main__": 
    main() 
7

Shell方法

几乎所有与命令行接口的东西都可以通过Shell访问。

下面是一个简单的例子,它连接到正在运行的MongoDB实例并将查询打印到即时窗口。您需要添加对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 

只是打印原始的JSON字符串并不是很令人兴奋或有用,但是。您可以编写自己的JSON解析器,但对于此示例,我们将使用Tim Hall的VBA-JSON(您可以使用find it on GitHub)。

在撰写本文时,VBA-JSON有一个问题,在使用它解析从MongoDB返回的字符串时必须解决。任何包含括号的值,例如"_id": ObjectId("..."),会引发错误。对此的一个快速和肮脏的解决方法是使用RegEx清理解析器的字符串。您需要参考Microsoft VBScript Regular Expressions 5.5库以使以下功能正常工作。

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 

然后我们就可以解析JSON从MongoDB的返回和每个对象添加到Collection。访问这些值变得非常简单。

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 

...这将从MongoDB Example Dataset产生以下输出。

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 

陷阱
  • ReadLineWriteLine阻断功能
  • 打开的窗口Exec不能隐藏

一种用于两者的解决办法以上是使用两层的方法,其中VBA调用使用wsh.Run隐藏脚本,然后运行Exec(以及任何其他代码,与PROC相互作用) 。这种方法的缺点是StdIn(StdOut)必须写入文件。

+0

这是最好的解决方案。不需要许可证,没有额外的图层(python/c#),没有文件管理,而且非常优雅。有一些奇怪的方法来隐藏执行窗口,这里概述 - http://stackoverflow.com/questions/32297699/hide-command-prompt-window-when-using-exec,但我没有想过他们。 – lukehawk 2016-06-03 16:15:34

2

从easysoft和cdata可以获得进展(见下文)的ODBC驱动程序。
我已经尝试了进步,它很好地完成了这项工作。 所有这些驱动程序都是许可软件,也可以使用试用版。

最容易使用的是cdata Excel Add-In,它可以查询,更新 并且还允许使用基于excel的公式& VBA。它也许可。

另一种方法是在python中使用pymongo来代替mongo客户端, 将结果转储到csv文件并通过VBA导入csv。 从python查询mongoDB相当容易。
以下是从MongoDB示例数据集中查询的示例。

查询的Python文件“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() 

执行该脚本将打印到标准输出作为

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 

Excel的VBA宏使用的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 

运行该宏将填充分离的逗号数据到行作为

enter image description here

1

我可以回应其他答案,指的是使用ODBC驱动程序连接到Excel中的MongoDB数据。当然,问题在于你没有办法使用宏。

由于伊尔凡提到CData Excel Add-In可以让你做到这一点。 (完全披露,我为CData Software工作)。你可以阅读有关连接到MongoDB的使用宏在我们Help documentation,但是我在这里包括了相关的代码片段展示的阅读您的MongoDB的数据导入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 

我们的2016版本目前处于Beta版,所以你可以在今天免费开始使用Excel中的MongoDB数据。

0

他们说有一个第三方的MongoDB COM司机围: http://na-s.jp/MongoCOM/index.en.html 安装和引用它之后,你可以运行像

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 

查询,这是为那些谁认为MongoDB的结构,即去正火每一次你需要一些数据块时将它们转换为SQL,可查询表格上的苍蝇矫枉过正;-)