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')

 

posted @ 2019-03-21 16:42  AKA绒滑服贵  阅读(1265)  评论(0编辑  收藏  举报