首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C4D python无法保存.xlsm,而是在zipfile.py中引发TypeError

C4D python无法保存.xlsm,而是在zipfile.py中引发TypeError
EN

Stack Overflow用户
提问于 2016-01-15 21:47:20
回答 1查看 240关注 0票数 0

这是我的第一篇帖子,我一直在努力寻找答案,所以请容忍我!

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

我确实按照建议的keep_vba=True尝试了这里,但是仍然得到了下面描述的错误。我的宏启用工作簿来自Excel 2013,我还编写了一个功能良好的宏。我的工作代码是:

代码语言:javascript
复制
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环境(Python2.7.6,64位)运行这段代码时,它的工作原理就像我所期望的--非常棒。当我尝试在我的Cinema-4D安装(Python2.6.4-位)中使用的相同版本的python中运行相同的代码时,它将完美地工作直到wb.save()命令。然后我得到一堆错误:

代码语言:javascript
复制
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'

直到我写了这篇文章(并测试了我的陈述,以确保我所说的是准确的),我才发现了在Windows和Cinema-4D中使用pythonv2.7.6中的python v2.7.6和Cinema-4D的不同之处。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-15 22:45:59

好吧,没有意识到python版本的不同会有影响..。但是,在这个领域再深入一点,就会发现openpyxl在版本1.7之后不再支持python2.5。我假设在openpyxl1.8到当前2.4之间出现了类似的python2.6。

我将openpyxl v1.8.6安装到C4D python2.6.4库位置(以及setuptools-0.9.6-py2.6,因为它不喜欢openpyxl-1.8.6-py2.6蛋),并在C4D中修改了一行代码。有了这个更新,我的代码可以在C4D pythonv2.6.4中像一个魅力一样安装!

代码语言:javascript
复制
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 v.2.4,我最初使用的行是:

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

必须改为:

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

我希望这能对未来的人有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34820417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档