C4D python openpyxl无法保存.xlsm,但会在zipfile.py中引发TypeError

C4D python openpyxl无法保存.xlsm,但会在zipfile.py中引发TypeError,python,excel,python-2.7,macros,cinema-4d,Python,Excel,Python 2.7,Macros,Cinema 4d,这是我的第一篇帖子,我一直在努力寻找答案,所以请耐心等待 我最终希望能够修改现有的.xslm文件,用我通过python在Cinema-4D中提取的运动数据填充它 我确实按照建议尝试了keep_vba=True,但仍然得到了下面描述的错误。我的宏启用工作簿来自Excel 2013,我还编写了一个功能强大的宏。我的工作代码是: import os from openpyxl import load_workbook homeDir = os.path.expanduser('~') openNa

这是我的第一篇帖子,我一直在努力寻找答案,所以请耐心等待

我最终希望能够修改现有的.xslm文件,用我通过python在Cinema-4D中提取的运动数据填充它

我确实按照建议尝试了
keep_vba=True
,但仍然得到了下面描述的错误。我的宏启用工作簿来自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)
当我通过Enthound Canopy环境(Python2.7.6 64位)运行这段代码时,它的工作方式与我预期的一样——棒极了。 当我尝试在Cinema-4D安装中使用的相同python版本(Python2.6.4 64位)中运行相同的代码时,它可以完美地运行到
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'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
wb.save(保存路径)
文件“C:\Python26\lib\site packages\openpyxl-2.3.2-py2.6.egg\openpyxl\workbook\workbook.py”,第263行,保存
保存工作簿(自身,文件名)
文件“C:\Python26\lib\site packages\openpyxl-2.3.2-py2.6.egg\openpyxl\writer\excel.py”,第239行,在保存工作簿中
writer.save(文件名,as_template=as_template)
文件“C:\Python26\lib\site packages\openpyxl-2.3.2-py2.6.egg\openpyxl\writer\excel.py”,第222行,保存
self.write_数据(存档,作为_模板=作为_模板)
文件“C:\Python26\lib\site packages\openpyxl-2.3.2-py2.6.egg\openpyxl\writer\excel.py”,第68行,在write\u数据中
archive.writestr(ARC_ROOT_RELS,write_ROOT_RELS(self.工作簿))
文件“C:\Python26\lib\site packages\openpyxl-2.3.2-py2.6.egg\openpyxl\writer\workbook.py”,第88行,在write\u root\u rels中
arc=fromstring(workbook.vba\u archive.read(arc\u ROOT\u RELS))
文件“C:\Python26\lib\zipfile.py”,第831行,已读
返回self.open(名称“r”,pwd).read()
文件“C:\Python26\lib\zipfile.py”,第594行,已读
字节=self.fileobj.read(bytesToRead)
TypeError:应为整数参数,得到“long”
直到我写了这篇文章(并测试了我的陈述,以确保我所说的是准确的),我才发现在Enthough Corporation中使用python v2.7.6与Windows和Cinema-4D中使用python v2.6.4之间的区别

最初我认为它是特定于C4D的,但由于C4D也运行Python 2.6.4,我希望这可以缩小到Python版本的可修复问题。。。或者确定使用Python2.6.4是不可能的


非常感谢您的任何帮助/建议

好吧,我没有意识到python版本的差异会对。。。但是在这个领域再深入一点,openpyxl在1.7版之后就不再支持python 2.5了。我假设在OpenPYXL1.8和当前的2.4之间,Python2.6也发生了类似的事情

我安装到C4D python 2.6.4库位置(以及,因为它不喜欢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)
在使用openpyxl v.2.4将值写入新.xlsm文件的单元格时,我最初有一行:

ws.cell(列=curCol,行=curRow,值=eachKey)

必须将其更改为:

ws.cell(列=curCol,行=curRow)。值=eachKey

我希望将来能帮助别人