hand
_1_5_18
4
返回栏目
1k
9k
1k
1k
5k
1k
1k
1k
1k
3k
2k
1k
0.8k
2k
3k
1k
1k
0.7k
0.9k
1k
0.6k
0.4k
0.4k
0.3k
3k
2k
9k
0.4k
0.4k
0.8k
0.5k
3k
5k
1k
2k
2k
3k
5k
1k
1k
0.4k
0.5k
0.4k
0.6k
0.7k
1k
0.4k
0.3k
4k
0.5k
0k
0.3k
0k
0.2k
0.2k
0.3k
0.9k
0.9k
0.1k
0.9k
0.9k
1k
0.5k
6k
0.3k
0.4k
0.7k
0.6k
8k
3k
1k
1k
1k
1k
0k
2k
1k
1k
0.2k
5k
4k
5k
0.4k
0.8k
1k
1k
1k
0.1k
2k
1k
2k
6k
0k
2k
7k
1k
5k
2k
3k
1k
0k
1k
0.9k
0.4k
0.2k
1k
3k
4k
1k
1k
1k
2k
3k
0.7k
0.3k
0.5k
0.6k
1k
0.9k
3k
0.3k
4k
返回python栏目
作者:
贺及楼
成为作者
更新日期:2024-10-28 10:03:09
作用:操作Excel文档
Python 的 openpyxl
库用于读写 Excel 2010 及以上版本的 xlsx/xlsm/xltx/xltm 文件。它提供了创建工作簿、读取单元格数据、修改样式、添加公式和图表等功能。openpyxl
支持对工作表的高级操作,包括设置数据验证、筛选、冻结窗格等。这个库在处理Excel数据、生成报告和数据分析时非常有用,是Excel自动化和数据处理的强大工具。
pip install openpyxl
包 | 包中文名 | 释义 | 跳转 |
---|---|---|---|
openpyxl | / | 主包 | / |
└── et-xmlfile | / | et-xmlfile 是一个 Python 库,用于读写 Excel 2007 xlsx/xlsm/xltx/xltm 文件,与 openpyxl 库配合使用。 | / |
# 方式一:创建
from openpyxl import Workbook
wb = Workbook() # 实例化
ws = wb.active # 激活 worksheet
# 方式二:打开已有
from openpyxl import load_workbook
wb2 = load_workbook("文件名称.xlsx")
# 方式一:插入到最后(default)
ws1 = wb.create_sheet("Mysheet")
# 方式二:插入到最开始的位置
ws2 = wb.create_sheet("Mysheet", 0)
# sheet 名称可以作为 key 进行索引
ws3 = wb["New Title"]
ws4 = wb.get_sheet_by_name("New Title")
>>> ws is ws3 is ws4
True
# 方式一:数据可以直接分配到单元格中(可以输入公式)
ws["A1"] = 42
# 方式二:可以附加行,从第一列开始附加(从最下方空白处,最左开始)(可以输入多行)
ws.append([1, 2, 3])
# 方式三:Python 类型会被自动转换
ws["A3"] = datetime.datetime.now().strftime("\%Y-\%m-\%d")
print(wb.sheetnames) # 显示所有表名
["Sheet2", "New Title", "Sheet1"]
for sheet in wb: # 遍历所有表
print(sheet.title)
print(sheet.max_row) # 获得最大行,int类型
print(str(sheet.max_row)) # 获得最大行,string类型
print(sheet.max_column) # 获得最大列,int类型
print(str(sheet.max_column)) # 获得最大列,string类型
1、单一单元格访问
# 方法一
>>> c = ws["A4"]
# 方法二:row 行;column 列
>>> d = ws.cell(row=4, column=2, value=10)
# 方法三:只要访问就创建
>>> for i in range(1,101):
... for j in range(1,101):
... ws.cell(row=i, column=j)
2、多单元格访问
# 通过切片
>>> cell_range = ws["A1":"C2"]
# 通过行(列)
>>> colC = ws["C"]
>>> col_range = ws["C:D"]
>>> row10 = ws[10]
>>> row_range = ws[5:10]
# 通过指定范围(行 → 行)
>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
... for cell in row:
... print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.B1>
<Cell Sheet1.C1>
<Cell Sheet1.A2>
<Cell Sheet1.B2>
<Cell Sheet1.C2>
# 通过指定范围(列 → 列)
>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
... for cell in row:
... print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.B1>
<Cell Sheet1.C1>
<Cell Sheet1.A2>
<Cell Sheet1.B2>
<Cell Sheet1.C2>
# 遍历所有 方法一
>>> ws = wb.active
>>> ws["C9"] = "hello world"
>>> tuple(ws.rows)
((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
(<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
...
(<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
(<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))
# 遍历所有 方法二
>>> tuple(ws.columns)
((<Cell Sheet.A1>,
<Cell Sheet.A2>,
<Cell Sheet.A3>,
...
<Cell Sheet.B7>,
<Cell Sheet.B8>,
<Cell Sheet.B9>),
(<Cell Sheet.C1>,
...
<Cell Sheet.C8>,
<Cell Sheet.C9>))
ws.insert_rows(index,amount) # 插入行
ws.insert_cols(index,amount) # 插入列
# index:起始行
# amount:插入行数
ws.delete_rows(index,amount) # 删除行
ws.delete_cols(index,amount) # 删除列
# index:起始行/列
# amount:删除行/列数
ws.move_range(cell_range,rows,cols,translate)
ws.move_range("A2:B2", rows=-1, cols=1, True)
# 移动单元格内容位置(如果目的地有内容会覆盖):
# rows:大于0,向下移动,小于0向上移动
# cols:大于0,向右移动,小于0向左移动;
# translate:最后一个是bool值,确定是否包含公式
ws.freeze_panes = "B1" # 冻结第一列
ws.freeze_panes = "A2" # 冻结第一行
ws.freeze_panes = "B2" # 同时冻结第一行和第一列
# 冻结单元格所设置的参数为一个单元格,这个单元格上侧和左侧的所有行 / 列会被冻结
wb.save("文件名称.xlsx")
data是pandas的dataFrame
from openpyxl.utils.dataframe import dataframe_to_rows
# 类有self
def wbadd(self, table, data):
for row in dataframe_to_rows(data, index=False, header=True):
table.append(row)
return
1、改变 sheet 标签按钮颜色
ws.sheet_properties.tabColor = "1072BA"
2、获取每一行,每一列
sheet.rows为生成器, 里面是每一行的数据,每一行又由一个tuple包裹。
sheet.columns类似,不过里面是每个tuple是每一列的单元格。
# 因为按行,所以返回A1, B1, C1这样的顺序
for row in sheet.rows:
for cell in row:
print(cell.value)
# A1, A2, A3这样的顺序
for column in sheet.columns:
for cell in column:
print(cell.value)
3、根据数字得到字母,根据字母得到数字
from openpyxl.utils import get_column_letter, column_index_from_string
# 根据列的数字返回字母
print(get_column_letter(2)) # B
# 根据字母返回列的数字
print(column_index_from_string("D")) # 4
4、 删除工作表
# 方式一
wb.remove(sheet)
# 方式二
del wb[sheet]
5、矩阵置换(行 → 列)
rows = [
["Number", "data1", "data2"],
[2, 40, 30],
[3, 40, 25],
[4, 50, 30],
[5, 30, 10],
[6, 25, 5],
[7, 50, 10]]
list(zip(*rows))
# out
[("Number", 2, 3, 4, 5, 6, 7),
("data1", 40, 40, 50, 30, 25, 50),
("data2", 30, 25, 30, 10, 5, 10)]
# 注意 方法会舍弃缺少数据的列(行)
rows = [
["Number", "data1", "data2"],
[2, 40 ], # 这里少一个数据
[3, 40, 25],
[4, 50, 30],
[5, 30, 10],
[6, 25, 5],
[7, 50, 10],
]
# out
[("Number", 2, 3, 4, 5, 6, 7), ("data1", 40, 40, 50, 30, 25, 50)]
1、需要导入的类
from openpyxl.styles import Font, colors, Alignment
2、字体
下面的代码指定了等线24号,加粗斜体,字体颜色红色。直接使用cell的font属性,将Font对象赋值给它。
bold_itatic_24_font = Font(name="等线", size=24, italic=True, color=colors.RED, bold=True)
sheet["A1"].font = bold_itatic_24_font
3、 对齐方式
也是直接使用cell的属性aligment,这里指定垂直居中和水平居中。除了center,还可以使用right、left等等参数。
# 设置B1中的数据垂直居中和水平居中
sheet["B1"].alignment = Alignment(horizontal="center", vertical="center", wrapText=True)
# horizontal 水平。参数:
# "general", "distributed", "left","justify", "right", "fill", "center", "centerContinuous"
# 常规、分布式、左、对齐、右、填充、中心、中心连续
# vertical 垂直
# "distributed", "center", "bottom", "top", "justify"
# 分布式、中心、下、上、对齐
# wrapText 自动换行
4、设置行高和列宽
# 第2行行高
sheet.row_dimensions[2].height = 40
# C列列宽
sheet.column_dimensions["C"].width = 30
中文字数 | 取值 |
---|---|
3 | 10 |
4 | 10 |
5 | 12 |
6 | 16 |
7 | 16 |
8 | 24 |
9 | 24 |
10 | 24 |
11 | 26 |
12 | 28 |
5、 合并和拆分单元格
所谓合并单元格,即以合并区域的左上角的那个单元格为基准,覆盖其他单元格使之称为一个大的单元格。
相反,拆分单元格后将这个大单元格的值返回到原来的左上角位置。
# 合并单元格, 往左上角写入数据即可
sheet.merge_cells("B1:G1") # 合并一行中的几个单元格
sheet.merge_cells("A1:C3") # 合并一个矩形区域中的单元格
合并后只可以往左上角写入数据,也就是区间中:左边的坐标。
如果这些要合并的单元格都有数据,只会保留左上角的数据,其他则丢弃。换句话说若合并前不是在左上角写入数据,合并后单元格中不会有数据。
以下是拆分单元格的代码。拆分后,值回到A1位置。
sheet.unmerge_cells("A1:C3")
python
整章节共122节
快分享给你的小伙伴吧 ~