Loading

Python操作Excel神器-openpyxl之读取

#openpyxl只能处理xlsx格式的excel文件
import openpyxl

#打开已存在的excel,返回文件对象
#如果excel文件不存在,那么会FileNotFoundError
wb = openpyxl.load_workbook('西柚.xlsx')    

# 打印表单信息,返回一个表单列表
print(f'这是一个表单列表:{wb.sheetnames},类型为:{type(wb.sheetnames)}')
print(f'也可以用表单对象.title()获取表单的名字:{wb.sheetnames[0].title()}')
for index, sheet in enumerate(wb.sheetnames, start=1):
    print(f'这是第{index}个表单, 表单名为:{sheet}')

# 新建表单
print(f'这是新建表单前的表单列表{wb.sheetnames}')
newSheet = wb.create_sheet('newSheet', 1) #index为指定新建表单的位置
print(f'这是新建表单后的表单列表{wb.sheetnames}')

# 根据表单名字获取表单对象
# 官方推荐使用方式二
# 1.方式一
# Sheet1 = wb.get_sheet_by_name('Sheet1')
# 2.方式二
Sheet2 = wb['Sheet2']

# 获取当前活跃的表单对象
active_sheet = wb.active
print(f'当前活跃的表单为:{active_sheet}')

# 获取当前表单中最大行数以及最大列数
print(f'表单最大行数为:{active_sheet.max_row}')
print(f'表单最大列数为:{active_sheet.max_column}')


# 获取单元格对象及其相关属性
# 获取单元格对象方式一 / 单元格对象 = 表单对象['单元格坐标']
cell1 = active_sheet['A1']
# 获取单元格对象方式二 / 单元格对象 = 表单对象.cell(row = x, column = j)
cell2 = active_sheet.cell(row=2, column=1)

print(f'使用方式一获取的单元格对象为:{cell1}')
print(f'使用方式二获取的单元格对象为:{cell2}')
print(f'当前获取的单元格内容为:{cell1.value}')  # 单元格内容 = 单元格对象.value
print(f'当前获取的单元格行数为:{cell1.row}')  # 单元格行数 = 单元格对象.row
print(f'当前获取的单元格列数为:{cell1.column}')  # 单元格列数 = 单元格对象.column
print(f'当前获取的单元格坐标为:{cell1.coordinate}')  # 单元格坐标 = 单元格对象.coordinate

# 获取列对象
colC = active_sheet['C']
print(f'获取C列的列对象:{colC},返回的类型为:{type(colC)}')
print(f'通过列对象获取C列的某一个单元格对象:{colC[2]}')  # 注意,这里的2其实是元祖的下标索引为2的值,所以取得是C列第三行单元格对象。
print(f'获取范围列对象:{active_sheet["B:C"]}') #返回元祖,元祖每个元素均为元祖,值为列对象
print(f'获取当前表单所有列对象:{tuple(active_sheet.columns)}') #获取当前表单所有的列对象。元祖嵌套元祖

# for cols in active_sheet.iter_cols(min_col=1,min_row=1,max_col=10,max_row=10,values_only=True):
#     #values_only参数默认是False,那么此时会的单的是单元格的对象,如果设置为True,那么获得的是单元格的值。即cell.value
#     #如果遍历的单元格无数据的话,则会返回None
#     #每次遍历会返回一个元祖
#     print(cols)
#     for i in cols:
#         print(i)

# 获取行对象
row1 = active_sheet[1]
print(f'获取第一行的行对象:{row1},返回的类型为:{type(row1)}')  # 同上,返回元祖
print(f'通过行对象获取第一行的某一个单元格对象:{row1[2]}')  # 注意,这里的2其实是元祖的下标索引为2的值,所以取得是第三列第一行的单元格对象。
print(f'获取范围行对象:{active_sheet[2:4]}') #返回元祖,元祖每个元素均为元祖,值为行对象
print(f'获取当前表单所有行对象:{tuple(active_sheet.rows)}') #获取当前表单所有的行对象。元祖嵌套元祖

# for rows in active_sheet.iter_rows(min_col=1,min_row=1,max_col=10,max_row=10,values_only=True):
#     #values_only参数默认是False,那么此时会的单的是单元格的对象,如果设置为True,那么获得的是单元格的值。即cell.value
#     #如果遍历的单元格无数据的话,则会返回None
#     #每次遍历会返回一个元祖
#     print(rows)
#     for i in rows:
#         print(i)

#获取指定范围坐标的单元格对象
cell_range = active_sheet['A1:B3']  # 这里的坐标可以理解为平行四边形的左上角坐标:右下角坐标,返回得平行四边形内的所有行对象
print(cell_range)
for row_Obj in cell_range:
    print(f'现在打印的行对象为:{row_Obj}')
    for cellObj in row_Obj:
        print(f'这是该单元格的坐标:{cellObj.coordinate},\t这是该单元格的内容:{cellObj.value}')


#拓展:当列数非常多时,使用字母去对应列数就比较困难,比如说第900列,他所对应的列字母为‘AAH’,那么这时需要一个小操作。
from openpyxl.utils import column_index_from_string,get_column_letter
print(get_column_letter(900),column_index_from_string('AHQ'))

# 在读取数据时,除了excel中的整型、小数、True、False,分别读取出来为int、float、boolean外,
# 其他的数据都为字符串类型
posted @ 2020-04-18 14:23  x1you  阅读(674)  评论(0编辑  收藏  举报