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

标签 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()

在我运行该函数后,即使我不想在 Python 中读取它,Excel 文件仍然被锁定以供其他进程访问(它给出错误“'filename' is currently in use. Try again later”)不再。

如何从我的脚本中关闭文件?我试过 OESwb.close() 但它给出了错误“'Workbook' 对象没有属性 'close'”。我找到了 this post但它似乎没有帮助。

编辑: 看起来 OESwb.save('filename.xlsx') 有效,但前提是 read_only=False。但是,最好能够关闭文件并仍处于只读模式。看来这是 openpyxl 的错误,因为它应该在 load_workbook 完成后关闭文件。

最佳答案

出于某些严酷的原因,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)

正如他所说,与仅使用只读相比,使用 open() 加载时更快。

我的工作代码基于 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)

关于python - Openpyxl 不会以只读模式关闭 Excel 工作簿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31416842/

相关文章:

python - 使用正则表达式排除引号内的案例

python - fastapi 主体在两个函数之间表现不同

Python:从 python shell 命令替换 json 文件中的字符串

VBA - 计算两列的重复值并标记它

php - Laravel excel 导出 - 字符串格式的列显示为数字

C# 迭代泛型对象

python - 导入错误 : No module named db when using chatterbot

python - 跳过循环中的多次迭代

python - 如何合并两个重叠的数据框

python - Python中数组的移动平均值