Openpyxl不会以只读模式关闭Excel工作簿

wor*_*ise 7 python excel python-2.7 openpyxl

我希望能够在Python中读取Excel文件,在读取完成后保持Python脚本运行其他操作,并且能够在此期间在另一个进程中编辑Excel文件.我正在使用python 2.7和openpyxl.

目前它看起来像:

from openpyxl import load_workbook

def get_excel_data():
    OESwb = load_workbook(filename = OESconfigFile, data_only=True, 
                          read_only=True)
    ws = OESwb.get_sheet_by_name('MC01')
    aValue = ws['A1'].value
    return aValue

val = get_excel_data()
Run Code Online (Sandbox Code Playgroud)

运行该函数后,Excel文件仍然被锁定以便从其他进程访问(它提供错误"'filename'当前正在使用.稍后再试")即使我不想再用Python读取它.

如何从脚本中关闭文件?我已经尝试过OESwb.close(),但它给出了错误"'Workbook'对象没有属性'close'".我找到了这篇文章,但它似乎没有帮助.

编辑:似乎OESwb.save('filename.xlsx')工作,但只有read_only = False.但是,能够关闭文件并仍然处于只读模式是理想的.看来这是openpyxl的一个错误,因为它应该在load_workbook完成后关闭文件.

小智 12

wb._archive.close()
Run Code Online (Sandbox Code Playgroud)

也可以使用use_iterator.

  • 在只读工作簿上调用“.close()”似乎还不够。在Python进程退出之前,Excel本身无法写入该文件。 (6认同)

Pat*_*ell 9

出于一些严苛的原因,stackoverflow将允许我发布答案,但我没有足够的'代表'来评论或投票 - 所以我们在这里.

接受的答案wb._archive.close()对我不起作用.可能这是因为我使用的是只读模式.在"正常"模式下它可能正常工作.

bmiller的回答是唯一对我有用的答案:

with open(xlsx_filename, "rb") as f:
    in_mem_file = io.BytesIO(f.read())

wb = load_workbook(in_mem_file, read_only=True)
Run Code Online (Sandbox Code Playgroud)

正如他所说,这更快地打开装载时()与只使用只读.

我的工作代码基于bmiller的答案:

import openpyxl
import io

xlsx_filename=r'C:/location/of/file.xlsx')
with open(xlsx_filename, "rb") as f:
    in_mem_file = io.BytesIO(f.read())

wb = openpyxl.load_workbook(in_mem_file, read_only=True)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。我已经挠头好几个小时了,为什么 python 不从内存中卸载这个 excel,为什么我无法在下一行中使用 stutil 删除那个该死的文件。您的解决方案有效! (3认同)

bmi*_*ler 6

我已经尝试了所有这些解决方案,以只读模式关闭xlsx文件,似乎没有人做这项工作.我终于最终使用了一个内存文件:

with open(xlsx_filename, "rb") as f:
    in_mem_file = io.BytesIO(f.read())

wb = load_workbook(in_mem_file, read_only=True)
Run Code Online (Sandbox Code Playgroud)

甚至可能加载更快,无需担心关闭任何东西.


Leo*_*rd2 5

对于您的最新信息,openpyxl 2.4.4+ 提供了Workbook.close()方法。以下是参考资料。

http://openpyxl.readthedocs.io/en/stable/changes.html?highlight=close#id86
https://bitbucket.org/openpyxl/openpyxl/issues/673

  • 在只读工作簿上调用“.close()”似乎还不够。在Python进程退出之前,Excel本身无法写入该文件。 (3认同)