Get data via DDE in Python by bypassing Excel

uday picture uday · Mar 8, 2015 · Viewed 8.3k times · Source

I have a data provider who provides a DDE link (that I can use in Excel) and an exe file that runs in the background which serves as a Data Manager (not sure if this is what called as a DDE Server) and the DDE link connects to that exe file.

I want to bypass Excel and work directly in Python. I saw some examples about DDE but they were all in Python 2 and I am using Python 3.

I saw examples on the net that do something like:

import win32ui
import dde
...
...
server = dde.CreateServer()
server.Create("SomeName")
...

But these examples show how to create a DDE server. In my case, there is an existing exe that is the data manager (DDE server may be?) and within Excel there is a menu via which I can get data such as

' = DataProviderFunc1(Param1, Param2)'
' = DataProviderFunc2(Param1, Param2)'

I want to write a code in Python that directly gets output of ' = DataProviderFunc1(Param1, Param2)' etc., instead of having an Excel sheet open and then letting Python read the output from the Excel sheet.

Is this possible?

I am using Python 3.4. Thanks

There seems to be very little document on the DDE module, e.g. http://docs.activestate.com/activepython/2.4/pywin32/dde.html

Answer

user1816847 picture user1816847 · Aug 2, 2017

The closest things to documentation that I've found are here: client example, server example

The examples aren't even commented so let me share what I've figured out with a commented example:

import win32ui
import dde

#apparently "servers" talk to "servers"
server = dde.CreateServer()
#servers get names but I'm not sure what use this name
#has if you're acting like a client
server.Create("TestClient")  
#use our server to start a conversation
conversation = dde.CreateConversation(server)

# RunAny is the server name, and RunAnyCommand is the topic
conversation.ConnectTo("RunAny", "RunAnyCommand")
# DoSomething is the command to execute
conversation.Exec("DoSomething")
# For my case I also needed the request function
# request somedata and save the response in requested_data.
requested_data = conversation.Request("somedata")

Key functions seem to be Exec and Request. Both take strings so in your particular case you'll have to find out what your server wants.