1. 文件
1.1. 打开文件
import openpyxl
wb2 = openpyxl.load_workbook('文件名称.xlsx')
1.2. 创建文件
from openpyxl import Workbook
# 实例化
wb = Workbook()
# 激活 worksheet
sheet = wb.active
1.3. 保存文件
wb.save('文件名称.xlsx')
2. 表
2.1. 创建表(sheet)
# 方式一:插入到最后(default)
sheet1 = wb.create_sheet("Mysheet")
# 方式二:插入到最开始的位置
sheet2 = wb.create_sheet("Mysheet", 0)
2.2. 选择表(sheet)
# sheet 名称可以作为 key 进行索引
sheet3 = wb["New Title"]
# 旧版本
sheet4 = wb.get_sheet_by_name("New Title")
2.3. 删除表(sheet)
# 方式一
wb.remove(sheet)
# 方式二
del wb[sheet]
2.4. 查看表名(sheet)
print(wb.sheetnames)
# ['Sheet2', 'New Title', 'Sheet1']
2.5. 修改表名(sheet)
sheet = wb.active # 当前sheet
sheet.title = 'New Title'
2.6. 复制表(sheet)
from copy import copy
def copy_data_to_sheet(old_sht, new_sht):
'''sheet间复制数据,带格式'''
for i in range(1, old_sht.max_row+1): # 最大行+1
for j in range(1, old_sht.max_column+1): # 最大列+1
src_cell = old_sht.cell(i,j)
# getattr(ws.cell(row=m, column=c), "value" )
new_sht.cell(row=i, column=j).value=src_cell.value
if src_cell.has_style: #拷贝格式
new_sht.cell(row=i, column=j).font = copy(src_cell.font)
new_sht.cell(row=i, column=j).border = copy(src_cell.border)
new_sht.cell(row=i, column=j).fill = copy(src_cell.fill)
new_sht.cell(row=i, column=j).number_format = copy(src_cell.number_format)
new_sht.cell(row=i, column=j).protection = copy(src_cell.protection)
new_sht.cell(row=i, column=j).alignment = copy(src_cell.alignment)
2.7. 行列相关(sheet)
行列索引从 1 开始,不是 0
# 获得最大列和最大行
print(sheet.max_row)
print(sheet.max_column)
# 删除行和列
ws.delete_cols(6, 3) # 从第六列(F列)开始,删除3列即(F:H)
ws.delete_rows(3) # 删除第三行
wk_sheet.delete_rows(3,2) #删除从第一行开始算的2行内容
wk_sheet.delete_cols(1,2) #删除从第一列开始算的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)
# 添加行
sheet.append(['TIME', 'TITLE', 'A-Z'])
2.8. 其他(sheet)
# 改变 sheet 标签按钮颜色
sheet.sheet_properties.tabColor = "1072BA"
3. 单元格(cell)
- 判断单元格是否为空
#if str(sheet.cell(1,1).value).strip() in [None, '']:
if not sheet.cell(1,1).value:
print('Null')
else:
print(str(sheet.cell(1,1).value).strip())
3.1. 单元格访问与赋值
#方法一
c = sheet['A4'].value
#方法二:row 行;column 列
sheet.cell(row=4, column=2).value = 'value'
value = sheet.cell(row=4, column=2).value
sheet.cell(row=4, column=2, value=10)
wk_sheet.cell(2,2,value='大区')
wk_sheet.cell(2,3,value='小区')
wk_sheet.cell(2,4,value='店铺编码')
wk_sheet.cell(2,5,value='店铺名称')
#只要访问就创建
3.2. 多单元格访问
# 通过切片
>>> cell_range = sheet['A1':'C2']
# 通过行(列)
>>> colC = sheet['C']
>>> col_range = sheet['C:D']
>>> row10 = sheet[10]
>>> row_range = sheet[5:10]
# 通过指定范围(行 → 行)
>>> for row in sheet.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 sheet.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>
# 遍历所有 方法一
>>> sheet = wb.active
>>> sheet['C9'] = 'hello world'
>>> tuple(sheet.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(sheet.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>))
3.3. 单元格格式
(待整理......)
3.4. 单元格合并与拆分
- 所谓合并单元格,即以合并区域的左上角的那个单元格为基准,覆盖其他单元格使之称为一个大的单元格。
- 相反,拆分单元格后将这个大单元格的值返回到原来的左上角位置。
# 合并单元格, 往左上角写入数据即可
sheet.merge_cells('B1:G1') # 合并一行中的几个单元格
sheet.merge_cells('A1:C3') # 合并一个矩形区域中的单元格
- 合并后只可以往左上角写入数据,也就是区间中:左边的坐标。
- 如果这些要合并的单元格都有数据,只会保留左上角的数据,其他则丢弃。换句话说若合并前不是在左上角写入数据,合并后单元格中不会有数据。
- 以下是拆分单元格的代码。拆分后,值回到A1位置
sheet.unmerge_cells('A1:C3')
4. 实例
import datetime
from random import choice
from time import time
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
# 设置文件 mingc
addr = "openpyxl.xlsx"
# 打开文件
wb = load_workbook(addr)
# 创建一张新表
sheet = wb.create_sheet()
# 第一行输入
sheet.append(['TIME', 'TITLE', 'A-Z'])
# 输入内容(500行数据)
for i in range(500):
TIME = datetime.datetime.now().strftime("%H:%M:%S")
TITLE = str(time())
A_Z = get_column_letter(choice(range(1, 50)))
sheet.append([TIME, TITLE, A_Z])
# 获取最大行
row_max = sheet.max_row
# 获取最大列
con_max = sheet.max_column
# 把上面写入内容打印在控制台
for j in sheet.rows: # sheet.rows 获取每一行数据
for n in j:
print(n.value, end="\t") # n.value 获取单元格的值
print()
# 保存,save(必须要写文件名(绝对地址)默认 py 同级目录下,只支持 xlsx 格式)
wb.save(addr)
浙公网安备 33010602011771号