openpyxl 模块学习记录
openpyxl 学习记录
-
引用openpyxl库
import openpyxl
-
对工作薄进行操作,openpyxl支持2007版本以上格式的Excel文件。
wb = openpyxl.Workbook() # 创建一个Workbook对象 openwb = openpyxl.load_workbook('namelist.xlsx') # 打开已存在的文件进行操作 wb.save('test.xlsx') # 将wb对象保存为文件 wb.close() # 关闭文件
-
对工作表进行操作
# 创建一个名为“工作表1”的工作表,index的数值代表位置 my_sheet = wb.create_sheet(index=0,title='工作表1') # 获取该工作薄中所有工作表名称列表,返回值为字符串列表 sheet_names = wb.sheetnames # 获取活动工作表 active_sheet = openwb.active # 获取指定名称工作表为活动工作表 active_sheet = openwb['sheet1'] # 设置活动工作表颜色 active_sheet.sheet_properties.tabColor='205EB2'
-
遍历工作表
# 方法一:利用工作表名称列表进行遍历 for sheet_name in sheet_names: active_sheet = openwb[sheet_name] # 方法二:直接遍历所有工作表对象 for active_sheet in openwb.worksheets: print(active_sheet.maxrow)
-
多单元格操作
# 通过切片 >>> cell_range = ws['A1':'C2'] # 通过行(列) >>> colC = ws['C'] >>> colC = ws['A'][3] # A3单元格 >>> col_range = ws['C:D'] >>> row10 = ws[10] # 第10行 >>> row_range = ws[5:10] # 通过指定范围(行 → 行) >>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2): ... for cell in row: ... print(cell) <Cell Sheet1.A1> <Cell Sheet1.B1> <Cell Sheet1.C1> <Cell Sheet1.A2> <Cell Sheet1.B2> <Cell Sheet1.C2> # 通过指定范围(列 → 列) 读取第34列从第8行开始到最大行-1位置的数据,只取值。 >>> for col in ws.iter_cols(min_col=34, max_col=34, min_row=8, max_row=mrow - 1, values_only=True): ... for cell in col: ... print(cell) 公共基础课 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 …… # 增加一行 ws.append(['学号','姓名','科目代码','科目名称','成绩']) # 遍历所有 方法一 >>> ws = wb.active >>> ws['C9'] = 'hello world' >>> tuple(ws.rows) ((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>), (<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>), ... (<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>), (<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>)) # 遍历所有 方法二 >>> tuple(ws.columns) ((<Cell Sheet.A1>, <Cell Sheet.A2>, <Cell Sheet.A3>, ... <Cell Sheet.B7>, <Cell Sheet.B8>, <Cell Sheet.B9>), (<Cell Sheet.C1>, ... <Cell Sheet.C8>, <Cell Sheet.C9>)) # 遍历工作表中所有单元格,只取值 ws = wb.active for row in ws.values: for value in row: print(value)
-
插入和删除行或列,ws.insert和ws.delete,在第几行位置开始操作,插入或删除指定数目的行或列,不指明默认为1行或1列。
注意:序号从1开始计数,并且插入或删除并不会像在Excel中一样复制格式,真实操作方式是移动。
ws.insert_rows(第几行前插入,[插入几行]):
ws.insert_cols(第几列前插入,[插入几列]):
ws.delete_rows(从第几行开始,[删除几行]):
ws.delete_cols(从第几列开始,[删除几列]):
from openpyxl import load_workbook wb = load_workbook('inster.xlsx') ws = wb.active # 从第20行开始到第4行,每行前面插入4个空行。 for row in range(20, 3, -1): ws.insert_rows(row, 4) # 插入行ws.insert_rows(在当前行前面插入,插入4行) ws.delete_cols(2,3) # 删除列ws.delete.cols(从第2列开始,删除3列) wb.save('inserted.xlsx')
-
对单元格进行操作
# 选择Cell(B4)对象,并赋值,row参数为行,column参数为列,值为int类型数值 dirCell=active_sheet.cell(row=4,column=2) dirCell.value='找到这个单元格了' # 直接给A1、A2单元格赋值,获取本工作表的行列数 secondSheet['A1'].value='这个表的行数:'+str(secondSheet.max_row) secondSheet['A2'].value='这个表的列数:'+str(secondSheet.max_column) # 使用行号、列号方式获取指定单元格。这种方式行序号为1开始,列序号为0开始。 print(ws[1][0].value) #输出第1行第1列单元格的值, # 新建一个工作表还未保存的情况下,使用上面的“行号、列号”方式无法直接访问相应的单元格,应该使用wx.Cell()方法 # 官方文档解释:当在内存中创建工作表后,表中不包含任何单元格。单元格将在第一次访问时创建。 d = ws.cell(row=4, column=2, value=10) ws.cell(row=1,colnum=1,value='这里是A1单元格')
-
工作表行列转换:根据数字得到字母、根据字母得到数字
from openpyxl.utils import get_column_letter, column_index_from_string # 根据列的数字返回字母 print(get_column_letter(2)) # B # 根据字母返回列的数字 print(column_index_from_string('D')) # 4
-
使用Excel自带函数
from openpyxl import Workbook wb = Workbook() ws = wb.create_sheet('index', 0) ws['A1'] = 3 ws['A2'] = 4 ws['A3'] = '=sum(A1:A2)' wb.save('s.xlsx') 结果 A3 单元格处为 7 注意:获取函数的值时的坑(只能通过手动保存的方式来修改文件后才能获取到通过函数计算出来的值) from openpyxl import load_workbook wb = load_workbook('s.xlsx', data_only=True) # 注意获取函数计算出来的值时要加上data_only=True ws = wb['index'] print(ws['A3'].value) # 7 若不手动保存,则获取的是 =sum(A1:A2)
-
对Excel工作表单元格进行样式设置
# Font:字体字号颜色;PatternFill:单元格填充。
from openpyxl.styles import Font, PatternFill
def fail_style(cell):
bold_red = Font(bold=True, color='FF0000')
pink_fill = PatternFill('solid', fgColor='F2DCDB')
cell.font = bold_red
cell.fill = pink_fill
fail_style(ws['C']) # 将C列设置为fail_style样式