C4D python openpyxl 无法保存 .xlsm,但在 zipfile.py 中引发 TypeError
C4D python openpyxl cannot save .xlsm, but raises TypeError in zipfile.py
这是我的第一个post,我一直在努力寻找答案,所以请多多包涵!
我最终希望能够修改现有的 .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'
直到我写这篇文章 post(并在我进行时测试我的陈述以确保我所说的是准确的),我才发现它之间的区别 working/failing 在 Enthought Canopy 中使用 python v2.7.6,而在 Windows 和 Cinema-4D 中使用 python v2.6.4。
最初我认为它是 C4D 特有的,但由于 C4D 也是 运行ning Python 2.6.4,我希望这可以缩小到一个可修复的问题使用 python 版本...或确定使用 python 2.6.4.
是不可能的
非常感谢help/advice!
好吧,没有意识到 python 版本的差异会产生影响......但是在那个领域进行更多挖掘发现 openpyxl 在版本 1.7 之后停止支持 python 2.5。我假设 python 2.6 在 openpyxl 1.8 到当前 2.4 之间发生了类似的事情。
我安装了 openpyxl v1.8.6 to the C4D python 2.6.4 library location (along with 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
希望对以后的人有所帮助!
这是我的第一个post,我一直在努力寻找答案,所以请多多包涵!
我最终希望能够修改现有的 .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'
直到我写这篇文章 post(并在我进行时测试我的陈述以确保我所说的是准确的),我才发现它之间的区别 working/failing 在 Enthought Canopy 中使用 python v2.7.6,而在 Windows 和 Cinema-4D 中使用 python v2.6.4。
最初我认为它是 C4D 特有的,但由于 C4D 也是 运行ning Python 2.6.4,我希望这可以缩小到一个可修复的问题使用 python 版本...或确定使用 python 2.6.4.
是不可能的非常感谢help/advice!
好吧,没有意识到 python 版本的差异会产生影响......但是在那个领域进行更多挖掘发现 openpyxl 在版本 1.7 之后停止支持 python 2.5。我假设 python 2.6 在 openpyxl 1.8 到当前 2.4 之间发生了类似的事情。
我安装了 openpyxl v1.8.6 to the C4D python 2.6.4 library location (along with 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
希望对以后的人有所帮助!