Driving Excel from Python in Windows

2019-01-02 14:40发布

We have various spreadsheets that employ deliciously complicated macros and third party extensions to produce complicated models. I'm working on a project that involves slightly tweaking various inputs and seeing the results. Rather than doing this by hand or writing VBA, I'd like to see if I can write a python script to drive this. In other words, the python script will start up, load the excel sheet, and then interact with the sheet by making minor changes in some cells and seeing how they affect other cells.

So, my question is twofold:

  • What is the best library to use to drive excel from python in such fashion?

  • Where's the best documentation/examples on using said library?

Cheers, /YGA

7条回答
爱死公子算了
2楼-- · 2019-01-02 15:14

I've spent about a week, and here's my implementation (or rather proof-of-concept): https://github.com/Winand/SimplePython

Main idea is to make Python code as easy to write and call from Microsoft Office as VBA macros (i've made Add-In only for Excel).

  • Client-server architecture (over TCP), so Python is started only once
  • Server is auto-started if it's not running
  • Server auto-reloads macro modules when user changes them
  • Easy-to-use control interface on Office ribbon
查看更多
墨雨无痕
3楼-- · 2019-01-02 15:16

There is an interesting project for integrating python into excel as an in-process DLL which can be fount at:

http://opentradingsystem.com/PythonForExcel/main.html

Another somewhat more simple project along the same idea exists at:

http://www.codeproject.com/Articles/639887/Calling-Python-code-from-Excel-with-ExcelPython

These projects seem to have a lot of promise but need more development.

查看更多
几人难应
4楼-- · 2019-01-02 15:18

I've done this by using pywin32. It's not a particularly pleasant experience, since there's not really any abstraction; it's like using VBA, but with python syntax. You can't rely on docstrings, so you'll want to have the MSDN Excel reference handy (http://msdn.microsoft.com/en-us/library/aa220733.aspx is what I used, if I remember correctly. You should be able to find the Excel 2007 docs if you dig around a bit.).

See here for a simple example.

from win32com.client import Dispatch

xlApp = Dispatch("Excel.Application")
xlApp.Visible = 1
xlApp.Workbooks.Add()
xlApp.ActiveSheet.Cells(1,1).Value = 'Python Rules!'
xlApp.ActiveWorkbook.ActiveSheet.Cells(1,2).Value = 'Python Rules 2!'
xlApp.ActiveWorkbook.Close(SaveChanges=0) # see note 1
xlApp.Quit()
xlApp.Visible = 0 # see note 2
del xlApp

Good luck!

查看更多
听够珍惜
5楼-- · 2019-01-02 15:24

For controlling Excel, use pywin32, like @igowen suggests.

Note that it is possible to use static dispatch. Use makepy.py from the pywin32 project to create a python module with the python wrappers. Using the generated wrappers simplifies development, since for instance ipython gives you tab completion and help during development.

Static dispatch example:

x:> makepy.py "Microsoft Excel 11.0 Object Library"
...
Generating...
Importing module
x:> ipython
> from win32com.client import Dispatch
> excel = Dispatch("Excel.Application")
> wb = excel.Workbooks.Append()
> range = wb.Sheets[0].Range("A1")
> range.[Press Tab]
range.Activate                 range.Merge
range.AddComment               range.NavigateArrow
range.AdvancedFilter           range.NoteText
...
range.GetOffset                range.__repr__
range.GetResize                range.__setattr__
range.GetValue                 range.__str__
range.Get_Default              range.__unicode__
range.GoalSeek                 range._get_good_object_
range.Group                    range._get_good_single_object_
range.Insert                   range._oleobj_
range.InsertIndent             range._prop_map_get_
range.Item                     range._prop_map_put_
range.Justify                  range.coclass_clsid
range.ListNames                range.__class__
> range.Value = 32
...

Documentation links:

查看更多
残风、尘缘若梦
6楼-- · 2019-01-02 15:25

I wrote python class that allows working with Excel via COM interface in Windows http://sourceforge.net/projects/excelcomforpython/

The class uses win32com to interact with Excel. You can use class directly or use it as example. A lot of options implemented like array formulas, conditional formatting, charts etc.

查看更多
荒废的爱情
7楼-- · 2019-01-02 15:26

Check out the DataNitro project (previous name IronSpread). It is a Python plug-in for Excel.

查看更多
登录 后发表回答