【问题标题】:C4D python openpyxl cannot save .xlsm, but raises TypeError in zipfile.pyC4D python openpyxl 无法保存 .xlsm,但在 zipfile.py 中引发 TypeError
【发布时间】:2016-01-15 21:47:20
【问题描述】:

这是我的第一篇文章,我一直在努力寻找答案,所以请多多包涵!

我最终希望能够修改现有的 .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 是不可能的。

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

【问题讨论】:

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


    【解决方案1】:

    好的,没有意识到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

    希望以后能帮到别人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      相关资源
      最近更新 更多