#openpyxl 中主要用到 3 个概念是 Workbook、Sheet 和 Cell。 Workbook 是一个 Excel 工作簿(Excel 文件); openpyxl不支持旧的.xls格式。 如果需要读取旧的.xls文件,可以使用'xlrd'库。 如果需要写入旧的.xls文件,可以使用'xlwt'库。 如果数据量特别大,可以使用'Pandas'库,但是不如ipenpyxl精细,表格/数据级别,面向结构化数据,更适用于数据清洗、分析、汇总、批量转换. Sheet 是工作簿中的一张表; Cell 是一个简单的单元格。 openpyxl 就是围绕着这 3 个概念进行操作的,不论读写,操作步骤都是打开 Workbook,定位 Sheet,操作 Cell。 openpyxl 中有 3 个不同层次的类,Workbook 是对工作簿的抽象,Worksheet 是对工作表的抽象,Cell 是对单元格的抽象。这 3 个类中每一个类都包含很多属性和方法。
import openpyxl 导入整个库
导入已有工作簿
wb_exist = openpyxl.load_workbook('122.xlsx')
使用openpyxl库的load_workbook方法打开已有的'122.xlsx'文件,并且定义
为wb_exist 变量
新建空白工作簿
wb_new = openpyxl.Workbook()
使用openpyxl库的Workbook 方法新建一个工作簿,并且定义为 wb-new变量
操作工作表
获取所有工作表 : sheetnames ,执行 print(wb_exist.sheetnames),
会打印一个 ['Sheet1', 'Sheet2', 'Sheet3']列表
获取活动工作表:sheet = workbook.active ,使用avtive方法
让workbook的工作簿目前活跃的工作表(sheet)页,作为活跃(操作)工作表,
并且把这个工作表作为sheet变量.
创建新工作表:workbook.create_sheet(title='新工作表名称')
删除工作表:del workbook['要删除的工作表名称'] / workbook.remove(workbook['要删除的工作表名称'])
获取或设置工作表的标题 ws = workbook.active # 先获取工作表 ws.title = "Data" # 然后设置标题
单元格读写 通过'A1'这种坐标方式进行读取和写入.
ASKDJ = sheet['A1']
ASKDJ.value = 'yanziyuan'
把sheet页的A1单元格作为ASKDJ变量, 然后使用value方法对这个变量赋值
为'yanziyuan', 可以使用print(ASKDJ.value) 打印出来
也可以 sheet['A1'].value = 'yanziyuan' 来完成,
用print(sheet['A1'].value) 来打印输出.
这样可以减少变量.同时也可以把"'A1'" 和"'yanziyuan'"作为变量,来引入其他修改功能.
通过行号列号写入.
sheet.cell(1, 1, 'Hello')
执行可以直接写入到sheet工作表的第一行,第一列单元格,但是不能使用(A,1),需要数字序号.
即cell(row, column, value)先行号,后列号(而非列标),再赋值.
#如A1 1为行号,A为列标.
print(sheet.cell(row=1, column=1).value)进行输出读取,
同样可以使用变量进行动态.
在表格末尾添加整行数据.
sheet.append(['A', 'B', 'C'])
此操作是用通用的append 来添加,即在sheet页中的第一个可用行开始按列表把 每一项填写在整行中. 如果使用[['A', 'B', 'C'],['A', 'B', 'C'],['A', 'B', 'C']]此类嵌套列表 进行区域填充,需要使用for循环来写入区域,不能直接写入.
# 读取第1行到第5行,第1列到第3列的单元格值,输出为元组(使用 iter_rows() 或 iter_cols() 是处理大量数据的最佳实践)
for row in sheet.iter_rows(min_row=1, max_row=5, min_col=1, max_col=3, values_only=True):
print(row)
# 输出示例: ('值A1', '值B1', '值C1')
# 从第2行开始,A列10 B列值为20,C列值为30
new_data = [('A', 10), ('B', 20), ('C', 30)]
for row_index, (col1_val, col2_val) in enumerate(new_data, start=2): #第二行开始
sheet.cell(row=row_index, column=1, value=col1_val)
sheet.cell(row=row_index, column=2, value=col2_val)
# 遍历所有行
for row in sheet.iter_rows(values_only=True):
print(row)
# 遍历特定范围
for row in sheet.iter_rows(min_row=2, max_row=10, min_col=1, max_col=5, values_only=True):
print(row)
# 必须保存修改才会生效
wb.save('filename.xlsx')
# 保存为新文件
wb.save('new_filename.xlsx')
# 获取最大行和列
max_row = sheet.max_row
max_column = sheet.max_column
print(f"工作表尺寸: {max_row}行 × {max_column}列")
# 获取当前活动工作表
active_sheet = wb.active
# 选择特定工作表
specific_sheet = wb['Sheet1']
# 检查工作表是否存在
if 'Sheet1' in wb.sheetnames:
print("Sheet1 exists")
# 复制工作表
source = wb['Sheet1']
target = wb.copy_worksheet(source)
# 对于大文件,使用只读模式
wb = openpyxl.load_workbook('非常大的文件.xlsx', read_only=True)
# 对于只写操作,使用只写模式
wb = openpyxl.load_workbook('large_file.xlsx', write_only=True)
#公式处理:读取计算结果,用load_workbook读取包含公式的单元格时,默认读到的是公式本身(如=SUM(A1:A10))。如果想直接拿到计算结果,需要加上data_only=True参数
wb = openpyxl.load_workbook('包含公式的文件.xlsx', data_only=True)
如果这个Excel文件从未被Excel应用程序打开并计算过,用此方式读取到的结果可能是None
#调整行高与列宽
ws.row_dimensions[1].height = 30 # 设置第1行的行高
ws.column_dimensions['A'].width = 20 # 设置A列的列宽
#单元格格式与保护
cell.number_format = '0.00%' # 设置为百分比格式,保留两位小数
ws.protection.sheet = True # 启用工作表保护
ws.protection.password = '你的密码' # 设置密码(可选)
# 设置字体和样式
from openpyxl.styles import Font, Alignment
cell = sheet['A1']
cell.font = Font(bold=True, size=12)
cell.alignment = Alignment(horizontal='center')
# 错误处理
try:
wb = openpyxl.load_workbook('file.xlsx')
except FileNotFoundError:
print("文件不存在")
except Exception as e:
print(f"读取文件时出错: {e}")
评论(0)
暂无评论