在Python对Excel文件进行处理常用模块有xlrd、xlwt、openpyxl,其中xlrd主要用于读取Excel文件,xlwt用于向Excel中写入数据,openpyxl既能读取Excel文件也能向其中写入数据。openpyxl是一个用于读取/写入Excel 2010 xlsx、xlsm、xltm、xltx文件的库。
openpyxl中有几个基本概念,其中workbook表示整个Excel工作表对象,Worksheet表示Excel表格中的一张表对象,Cell表示单元格对象。
(1)加载Excel文件,获取workbook对象
import openpyxl
workbook = openpyxl.load_workbook('./test.xlsx')
print(workbook)
# <openpyxl.workbook.workbook.Workbook object at 0x000001768C808978>
(2)获取worksheet对象
# 读取工作表中所有的sheet, 返回一个list
sheets = wb.sheetnames
print(sheets)
# ['Sheet1', 'Sheet2', 'Sheet3']
# 获取某个sheet, 返回Worksheet对象
sheet = wb[sheets[0]]
print(sheet)
# <Worksheet "Sheet1">
(3)访问Cell对象
"""
访问单个cell:
Worksheet.cell(row, column), 如Worksheet.cell(1, 1)
Worksheet[position], 获取指定位置的cell, 如Worksheet['A3']
访问多个cell,使用切片:
Worksheet[num], 获取第num行的cell, 如Worksheet[1]
Worksheet[num1:num2], 获取第num1到num2行的所有cell, Worksheet[1:3]
Worksheet['pos1':'pos2'], 获取从pos1到pos2之间的所有cell, Worksheet['A1': 'D4']
获取cell的值:
获取指定位置单元格的值, Worksheet['position'].value
获取指定位置单元格的值, Worksheet.cell(row, column, value).value
row: 指定行
colum: 指定列
value: 默认为None, 单元值为空时的返回值
获取sheet所有的值:
sheet.values
"""
# 获取单个cell
cell = sheet.cell(3, 4)
print("cell:", cell)
# cell: <Cell 'Sheet1'.D3>
cell = sheet['d4']
print("cell", cell)
# cell: <Cell 'Sheet1'.D4>
# 获取多个cell A1-D4 区间内所有cell, 返回值是一个元组
cell = sheet['A1': 'D4']
print("cell:", cell)
# 获取B1 B2 B3 B4 四个单元格的cell, 返回值也是元组
cell = sheet['B1:B4']
print("cell:", cell)
# 获取1-3行的cell, 返回值也是元组
cell = sheet[1:3]
print("cell:", cell)
# 获取指定行的cell, 返回值也是元组
cell = sheet[1]
print("cell:", cell)
# 以行方式访问指定行到指定列之间所有的cell
for col in sheet.iter_rows(min_row=1, min_col=2, max_col=3, max_row=3):
for cell in col:
print(cell)
# 以列方式访问指定行到指定列之间所有的cell
for col in sheet.iter_cols(min_row=1, min_col=2, max_col=3, max_row=3):
for cell in col:
print(cell)
# 获取所有行的cell,Worksheet.rows, 它是一个可迭代对象, 需要转换为tuple再进行访问
rows = sheet.rows
print(tuple(rows))
# 以列方式获取所有cell, Worksheet.columns, 它是一个可迭代对象, 需要转换为tuple再进行访问
cols = sheet.columns
print(tuple(rows))
# 获取指定位置单元格的值
data = sheet['A4'].value
print('data:', data)
# data: assd
# 获取所有值, 返回值是一个元组
data = tuple(sheet.values)
print("sheet的所有值为:", data)
(4)获取sheet的最大/小行数与列数
# sheet.max_row, 最大行数
data = sheet.max_row
print('当前sheet的最大行数为:{}'.format(data))
# sheet.min_row,最小行数
data = sheet.min_row
print('当前sheet的最小行数为:{}'.format(data))
# sheet.max_column,最大列数
data = sheet.max_column
print('当前sheet的最大列数为:{}'.format(data))
# sheet.min_column,最小列数
data = sheet.min_column
print('当前sheet的最小列数为:{}'.format(data))
(5)向Excel文件中写入数据
# 获取当前正在活动的sheet
sheet = workbook.active
# 向指定的cell赋值
sheet.cell(row, column, value)
# 保存excel文件到指定路径,不传值则默认覆盖原文件
workbook.save(filename=path)
注意:在向Excel文件写数据时,应该关闭Excel文件以避免报错
# -*- coding: utf-8 -*-
# description: 封装对excel文件的操作
import openpyxl
class ExcelTool:
"""
封装一个处理excel文件的工具类
"""
def __init__(self, path):
"""
加载文件, 创建一个workbook对象
:param path, excel文件路径
"""
self.workbook = openpyxl.load_workbook(path)
self.worksheet = None
def get_sheet(self, var):
"""
通过索引或者名字获取sheet
:param var: 索引or名字
:return: sheet
"""
if isinstance(var, int):
self.worksheet = self.workbook[self.workbook.sheetnames[var]]
return self.worksheet
if isinstance(var, str):
self.worksheet = self.workbook[var]
return self.worksheet
def get_cell_value(self, row, col):
"""
获取cell的值
:param row: cell所在行
:param col: cell所在列
:return: cell的值
"""
try:
return self.worksheet.cell(row=row, column=col).value
except BaseException as e:
return None
def get_max_row(self):
"""
获取最大行数
:return: 最大行数
"""
return self.worksheet.max_row
def get_min_row(self):
"""
获取最小行数
:return: 最小行数
"""
return self.worksheet.min_row
def get_max_col(self):
"""
获取最大列数
:return: 最大列数
"""
return self.worksheet.max_column
def get_min_col(self):
"""
获取最小列数
:return: 最小列数
"""
return self.worksheet.min_column
def get_all_value(self):
"""
获取所有数据
:return:
"""
return tuple(self.worksheet.values)
def get_row_data(self, row):
"""
获取指定行的所有数据
:param row: 指定行
:return: 所有行数据组成的列表
"""
return list(self.get_all_value()[row])
def get_col_data(self, col):
"""
获取指定列的所有数据
:param col: 指定列, 如'A'
:return: 所有列数据组成的列表
"""
col_data_list = []
for i in self.worksheet[col]:
col_data_list.append(i.value)
return col_data_list
def write_data(self, row, col, value, path):
"""
写入数据
:param row: 指定cell所在行
:param col: 指定cell所在列
:param value: cell的值
:param path: 保存文件路径
"""
try:
self.worksheet = self.workbook.active
self.worksheet.cell(column=col, row=row, value=value)
self.workbook.save(path)
except BaseException as e:
print(e)
return None
if __name__ == '__main__':
path = './test_case.xlsx'
workbook = ExcelTool(path)
workbook.get_sheet(1)
print(workbook.get_sheet(1))
# >>> <Worksheet "Sheet2">
# 获取指定sheet
workbook.get_sheet('Sheet1')
print(workbook.get_sheet('Sheet1'))
# >>> <Worksheet "Sheet1">
# 获取指定cell的值
data = workbook.get_cell_value(1, 3)
print("data:", data)
# 获取当前sheet某一行、列的数据
data = workbook.get_row_data(2)
print('第2行的数据为:', data)
data = workbook.get_col_data('C')
print('第c列的数据为:', data)
# 写入数据
workbook.write_data(11, 2, 'excel dispose', path)