C4D python openpyxl无法保存.xlsm,但在zipfile.py

时间:2016-01-15 21:47:21

标签: python excel python-2.7 macros cinema-4d

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

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

我按照建议here尝试了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)

当我通过Enthought Canopy环境(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'

直到我写这篇文章(然后测试我的陈述,以确保我所说的是准确的),我发现它与python v2.7.6的工作/失败之间的区别在Windows和Cinema-4D中的Enthought Canopy与python v2.6.4中。

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

非常感谢任何帮助/建议!

1 个答案:

答案 0 :(得分:0)

好吧,没有意识到python版本的差异会产生影响......但是在该领域的一点点挖掘显示openpyxl在版本1.7之后停止支持python 2.5。我假设在openpyxl 1.8到当前2.4之间的python 2.6发生了类似的事情。

我将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)

当使用openpyxl v.2.4将值写入新.xlsm文件的单元格时,我最初有这条线:

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

必须改为:

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

我希望将来可以帮助某人!