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)
posted on 2021-06-02 00:13  math98  阅读(679)  评论(0)    收藏  举报