使用python和openpyxl我有一个代码,可以进入工作簿中,每天向某些单元格添加一堆信息,然后关闭并保存它。我的问题是,如果此工作簿打开,则代码不起作用(显然(。
通过使工作簿共享(多个用户可以一次编辑(,我可以克服此问题,但是在代码运行一次后,Python保存,然后将其恢复回一个封闭的未共享工作簿。有人知道OpenPyXl是否可以保存为共享?我没有在网上找到任何东西。先发制人的感谢。
看来,当OpenPyXl保存Excel Workbook时,DocProps/app.xml文件将被擦拭,仅包含最小信息。
快速(和脏(解决方案是使用Zipfile获取这些信息并将其传输到新的/保存的文件中。
import zipfile, openpyxl
def shared_pyxl_save(file_path, workbook):
"""
`file_path`: path to the shared file you want to save
`workbook`: the object returned by openpyxl.load_workbook()
"""
zin = zipfile.ZipFile(file_path, 'r')
buffers = []
for item in zin.infolist():
buffers.append((item, zin.read(item.filename)))
zin.close()
workbook.save(file_path)
zout = zipfile.ZipFile(file_path, 'w')
for item, buffer in buffers:
zout.writestr(item, buffer)
zout.close()
这是我在另一个页面上的答案帖子,但是此页面是原始页面
好吧...在来回播放之后,出于某种奇怪的原因zipfile.infolist((也包含表数据,因此,使用sharone_pyxl_save示例,这是我对其进行微调的方法/p>
基本上不是让旧文件覆盖表的数据,而是使用旧文件
def shared_pyxl_save(file_path, workbook):
"""
`file_path`: path to the shared file you want to save
`workbook`: the object returned by openpyxl.load_workbook()
"""
zin = zipfile.ZipFile(file_path, 'r')
buffers = []
for item in zin.infolist():
if "sheet1.xml" not in item.filename:
buffers.append((item, zin.read(item.filename)))
zin.close()
workbook.save(file_path)
""" loop through again to find the sheet1.xmls and put it into buffer, else will show up error"""
zin2 = zipfile.ZipFile(file_path, 'r')
for item in zin2.infolist():
if "sheet1.xml" in item.filename:
buffers.append((item, zin2.read(item.filename)))
zin2.close()
#finally saves the file
zout = zipfile.ZipFile(file_path, 'w')
for item, buffer in buffers:
zout.writestr(item, buffer)
zout.close()
workbook.close()