2016-01-15 38 views
0

這是我的第一篇文章,我一直在努力尋找答案,所以請耐心等待!C4D python openpyxl無法保存.xlsm,但在zipfile.py中引發TypeError

我最終希望能夠修改現有的.xslm文件,以便用我在Cinema-4D中通過python提取的運動數據填充它。

我確實嘗試了keep_vba=True,建議here,但仍然遇到下面描述的錯誤。我的宏啓用工作簿來自Excel 2013,我也寫了一個運行宏。我工作的代碼是:

import os 
from openpyxl import load_workbook 

homeDir = os.path.expanduser('~') 

openName = 'Timing_CHART.xlsm' 
openPath = os.path.dirname(__file__) + "\\" + openName 
saveName = raw_input('Please enter a save name: ') 
savePath = homeDir+'\\Desktop\\'+saveName+'.xlsm' 

wb = load_workbook(openPath, keep_vba = True) 
ws = wb.active 

ws['B10'].value = 'Loader' #Just as a test 
ws['D10'].value = 25 

wb.save(savePath) 

當我運行通過Enthought林冠環境中,該代碼(Python的2.7.6 64位),它只是我的預期 - 太棒了。 當我嘗試在我的Cinema-4D安裝(Python 2.6.4 64位)中使用的相同python版本中運行相同的代碼時,它的工作原理完美,直到wb.save()命令爲止。然後我得到錯誤的一大堆:

Traceback (most recent call last): 
    File "<pyshell#14>", line 1, in <module> 
    wb.save(savePath) 
    File "C:\Python26\lib\site-packages\openpyxl-2.3.2-py2.6.egg\openpyxl\workbook\workbook.py", line 263, in save 
    save_workbook(self, filename) 
    File "C:\Python26\lib\site-packages\openpyxl-2.3.2-py2.6.egg\openpyxl\writer\excel.py", line 239, in save_workbook 
    writer.save(filename, as_template=as_template) 
    File "C:\Python26\lib\site-packages\openpyxl-2.3.2-py2.6.egg\openpyxl\writer\excel.py", line 222, in save 
    self.write_data(archive, as_template=as_template) 
    File "C:\Python26\lib\site-packages\openpyxl-2.3.2-py2.6.egg\openpyxl\writer\excel.py", line 68, in write_data 
    archive.writestr(ARC_ROOT_RELS, write_root_rels(self.workbook)) 
    File "C:\Python26\lib\site-packages\openpyxl-2.3.2-py2.6.egg\openpyxl\writer\workbook.py", line 88, in write_root_rels 
    arc = fromstring(workbook.vba_archive.read(ARC_ROOT_RELS)) 
    File "C:\Python26\lib\zipfile.py", line 831, in read 
    return self.open(name, "r", pwd).read() 
    File "C:\Python26\lib\zipfile.py", line 594, in read 
    bytes = self.fileobj.read(bytesToRead) 
TypeError: integer argument expected, got 'long' 

直到我寫這篇文章(和測試了我的發言,因爲我走,以確保我的意思是準確的),我發現它在Enthought Canopy的python v2.7.6與Windows和Cinema-4D的python v2.6.4之間的區別。

最初我以爲它是特定於C4D,但由於C4D運行Python 2.6.4以及,我希望這可以縮小到python版本的可修復問題......或學習確定python 2.6.4是不可能的。

任何幫助/建議非常感謝!

回答

0

好吧,沒有意識到蟒蛇版本的差異會產生影響......但在該領域中多一點挖掘發現,openpyxl在版本1.7後停止支持python 2.5。我假設python 2.6在openpyxl 1.8到2.4之間發生了類似的情況。

我將openpyxl v1.8.6安裝到C4D python 2.6.4庫位置(與setuptools-0.9.6-py2.6一起,因爲它不像openpyxl-1.8.6-py2.6.egg),並在C4D中修改了我的一行代碼。有了這個更新,我的代碼在C4D python v2.6.4中的工作就像一個魅力!

import os 
from openpyxl import load_workbook 

homeDir = os.path.expanduser('~') 

openName = 'Timing_CHART.xlsm' 
openPath = os.path.dirname(__file__) + "\\" + openName 
saveName = raw_input('Please enter a save name: ') 
savePath = homeDir+'\\Desktop\\'+saveName+'.xlsm' 

wb = load_workbook(openPath, keep_vba = True) 
ws = wb.active 

ws['B10'].value = 'Loader' #Just as a test 
ws['D10'].value = 25 

wb.save(savePath) 

當值寫入到新.XLSM文件的細胞,具有openpyxl 2.4版我本來行:

ws.cell(column = curCol, row = curRow, value = eachKey)

這不得不改爲:

ws.cell(column = curCol, row = curRow).value = eachKey

我希望能幫助未來的人!