2015-04-22 161 views
0

我試過用「xlwings_0.3.4」打開一個excel .xltm文件並再次保存,以確保VBA模塊保持在一個簡單的測試。我無法讓它工作。「xlwings」:不支持寫入.xlsm文件?

如果我在保存步驟中給出文件擴展名,則該文件將保存爲.xlsx文件。該模塊隨身攜帶,但隨着擴展的更改,它不會被識別爲有效的VBA模塊。如果我沒有指定文件擴展名,它會自動保存爲.xlsx:

WB=xlwings.Workbook('template.xltm') 
WB.save('outfile') 
WB.close() 

這給出了一個xlsx文件。

嘗試設置該文件以XLSM生成錯誤:

xl_workbook.SaveAs(path) 
File "<COMObject Open>", line 7, in SaveAs 
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, u'Microsoft   Excel', u'This extension can not be used with the selected file type. Change the file extension in the File name text box or select a different file type by changing the Save as type.', u'xlmain11.chm', 0, -2146827284), None) 

這似乎是固有的由GetActiveObject('Excel.Application')返回的應用程序對象:

WB.save('outfile.xlsm') 
WB.close() 
xl_workbook.SaveAs(path) 

會產生錯誤。

是否有開關(如openpyxl中的'keep_VBA=True'開關?),還是不能用xlwings保存xlsm文件?

回答

1

你想用xl_workbook.SaveAs(path)做什麼?

以下工作:

>>> from xlwings import Workbook 
>>> wb = Workbook(r'C:\full\path\to\file.xlsm') 
>>> wb.save('new_name.xlsm') 

不指定在保存時的全名,它會目前(v0.3.4),將其保存在默認的Excel目錄,這可能要提高到目前的Python工作目錄與新文件的功能一致。

請注意,在以新名稱保存工作簿之後,上面的wb仍舊引用舊文件,因此wb.close()對新文件沒有影響。這也應該改進,以便Workbook.save()返回新的工作簿對象。我將在GitHub頁面上打開問題以涵蓋這些改進。

+0

是的,它的確可以使用.xlsm文件。但是,我試圖使用定義的模板文件(.xltm)。顯然,Excel在打開模板文件時的默認行爲是將「保存」方法設置爲.xlsx(而不是.xlsm)。因此,打開一個模板(.xltm)會阻止將其保存爲啓用宏的文件(.xlsm)。解決方法是不使用模板文件(很簡單,但不是很一般)。由於這是Excel的win32com.client接口的行爲,而不是xlwings本身,所以我會尋找正確的方法。將支票添加到xlwings看起來非常容易。 – BPT

+0

啊 - 對不起 - 錯過了那個「t」。 –

+0

看看這裏(這也應該加入到xlwings中):http://stackoverflow.com/questions/21306275/pywin32-saving-as-xlsm-file-instead-of-xlsx –