Openpyxl Does Not Close Excel Workbook In Read Only Mode
Solution 1:
For some draconian reason, stackoverflow will allow me to post an answer but I don't have enough 'rep' to comment or vote -- so here we are.
The accepted answer of wb._archive.close()
did not work for me. Possibly this is because I am using read-only mode. It may work fine when in 'normal' mode.
bmiller's answer is the only answer that worked for me as well:
with open(xlsx_filename, "rb") as f:
in_mem_file = io.BytesIO(f.read())
wb = load_workbook(in_mem_file, read_only=True)
And as he said, it is faster when loading with open() versus only using read-only.
My working code based on bmiller's answer:
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)
Solution 2:
I've tried all these solutions for closing an xlsx file in read-only mode and none seem to do the job. I finally ended up using an in-mem file:
with open(xlsx_filename, "rb") as f:
in_mem_file = io.BytesIO(f.read())
wb = load_workbook(in_mem_file, read_only=True)
Might even load faster and no need to worry about closing anything.
Solution 3:
wb._archive.close()
Works with use_iterator too.
Solution 4:
I also found this to be a problem, and think it is strange that workbooks have no close method.
The solution I came up with was a context manager which "closes" the file for me so that I don't have put meaningless saves in my code every time I read a spreadsheet.
@contextlib.contextmanager
def load_worksheet_with_close(filename, *args, **kwargs):
'''
Open an openpyxl worksheet and automatically close it when finished.
'''
wb = openpyxl.load_workbook(filename, *args, **kwargs)
yield wb
# Create path in temporary directory and write workbook there to force
# it to close
path = os.path.join(tempfile.gettempdir(), os.path.basename(filename))
wb.save(path)
os.remove(path)
To use it:
with load_worksheet_with_close('myworkbook.xlsx') as wb:
# Do things with workbook
Solution 5:
For your latest information, openpyxl 2.4.4+ provides Workbook.close()
method. Below are references.
http://openpyxl.readthedocs.io/en/stable/changes.html?highlight=close#id86
https://bitbucket.org/openpyxl/openpyxl/issues/673
Post a Comment for "Openpyxl Does Not Close Excel Workbook In Read Only Mode"