Biblioteca o código de Python para leer el archivo Excel ya abierto

Supongamos que tengo un archivo de Excel 2013 ya abierto (por ejemplo, XYZ.xlsx): este archivo obtiene algunos datos a través de un enlace DDE. Supongamos que quiero leer ciertas celdas (por ejemplo, A1: B3) de una hoja de trabajo (por ejemplo, Hoja1). ¿Cómo puedo hacerlo en Python 3 (estoy usando Python 3.4.2.4 / instalación de Winpython)?

Encontré el paquete openpyxl , pero no pude entender cómo hacerlo leer un libro abierto activo.

No estoy 100% seguro de si esta solución funciona con DDE (¿el archivo se está escribiendo en el disco en algún lugar?)

Recomiendo usar xlrd ( https://github.com/python-excel/xlrd ). Yo personalmente lo instalé vía pip. Luego, para simplemente leer A1: B3, haga lo siguiente (copie los documentos):

 from xlrd import open_workbook wb = open_workbook('spreadsheet.xlsx') for s in wb.sheets(): print('Sheet:',s.name) # you can check for the sheet name here if you want for row in range(2): #the first 2 rows (A and B) (use s.nrows for all) values = [] for col in range(3): #the first 3 columns (use s.ncols for all) values.append(str(s.cell(row,col).value)) print(','.join(values)) 

Necesitaba exactamente la misma solución y esto es lo que hice (ya está funcionando):

  1. Creé un servidor http local y un servidor websocket local en diferentes puertos (8080 y 3000) con Node.js (usando Node Webkit, pero puedes usar Node.js puro).

  2. En el servidor http configuré http: // localhost: 8080 / write / para recibir una solicitud GET con los parámetros que deseaba y para transmitir un mensaje al servidor websocket con esos parámetros.

  3. Escribí un código VBA para enviar datos al servidor http local, usando Worksheet_Calculate sub (es un evento que se activa cada vez que la hoja de trabajo actualiza su contenido).

  4. Finalmente, hice que Python escuchara el servidor websocket (ws: // localhost: 3000 /), esperando la señal del servidor.


Profundizando en los detalles de encoding:

Para crear un servidor local utilicé los módulos Express y ws . El primero en crear el servidor http y el segundo en crear el servidor websocket:

Expresar detalles:

 var express = require('express'); var app = express(); app.get('/', function (req, res) { res.send('Hello World!') }) // to see if server is on // broadcast data on q GET variable: http://localhost:8080/write/?q=32,34,23 app.get('/write/', function (req, res) { wss.broadcast(req.query.q); // this line uses the variable created below res.send(); }); var server = app.listen(8080, function () {}); 

ws detalles:

 var WebSocketServer = require('ws').Server; wss = new WebSocketServer({port: 3000}); wss.on('connection', function(ws) { // you can use this event to perform some action when python get connected ws.send("you're connected"); // use this event if you need websocket to receive message ws.on('message', function(message) { ws.send(message); }); }); wss.broadcast = function broadcast(data) { wss.clients.forEach(function each(client) { client.send(data); }); }; 

Para enviar datos de Excel al servidor http (intenté usar websocket, pero no pude averiguar cómo Excel se conecta a un websocket):

 Function postServer(url, data) Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP") objHTTP.Open "GET", url & data, False ' true para asynchronous calls objHTTP.send '(dados) postServer = 1 'It's a good idea to get the responseHTML from server and verifies if the everything is all right End Function 

Utilice esta función dentro de Worksheet_Calculate () para enviar datos:

 Private Sub Worksheet_Calculate() server = "http://localhost:8080/write/?q=" 'data =  'catch your data with vba code postServer(server,data) End sub 

El detalle del truco aquí es cómo saber cuándo ya se han enviado algunos datos para que pueda evitar enviarlos dos veces o más. Tendrá que crear su método en función de cómo se organizan sus datos en la hoja. Para mí, tengo una columna de número, ordenada y una celda que registra el último número que envié.

¡De acuerdo! Ahora tienes que preparar Python para recibir estos datos:

Descargué el módulo websocket-client 0.25.0. Y aquí está el código de Python para escuchar el servidor websocket:

 import sys import websocket import thread import time wsAddress = "ws://localhost:3000/" def on_message(ws, message): print message # you got it! def on_error(ws, error): print error def on_close(ws): print "### closed ###" def on_open(ws): print "conectado" if __name__ == "__main__": websocket.enableTrace(True) ws = websocket.WebSocketApp(wsAddress, on_message = on_message, on_error = on_error, on_close = on_close) ws.on_open = on_open ws.run_forever() 

Si estás en una red local, puedes usar IP (o nombres de máquinas) para publicar y escuchar el servidor (es increíble). Aquí está el código para descubrir el id con node.js:

 var os = require('os'); var ifaces=os.networkInterfaces(); for (var dev in ifaces) { var alias=0; ifaces[dev].forEach(function(details){ if ((details.family=='IPv4')&&(details.address!="127.0.0.1")&&(details.internal === false)) { console.log(details.address); ++alias; } }); } 

Espero haberte ayudado. Si dejas algunas preguntas, solo házmelo saber.