本文最后更新于:2024年2月1日 下午
使用python读取和处理excel数据,在数学建模绘图笔记
中有绘图的整理,这里主要记录代码处理的一些要点。
基本操作
补充: xls和xlsx
简单来说:
xls
是excel2003及以前版本所生成的文件格式
xlsx
是excel2007及以后版本所生成的文件格式
(excel 2007之后版本可以打开上述两种格式,但是excel2013只能打开xls格式)
需要导入的库
1 2
| import os import openpyxl
|
打开Excel文档,查看所有sheet表
使用openpyxl
模块打开Excel文档,并查看所有sheet表:
1.打开excel文档:
openpyxl.load_workbook()
接受文件名,返回一个workbook
数据类型的值。
- 这个workbook对象代表这个Excel文件,类似File对象代表一个打开的文本文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import os import openpyxl
path = r"C:\Users\cyr\Desktop" os.chdir(path)
workbook = openpyxl.load_workbook('test.xlsx')
print(workbook.sheetnames)
|
2.查看所有sheet表
2.1 通过sheet名称获取表格
1 2 3 4 5
| sheet = workbook['Sheet1'] # 获取指定sheet表 print(sheet)
# 结果: # <Worksheet "Sheet1">
|
2.2 使用 workbook.active
获取活动表
(1)活动表:当前正在操作
的工作表。
(2) sheet = workbook.active
3.获取表格尺寸
(1)表格的尺寸:excel表格中的数据有几行几列,针对的是不同的sheet而言
1 2 3 4 5 6 7 8 9 10 11 12
| import os import openpyxl
path = r"C:\Users\cyr\Desktop" os.chdir(path)
workbook = openpyxl.load_workbook('test.xlsx') sheet = workbook['Sheet1'] print(sheet.dimensions)
|
4. 获取单元格中的数据
方法一:指定坐标的方式
1 2 3 4 5 6 7
| cell1 = sheet['A1'] # 获取A1单元格的数据 cell2 = sheet['B7'] # 获取B7单元格的数据 # cell2 = sheet['B7'].value # 另一种写法
# cell1.value获取单元格A1中的值 # cell2.value获取单元格B7中的值 print(cell1.value,cell2.value)
|
方法二:指定行列的方式
1 2 3 4 5
| cell1 = sheet.cell(row=1,column=1) # 获取第1行第1列的数据 cell2 = sheet.cell(row=3,column=2) # 获取第3行第4的数据
print(cell1.value,cell2.value)
|
获取单元格的行、列、坐标
.row
获取某个格子的行数;
.columns
获取某个格子的列数;
.coordinate
获取某个格子的坐标;
1 2 3
| cell = sheet.cell(row=3, column=2) # 获取第3行第4列的数据
print(cell.value, cell.row, cell.column, cell.coordinate)
|
获取区间内的数据
获取单行单列数据的时候,使用一层for循环;
获取多行多列、指定区间的数据时,使用两层for循环
获取指定区间的数据
- step 1 : 使用
sheet['A1:A5']
拿到指定区间
- step 2 : 使用
两个for循环
拿到数据
- 为什么要使用两层循环:
外层循环迭代了从A1到A5的行(实际上只有一行);
而内层循环则迭代了这一行中的单个单元格,这样即可访问并打印每个单元格的值了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import os import openpyxl
path = r"C:\Users\cyr\Desktop" os.chdir(path)
workbook = openpyxl.load_workbook('test.xlsx') sheet = workbook.active print('当前活动表是:') print(sheet)
cell = sheet['A1:A5']
print(cell)
for i in cell: for j in i: print(j.value)
|
获取指定行列的数据
- sheet[“A”] — 获取A列的数据
- sheet[“A:C”] — 获取A,B,C三列的数据
- sheet[5] — 只获取第5行的数据
例如:
(1)获取一列数据:
1 2 3 4 5
| cell = sheet['2'] # 获取第2行的数据
#打印A1到A5的数据 for i in cell: print(i.value)
|
(2)获取两列数据:
1 2 3 4 5 6
| cell = sheet['A:B'] # 获取AB列的数据
#打印AB列数据 for i in cell: for j in i: print(j.value)
|
按行、列获取值
iter_rows()
:按行读取
iter_cols()
:按列读取
1 2 3 4 5 6 7 8 9 10 11
| print('按行获取值') for i in sheet.iter_rows(min_row=2, max_row=5, min_col=1, max_col=2): for j in i: print(j.value)
print('按列获取值') for i in sheet.iter_cols(min_row=2, max_row=5, min_col=1, max_col=2): for j in i: print(j.value)
|
获取活动表的行列数
1 2 3 4 5
| rows = sheet.max_row column = sheet.max_column
print(rows) print(column)
|
表格内容编辑
1.创建新的excel
1 2 3 4 5 6 7 8 9 10
| import os import openpyxl
path = r"C:\Users\cyr\Desktop" os.chdir(path)
workbook = openpyxl.Workbook() sheet = workbook.active sheet.title = '1号sheet' workbook.save('1.xlsx')
|
2.修改单元格、excel另存为
workbook.save('test.xlsx')
保存时如果使用原来的(第7行)名字,就直接保存;如果使用了别的名字,就会另存为一个新文件
- 修改单元格内容的两种写法:
sheet['B1'].value = 'age'
sheet['A1'] = 'name'
1 2 3 4 5 6 7 8 9 10 11
| import os import openpyxl
path = r"C:\Users\cyr\Desktop" os.chdir(path)
workbook = openpyxl.load_workbook('test.xlsx') sheet = workbook.active
sheet['A1'] = 'name' workbook.save('test.xlsx')
|
3.添加数据
3.1 添加有效数据
使用append()
方法,在原来数据的后面,按行插入数据
1 2 3 4 5 6 7 8
| data = [ ['素子',23], ['巴特',24], ['塔奇克马',2] ] for row in data: sheet.append(row) # 使用append插入数据 workbook.save('test.xlsx')
|
3.2 插入空行空列
insert_rows(idx=数字编号, amount=要插入的行数)
,插入的行数是在idx行数的下方
插入
insert_cols(idx=数字编号, amount=要插入的列数)
,插入的列数是在idx列数的左侧
插入
1 2 3
| sheet.insert_rows(idx=3, amount=2) sheet.insert_cols(idx=2, amount=1) workbook.save('test.xlsx')
|
4.删除行、列
delete_rows(idx=数字编号, amount=要删除的行数)
delete_cols(idx=数字编号, amount=要删除的列数)
1 2 3
| sheet.delete_rows(idx=10) # 删除第10行 sheet.delete_cols(idx=1, amount=2) # 删除第1列,及往右共2列 workbook.save('test.xlsx')
|
5.移动指定区间的单元格(move_range)
move_range(“数据区域”,rows=,cols=)
正整数为向下或向右、负整数为向左或向上
1 2
| sheet.move_range('D11:F12',rows=0,cols=-3) # 移动D11到F12构成的矩形格子 workbook.save('test.xlsx')
|
格式查看和修改
字母列号与数字列号之间的转换
核心代码:
1 2 3 4 5 6
| from openpyxl.utils import get_column_letter, column_index_from_string
print(get_column_letter(2))
print(column_index_from_string('D'))
|
字体样式
查看字体样式
- font = cell.font
font.name
, font.size
, font.bold
, font.italic
, font.color
1 2 3 4 5 6 7 8 9 10 11 12
| cell = sheet['A1'] font = cell.font print('当前单元格的字体样式是') print(font.name, font.size, font.bold, font.italic, font.color)
''' 当前活动表是:<Worksheet "1号sheet"> 当前单元格的字体样式是 等线 11.0 False False <openpyxl.styles.colors.Color object> Parameters: rgb=None, indexed=None, auto=None, theme=1, tint=0.0, type='theme' '''
|
修改字体样式
openpyxl.styles.Font(name=字体名称,size=字体大小,bold=是否加粗,italic=是否斜体,color=字体颜色)
- 其中,字体颜色中的color是RGB的16进制表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import os import openpyxl import openpyxl.styles
path = r"C:\Users\asuka\Desktop" os.chdir(path)
workbook = openpyxl.load_workbook('test.xlsx') sheet = workbook.active print(sheet)
cell = sheet['A1'] cell.font = openpyxl.styles.Font(name="微软雅黑", size=20, bold=True, italic=True, color="FF0000")
workbook.save('test.xlsx')
|
使用for循环,修改多行多列的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import os import openpyxl import openpyxl.styles
path = r"C:\Users\asuka\Desktop" os.chdir(path)
workbook = openpyxl.load_workbook('test.xlsx') sheet = workbook.active print(sheet)
cell = sheet['A'] for i in cell: i.font = openpyxl.styles.Font(name="微软雅黑", size=20, bold=True, italic=True, color="FF0000")
workbook.save('test.xlsx')
|
设置对齐格式
Alignment(horizontal=水平对齐模式,vertical=垂直对齐模式,text_rotation=旋转角度,wrap_text=是否自动换行)
- 水平对齐:‘distributed’,‘justify’,‘center’,‘left’, ‘centerContinuous’,’right,‘general’
- 垂直对齐:‘bottom’,‘distributed’,‘justify’,‘center’,‘top’
1 2 3 4
| cell = sheet['A1'] alignment = openpyxl.styles.Alignment(horizontal="center", vertical="center", text_rotation=0, wrap_text=True) cell.alignment = alignment
|
调用for循环实现多行多列操作
1 2 3 4 5 6
| cell = sheet['A'] alignment = openpyxl.styles.Alignment(horizontal="center", vertical="center", text_rotation=0, wrap_text=True) for i in cell: i.alignment = alignment workbook.save('test.xlsx')
|
设置行高列宽
教程看这里
设置所有单元格
(显示的结果是设置所有,有数据的单元格的)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| from openpyxl import load_workbook from openpyxl.utils import get_column_letter import os
os.chdir(r'C:\Users\asuka\Desktop')
workbook = load_workbook('1.xlsx') print(workbook.sheetnames) ws = workbook[workbook.sheetnames[0]]
width = 2.0 height = width * (2.2862 / 0.3612)
print("row:", ws.max_row, "column:", ws.max_column) for i in range(1, ws.max_row + 1): ws.row_dimensions[i].height = height for i in range(1, ws.max_column + 1): ws.column_dimensions[get_column_letter(i)].width = width
workbook.save('test.xlsx')
|
合并、拆分单元格
如果要合并的格子中有数据,即便python没有报错,Excel打开的时候也会报错。
- 方法一:
merge_cells(待合并的格子编号)
- 方法二:
merge_cells(start_row=起始行号,start_column=起始列号,end_row=结束行号,end_column=结束列号)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import os import openpyxl import openpyxl.styles
path = r"C:\Users\asuka\Desktop" os.chdir(path) # 修改工作路径
workbook = openpyxl.load_workbook('test.xlsx') # 返回一个workbook数据类型的值 sheet = workbook.active # 获取活动表 print('当前活动表是:' + str(sheet))
sheet.merge_cells('A12:B13')
sheet.merge_cells(start_row=12, start_column=3, end_row=13, end_column=4)
cell = sheet['A12'] alignment = openpyxl.styles.Alignment(horizontal="center", vertical="center", text_rotation=0, wrap_text=True) cell.alignment = alignment
cell = sheet['C12'] alignment = openpyxl.styles.Alignment(horizontal="center", vertical="center", text_rotation=0, wrap_text=True) cell.alignment = alignment
workbook.save('test.xlsx')
|
拆分单元格的方法同上
- 方法一:
unmerge_cells(待合并的格子编号)
- 方法二:
unmerge_cells(start_row=起始行号,start_column=起始列号,end_row=结束行号,end_column=结束列号)
xlsxwriter模块
xlsxwriter模块一般是和xlrd模块搭配使用的,
xlsxwriter
:负责写入数据,
xlrd
:负责读取数据。
worksheet.write_row('A1', headings)
添加表头
worksheet.write(行,列,数据)
写入数据
1 2 3
| data = ["苹果", 500, 8.9] for i in range(len(headings)): worksheet.write(1, i, data[i])
|
完整的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import xlsxwriter import os
path = r"C:\Users\cyr\Desktop" os.chdir(path)
workbook = xlsxwriter.Workbook("demo.xlsx")
worksheet = workbook.add_worksheet("2018年销售量")
headings = ['产品', '销量', "单价"] worksheet.write_row('A1', headings)
data = ["苹果", 500, 8.9] for i in range(len(headings)): worksheet.write(1, i, data[i])
workbook.close()
|