引入openpyxl
这里使用openpyxl库来操作Excel。类似的库还有xlrd。
penpyxl的基础使用方法请参见Python openpyxl 处理Excel使用指南。
pip install openpyxl
openpyxl介绍
openpyxl模块可实现对excel文件的读、写和修改,只能处理xlsx文件,不能处理xls文件,使用之前同样需要先安装该模块,再导入 import openpyxl。
对于openpyxl,行数和列数都从1开始,单元格的行和列也从1开始。例如sheet.cell(1,2).value表示第一行第二列单元格的内容
openpyxl读取excel文件
获取工作簿对象:book = openpyxl.load_workbook('excel文件名称')
获取所有工作表名称:names = book.sheetnames
获取工作表对象:sheet1 = book.worksheets[n]、sheet2 = book['工作表名称']、sheet3 = book[book.sheetnames[n]]
获取工作表名称:title = sheet1.title
获取工作表行数:rows = sheet1.max_row
获取工作表列数:cols = sheet1.max_column
获取某一单元格内容:cell = sheet.cell(1,2).value、sheet['单元格'].value例如sheet['B1'].value
假设有一fruit2.xlsx,除后缀名其他与上述fruit.xls完全一样
数据准备
假定数据来自百度指数,以常见的一些搜索指数为例。给后面的操作准备一些数据,把数据写入Excel中。
创建Workbook对象,获取到当前可用的表格(sheet)。
直接使用append方法把一行数据追加写入。最后调用Workbook的保存方法,存储数据。
def create_excel_demo(file_path): """ 创建Excel文件,并写入数据 :param file_path: 目标文件路径 :return none """ wb = Workbook() ws = wb.active ws.title = '搜索指数概览' ws.append(['关键词', '整体日均值', '移动日均值', '整体同比', '整体环比', '移动同比', '移动环比']) ws.append(['excel', 27782, 18181, -0.11, -2, 0.21, 0.02]) ws.append(['python', 24267, 8204, 0.27, 0.06, 0.56, 0.01]) ws.append(['文案', 2411, 1690, 0.56, 0.33, 0.91, 0.46]) ws.append(['okr', 1928, 880, 0.38, 0.15, 0.29, 0.09]) ws.append(['kpi', 4212, 2784, 0.21, -0.19, 0.36, -0.22]) wb.save(file_path)
读取数据
访问整个表格的数据
访问表格中所有的数据,并打印出来。
首先我们要知道表格中有数据的单元格的范围,使用sheet.max_row与sheet.max_column获取表格的行列数量。
def read_xlsx_basic(file_path): """ 读取Excel的数据并打印出来 """ wb = load_workbook(file_path) st = wb.active end_row = st.max_row + 1 end_column = st.max_column + 1 print(st.title, '有', end_row, '行', end_column, '列') for row in range(1, end_row): for col in range(1, end_column): print('{:10}'.format(st.cell(row=row, column=col).value), end='') print()
值得注意的是,单元格下标是从1开始的。如果使用了不当的下标,报错信息
ValueError: Row or column values must be at least 1
参考: https://stackoverflow.com/questions/34492322/how-to-scan-all-sheet-cells
修改表格
有了Excel表格后,我们可以修改表格的一些格式和数据。
st表示当前表。
调整列的宽度
用 column_dimensions 来获取列。例如column_dimensions['A']获取到的是第A列。
ord方法是将字符转换为ascii码。ord('A')得到65。
这里调整的是A列到G列的宽度。
for col in range(ord('A'), ord('G') + 1): st.column_dimensions[chr(col)].width = 15
设置单元格格式
格式,比如字体大小,对齐模式,粗体斜体等。
字体
首先我们要拿到单元格cell,这里使用st.cell(row=1, column=col)来获取某一个格子。
Cell持有的font是不可修改的。不能使用如cell.font.size = 13这样的操作,会报异常。
copy方法是复制一个对象。这里复制的是font。
cell = st.cell(row=1, column=col) font = copy(cell.font) font.size = 13 font.bold = True cell.font = font
对齐
对齐模式。使用alignment属性。
cell.alignment = Alignment(horizontal="center", vertical="center")
数据显示
操作Excel时,我们可以设置单元格数据显示的方式,比如常规,数值,货币,百分比等等。
这里使用的是number_format属性。
如果数据(value)是0.02,经过下面的设置后,Excel中显示的是2%。
cell.number_format = '0%'
修改数据
修改单元格的数值(value)。
修改数据首先要拿到那个单元格cell,然后对其value赋值。
st.cell(row=2, column=7).value = 0.42 # 修改数值
示例:
import openpyxl file=r'cases.xlsx' #Open the given filename and return the workbook workbook=openpyxl.load_workbook(file) #选中工作簿中的表单 sh=workbook['register'] # 读取 # print(sh.rows,type(sh.rows)) # 按行读取,每一行的数据放到一个元组中 res=list(sh.rows) # print(res,type(res)) title=[i.value for i in res[0]] # print(title) cases=[] #遍历除第一行外的其他行 for item in res[1:]: print(item) it=[i.value for i in item] # 打包成字典 case=dict(zip(title,it)) cases.append(case) print(cases) def read_excel(): excel=openpyxl.load_workbook('./cases.xlsx') sheet=excel['Sheet2'] list_tuple=[] # 逐行循环读取excel的数据 for value in sheet.values: # 判断当前行第一列的值是否是数字编号 if type(value[0]) is int: # 将每一行读取的内容(元组),装载到list_tuple中 list_tuple.append(value) return list_tuple
参考:
https://stackoverflow.com/questions/12387212/openpyxl-setting-number-format
https://stackoverflow.com/questions/30050716/how-to-put-two-decimals-in-cell-with-type-of-percent