2014-02-14 128 views
2

您看到什么工具将数据传入和传出MS-Excel?Excel与Python互动

这些是关于工具选择以及在线提供优秀技术文章的建议的请求。这不是关于wxpython中的命名方法和对象的问题。

背景:

我现在的工作或退休或euthanatising一堆用户开发的Microsoft Excel应用程序,并最终状态是,数据存储和检索,以及数据处理,都将驻留并运行在我们公司的服务器上,运行在现有的公司范围的Python应用程序平台上。

这些Excel工作簿中的一部分将继续存在,通过Python应用程序从我们的服务器调用数据 - 这看起来很像现有Excel加载项的屏幕和菜单 - 并且Excel仍将用于任何本地数据 - 让我们的用户选择去做。但是繁重的工作正在转向我们的服务器上的python,在那里我们有一个庞大的python对象和工具代码库。

我们可以自由地设计工具和界面来完成所有这些工作。

所以问题是:

  1. 都看到什么?
  2. 那里有什么工具?
  3. 你发现了哪些陷阱和损失?

我们拿出的Excel和VBA越多,运行在服务器上,我就越开心。我所看到的很多VBA代码和基于单元格的公式逻辑在几年前应该已经退休,并且在脆弱的桌面工具中运行它具有明显的操作风险。

请注意,我们进一步去有点不是“在这里,让我打开一个新的Excel工作表,粘贴和格式化的一些数据,然后保存文件” - 我们需要互动与现有的Excel工作表,开放,在Excel.exe的现有会话中运行。

回答

5

听起来好像你所后直接使用Excel组件对象模型的工作,使用pywin32库。通过这条路线,您将可以通过python访问所有的excel函数。看看Excel的COM接口参考:

http://msdn.microsoft.com/en-us/library/office/ee861528.aspx

首先您需要安装pywin32 library。然后让自己熟悉python的COM交互。这是来自Python Programming on Win32的一章,它可以帮助你开始。

基本介绍使用pywin32控制Excel中:

from win32com.client import Dispatch 

>>> excel = Dispatch('Excel.Application') # get a handle to the Excel COM object 
>>> workbook = excel.Workbooks.Open('absolute\\path\\to\\workbook.xlsm') # open an existing excel workbook 
>>> worksheet = workbook.Worksheets('Sheet1') # get the worksheet called "Sheet1" 
>>> r = worksheet.Range('A1:A5') 
>>> print r.Value 
((u'Value of A1',), (u'Value of A2',), (u'Value of A3',), (u'Value of A4',), (u'Value of A5',)) 
>>> 
>>> r.Value = range(5) 
>>> print r.Value 
((0.0,), (1.0,), (2.0,), (3.0,), (4.0,)) 
>>> 
>>> workbook.Close() 
>>> excel.Quit() 

,可以控制使用COM对象的Excel的任何方面。如果您第一次运行excel.Visible = 1,则可以实时观看所有更改。

但是,在使用此API时,您需要小心地正确关闭excel对象。如果您的程序在正确调用excel.Quit()(并且在某些情况下,我发现我必须明确调用del excel)之前崩溃或退出,那么您最终将在后台运行EXCEL.exe进程。

+0

您也可以使用已包含pywin32的Python的ActiveState版本。 http://www.activestate.com/activepython/downloads ...除此之外,我完全同意Brian的方法。 – twasbrillig

2

那么我所做的(将Excel电子表格集合中的数据转化为SQL后端)比您所使用的功能简单得多,但xlrd是一个真正的宝石。它可以让你浏览Excel电子表格,并在Python中很自然地处理他们的数据。我曾与大量蹩脚和痛苦的API合作,并且xlrd不是其中之一。我还没有使用它的Excel写作伴侣xlwt,但基于我对xlrd的经验,我寄予厚望。

http://www.python-excel.org

+0

谢谢 - 我知道xlrd,但我见过的代码可能会更好。为了更好地使用xlrd和xlrt,我可能必须成为某种“传道者”,这对于我的现任雇主来说是这样的:对于初学者到中级Python编码人员来说,这是一个令人生畏的前景。 –