有时候我们需要处理大型Excel文件,打开时容易出现卡顿、闪退的情况。程序也不例外,如果让程序直接读取大型工作簿中的数据,读取程序本身的运行也会变得缓慢、“卡顿”。
这次我们介绍一种新的操作Excel文件的第三方库,并通过它来处理大型文件。它完全可以取代xlrd、xlwt进行Excel文件的读写操作。
openpyxl相较于xlrd、xlwt,有更丰富的功能,通过openpyxl可以对工作簿进行读写及修改操作。此外,openpyxl同时支持*.xls与*.xlsx格式的工作簿,不用再考虑格式问题。openpyxl唯一的劣势就是对Excel中的VBA(Visual Basic forApplications)支持并不友好,但掌握了Python操作Excel的知识,你将不再需要使用VBA。
当要处理大型Excel文件时,直接将整个文件数据载入程序的操作是不合理的,数据量过大会占用过多内存,从而影响程序本身的运行速度,导致程序出现“卡顿”、闪退等情况。
为了读取大型Excel文件中的数据或将大量数据写入文件,需要使用openpyxl的read_only模式与write_only模式。
在read_only模式下,openpyxl可以使用恒定的内存来处理无限的数据,其原理就是先处理一部分数据,处理完后,释放占用的内存,然后继续读入部分数据进行处理。这种方式可以快速读取大型Excel文件中的数据。但需要注意,在该模式下,不允许对工作表进行写操作。
在write_only模式下,openpyxl也是通过类似的原理将大量数据分批写入Excel文件中的。不同之处在于,该模式下不允许对工作表进行读操作。
下面通过两段程序,具体说明如何使用openpyxl完成大数据文件的读取与写入:
读取实例程序:
代码语言:javascript复制import openpyxl import load_workbook
# read_only模式下读取大数据文件
big_excel_file = load_workbook(filename='file.xlsx',read_only=True)
sheet = big_excel_file['sheet_name']
# 遍历表格中的行数据
fow now in sheet.rows:
# 遍历每行中的每一列
for cell in row:
print(cell.value)
写入实例程序:
代码语言:javascript复制from openpyxl import Workbook
from openpyxl.cell import WriteOnlyCell
from openpyxl.comments import Comment
from openpyxl.styles import Font
# 设置write_only为True
wb = Workbook(write_only=True)
sheet = wb.create_sheet()
# 创建一个sheet
cell = WriteOnlyCell(sheet,value='write_only')
cell.font = Font(name="微软雅黑",size=24)
# 添加数据
sheet.append([cell,'talkpython',None])
# 保存文件
wb.save('talkpython.xlsx')
在write_only模式下,创建单元格需要使用WriteOnlyCell方法,使用该方法创建的单元格依旧可以设置相应的样式。此外,在write_only模式下,不可在任意位置使用cell或iter_rows方法,在添加数据时只能使用append方法。