openpyxl
openpyxl
xlrd/xlwt操作03版本之前的Excel文件,openpyxl操作03版本之后的Excel文件。
安装
方式一
在pycharm下面的命令行中输入如下代码:
pip install openpyxl
方式二
在Pycharm的File→Settings...→Project:xxoo→Project Interperter中的
中右上角的+或者双击列表框中的任何一个库名都可以,弹出如下框:
选中openpyxl,然后点击左下角的Install Package按钮即可安装。
注意
如果excel里面有图片(jpeg,png,bmp。。。),需要安装图片处理模块pillow模块。
pip install pillow
使用
在使用之前需要先导入模块openpyxl
from openpyxl import Workbook
写
在写之前需要先初始化,也就是先实例化一个对象。
wb = Workbook()
创建一个新的工作簿
ws1 = wb.create_sheet('Mysheet1') # 默认是最后一个 ws2 = wb.create_sheet('Mysheet2', 0) # 第一个
创建完成以后,还需要保存下文件。
wb.save('write.xlsx') # write.xlsx为文件名加文件后缀名
读
获取单元格数据
在进行工作簿数据读取之前,先进行模块导入
from openpyxl import load_workbook
然后进行实例化,插入需要读取的表格文件的文件名。打开的文件,默认的是read_only=False,即可读可写,若有需要,可以指定read_only为True,即只读模式。
wb = load_workbook(filename='write.xlsx') # write.xlsx是Excel文件名。
最后选中目标工作簿,进行取值。其中,new_name为工作簿的名字。
sheet = wb['new_name'] print(sheet['B1'].value)
当目标单元格内填充的为公式时,需要指定data_only=True,这样返回的就是数字,如果不加这个参数,则读取到的是公式本身。
获取工作簿名称
获取所有工作簿名称
wb.sheetnames
获取单个工作簿名称
for i in sheet in wb: print(sheet)
获取工作簿
直接获取名称为new_name的工作簿。
wb['new_name']
获取行
获取最大行数
sheet.max_row
获取每一行的值
sheet.rows为生成器,里面是每一行的数据,每一行又由一个tuple包裹。
for row in sheet.rows: for cell in row: print(cell.value)
因为是按行,所以返回值的顺序为A1、B1、C1。
获取列
获取最大列数
sheet.max_column
获取每一列的值
与sheet.rows类似,不过这里的每一个元组是每一列的单元格的值。
for column in sheet.columns: for cell in column: print(cell.value)
因为按列,所以输出结果的顺序为A1、A2、A3。
获取任意单元格的值
使用索引获取单个单元格的值
上面的代码是获取所有的单元格的数据,如果要获得某行的数据,给其一个索引就行了,因为sheet.rows与sheet.columns是生成器类型的,不能使用索引,转换成list之后在使用索引,list(sheet.rows)[2]这样就可以获取到第三行或者列的tuple对象。
for cell in list(sheet.rows)[2]: print(cell.value)
获取任意区间的单元格
可以使用range函数,上面的写法,获得了以A1为左上角,B3为右下角矩形区域的所有的单元格、需要注意的是,range从1开始的,因为在openpyxl中为了和Excel中的表达方式一致,并不和编程语言的习惯以0表示第一个值。
for i in range(1, 4): for j in range(1, 3): print(sheet.cell(row=i, column=j).value)
还可以使用切片的方式。sheet['A1', 'B2']返回一个元组,该元组内部还是元组,由每一行的单元格构成一个元组。
for row_cell in sheet['A1': 'B3']: for cell in row_cell: print(cell)
改
修改工作簿的名字
ws1 = wb.create_sheet('Mysheet1') ws1.title = 'new_name' print(wb.sheetnames) # 打印所有的工作簿的名字,以列表的形式展现 wb.save('write.xlsx')
修改或设置指定单元格的内容
方式一
设置A4出的单元格的内容,如果需要修改的单元格不存在,则创建该单元格,然后将值写入。
ws1['A4'] = 4 wb.save('write.xlsx')
方式二
通过cell来进行写入,通过行数和列数找到单元格,通过value进行赋值。
ws1.cell(row=4, column=2, value=10) wb.save('write.xlsx')
append函数
可以一次添加多行数据,从第一行空白行开始(下面所有的都是空白行)写入。
将row中的值分别写入到第一行的单元格中。其中row的值的类型必须是列表、元组、一个范围(range)、生成器。
row = [1, 2, 3, 4, 5] ws1.append(row) wb.save('write.xlsx')
设置单元格风格
在设置之前需要先导入模块
from openpyxl.styles import Font, colors, Alignment # 字体、颜色、对齐方式
设置字体样式
bold_italic_24_font = Font(name='等线', size=24, italic=True, color=colors.RED, bold=True) sheet['A1'].font = bold_italic_24_font
设置对其方式
居中方式
直接使用属性aligment,这里指定垂直居中和左右居中。除了center,还可以使用right、left等等参数。
sheet['B1'].aligment = Alignment(horizontal='center', vertical='center')
行高
sheet.row_dimensions[2].height = 40 # 第二行行高
列宽
sheet.column_dimensions['C'].width = 30 # C列列宽
合并和拆分单元格
合并单元格
以合并区域的右上角的那个单元格为基准,覆盖其他单元格,称之为一个大单元格。
合并单元格,往左上角单元格写入数据。如果这些单元格都有数据,则只保存左上角的单元格的数据。
合并一行中的单元格
sheet.merge_cells('B1:G1') # 合并一行中的单元格
合并矩形区域的单元格
sheet.merge_cells('A1:C3')
拆分单元格
将一个大单元格拆分为几个小单元格。拆分完成后,大单元格中的值回到A1的位置。
sheet.unmerge_cells('A1:C3')