Update an Excel sheet in real time using Python

前端 未结 4 664
孤街浪徒
孤街浪徒 2021-02-15 08:23

Is there a way to update a spreadsheet in real time while it is open in Excel? I have a workbook called Example.xlsx which is open in Excel and I have the following python code

相关标签:
4条回答
  • 2021-02-15 08:49

    You've already worked out why you can't use openpyxl to write to the .xlsx file: it's locked while Excel has it open. You can't write to it directly, but you can use win32com to communicate with the copy of Excel that is running via its COM interface.

    You can download win32com from https://github.com/mhammond/pywin32 .

    Use it like this:

    from win32com.client import Dispatch
    xlApp = Dispatch("Excel.Application")
    wb=xlApp.Workbooks.Item("MyExcelFile.xlsx")
    ws=wb.Sheets("MyWorksheetName")
    

    At this point, ws is a reference to a worksheet object that you can change. The objects you get back aren't Python objects but a thin Python wrapper around VBA objects that obey their own conventions, not Python's.

    There is some useful if rather old Python-oriented documentation here: http://timgolden.me.uk/pywin32-docs/contents.html

    There is full documentation for the object model here: https://msdn.microsoft.com/en-us/library/wss56bz7.aspx but bear in mind that it is addressed to VBA programmers.

    0 讨论(0)
  • 2021-02-15 08:49

    You can't change an Excel file that's being used by another application because the file format does not support concurrent access.

    0 讨论(0)
  • 2021-02-15 09:00

    If you want to stream real time data into Excel from Python, you can use an RTD function. If you've ever used the Bloomberg add-in use for accessing real time market data in Excel then you'll be familiar with RTD functions.

    The easiest way to write an RTD function for Excel in Python is to use PyXLL. You can read how to do it in the docs here: https://www.pyxll.com/docs/userguide/rtd.html

    There's also a blog post showing how to stream live tweets into Excel using Python here: https://www.pyxll.com/blog/a-real-time-twitter-feed-in-excel/

    If you wanted to write an RTD server to run outside of Excel you have to register it as a COM server. The pywin32 package includes an example that shows how to do that, however it only works for Excel prior to 2007. For 2007 and later versions you will need this code https://github.com/pyxll/exceltypes to make that example work (see the modified example from pywin32 in exceltypes/demos in that repo).

    0 讨论(0)
  • 2021-02-15 09:01

    I have actually figured this out and its quite simple using xlwings. The following code opens an existing Excel file called Example.xlsx and updates it in real time, in this case puts in the value 45 in cell B2 instantly soon as you run the script.

    import xlwings as xw
    
    wb = xw.Book('Example.xlsx')
    sht1 = wb.sheets['Sheet']
    sht1.range('B2').value = 45
    
    0 讨论(0)
提交回复
热议问题