Driving Excel from Python in Windows
Solution 1
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:
- The O'Reilly book Python Programming on Win32 has an Integrating with Excel chapter.
- Same book, free sample chapter Advanced Python and COM covers makepy in detail.
- Tutorials
- win32com documentation, I suggest you read this first.
Solution 2
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!
Solution 3
Check out the DataNitro project (previous name IronSpread). It is a Python plug-in for Excel.
Solution 4
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
Solution 5
I worked on a home project last year that involves a client written as a Python Excel plug-in. The project is essentially an online database simplified for end-user access. The Excel plug-in allows users to query data out of the database to display in Excel.
I never got very far with the Excel plug-in and my code for it is a bit ugly. But, what I do have is under a BSD license and available via Bazaar at
http://www.launchpad.net/analyz/trunk
The client won't work since I don't have a public server running right now, but at least you can look at what I did with the code to get some ideas how this could work. The code will also show you how to build an MFC dialog in 100% Python.
Related videos on Youtube
YGA
Updated on August 27, 2020Comments
-
YGA over 3 years
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
-
codeape over 15 yearsCheck out Resolver One (resolversystems.com/products, a Python-programmable spreadsheet. There is a free version for personal, non-commercial use available at resolversystems.com/download.
-
caps over 9 yearsWhy hasn't anyone mentioned xlrd/xlwt/xlutils? www.python-excel.org
-
smwikipedia over 8 years@caps
xlrd/xlwt/xlutils
has severe limitations. To edit an existing excel, you must usexlutils
to copy a read-onlyxlrd.Book
to a writablexlwt.Workbook
. A lot of things will be lost during the copy. According to its javadoc, it onlypreserving as much information from the source object as possible.
, which makes it off my list.
-
Boris Gorelik about 14 yearsat least on my computer the line "wb = excel.Workbooks.Append()" has to be corrected to "wb = excel.Workbooks.Add()"
-
trinth almost 12 yearsfor those who are wondering, the API (for Excel 2007) is here: msdn.microsoft.com/en-us/library/bb149081(v=office.12)
-
TankorSmash over 11 yearsIts easy to fix on our end, but your link cuts off the last parenthesis, @trinth
-
Felix Zumstein almost 10 yearsCheck out my new project at xlwings.org that wraps this approach into an easy and Pythonic interface and provides possibilities to call it through Excel.
-
twasbrillig over 9 yearsIf you're a student, DataNitro is free, but otherwise the license costs $99.
-
TanuAD over 4 yearsDataNitro is no longer available for purchase.