2014-02-14 127 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編碼人員來說,這是一個令人生畏的前景。 –