2. openpyxl 处理表格

# pip install openpyxl
# 使用openpyxl
from openpyxl.chart import Reference
from openpyxl.chart import LineChart
from datetime import date
from openpyxl.styles import Font
from openpyxl.styles import PatternFill
from openpyxl.styles import Border, Side
from openpyxl.styles import Alignment
import openpyxl

# 创建一个Workbook对象
workbook = openpyxl.Workbook()

# 创建第一个sheet
sheet = workbook.active

# 在第1行第1列的单元格写入111
sheet['A1'] = 111

# 创建一个新的sheet
sheet1 = workbook.create_sheet()
# 在这个新的sheet中第2行第2列的单元格写入222
sheet1['B2'] = 222

# 创建一个叫"第3个工作表"的新sheet
sheet3 = workbook.create_sheet("第3个工作表")
# 在这个新的sheet中第3行第3列的单元格写入333
sheet3['C3'] = 333
sheet3['D5'] = "333"

# 新建sheet指定位置 0表示首位
sheet4 = workbook.create_sheet("第4个工作表", 1)
sheet4['A1'] = '第4个工作表'
sheet4['A5'] = '第4个工作表'

data = ['python', 'java', 'C++']
for i, d in enumerate(data):
    sheet4.cell(i+1, 1).value = d

# 将列表直接写入列一行,追加写入
sheet.append(["客户名称(必填)", "手机号码(必填)", "邮箱", "备注"])

# 保存本地excel文件中
workbook.save("./办公自动化/files/test.xlsx")

# 读取表格处理
workbook = openpyxl.load_workbook(filename=r'./办公自动化/files/test.xlsx')

# 获取叫"Sheet"的工作表
sheet = workbook["Sheet"]

# 获取sheet
print(workbook.sheetnames)  # ['Sheet', 'Sheet1', '第3个工作表']
for sh in workbook:
    print(sh.title)
sheet_name = "Sheet"
sheet = workbook[sheet_name]

# 表格有多少行多少列数据
print(sheet.max_row)
print(sheet.max_column)

# 获取数据
sh = workbook.active
print(f'第二行第三列数据: {sh.cell(2, 3).value}')
print(f'第二行第三列数据: {sh['C2'].value}')

# 切片获取数据
print(f'第三行到第五行的数据:{sh[3:5]}')    # 第三行到第五行的数据
print(f'A2到A4的数据: {sh['A2:D2']}')
for rows in sh['A2:D2']:
    for cell in rows:
        print(cell.value)

# 获取整行整列数据
print("获取整行整列数据")
print(sh[3])   # 第三行所有数据
print(sh['C'])  # C列所有数据
for cell in sh['C']:
    print(cell.value)

# 使用 iter_rows() 方法获取指定范围内的一系列行,并遍历每行中的每个单元格
for row in sheet.iter_rows(min_row=1, max_row=1, min_col=1, max_col=1):
    for cell in row:
        print(cell.value)

# 使用 iter_cols() 方法获取指定范围内的一系列列,并遍历每列中的每个单元格
for col in sheet.iter_cols(min_row=1, max_row=1, min_col=1, max_col=1):
    for cell in col:
        print(cell.value)

# rows 属性返回工作表中所有行的列表
for row in sheet.rows:
    for cell in row:
        print(cell.value)

# columns 属性返回工作表中所有列的列表
for col in sheet.columns:
    for cell in col:
        print(cell.value)

# 使用 iter_rows() 方法获取工作表中的所有行并返回每个单元格的值,values_only=True 参数可以跳过单元格的格式信息
for row in sheet.iter_rows(values_only=True):
    for cell_value in row:
        print(cell_value)

# 使用 iter_cols() 方法获取工作表中的所有列并返回每个单元格的值,values_only=True 参数可以跳过单元格的格式信息
for col in sheet.iter_cols(values_only=True):
    for cell_value in col:
        print(cell_value)

# 使用切片来获取指定范围内的单元格区域,并使用嵌套循环来遍历该区域内的每个单元格
for row in sheet['A1:D3']:
    for cell in row:
        print(cell.value)

# 合并、拆分单元格和插入删除行列
# 方式一 合并 A2到C4 范围的单元格
sheet.merge_cells('A3:D3')
# 方式二 合并 2到4行,1到3列 范围的所有单元格
# sheet.merge_cells(start_row=2, start_column=1, end_row=4, end_column=3)

# 拆分合并的单元格
# 方式一 拆分 A2到C4 范围的单元格
sheet.unmerge_cells('A3:D3')
# 方式二 拆分 2到4行,1到3列 范围的所有单元格
# workbook.unmerge_cells(start_row=2, start_column=1, end_row=4, end_column=4)

# 插入单行单列
# 在第3行前插入一行
sheet.insert_rows(3)
# 在第2列前插入一列
sheet.insert_cols(2)

# 插入多行多列
# 在第3行前插入四行
sheet.insert_rows(3, 4)
# 在第2列前插入五列
sheet.insert_cols(2, 5)

# 删除单行单列
# 删除第3行
sheet.delete_rows(3)
# 删除第2列
sheet.delete_cols(2)

# 删除多行多列
# 从第3行前开始删除四行
sheet.delete_rows(3, 4)
# 从第2列开始删除五列
sheet.delete_cols(2, 5)

# 对齐方式与换行
# horizontal是水平方向,vertical 是垂直方向
# Alignment(horizontal="center", vertical="center")
# 默认单元格填满了是不换行的,如果要自动换行可使用 wrap_text=True
# Alignment(horizontal="center", vertical="center", wrap_text=True)

# 在第3行第1列的那个单元格写入123546
cell = sheet['A3']
cell.value = 123546
# 将该单元格对齐方式设置为水平和垂直都居中
cell.alignment = Alignment(horizontal="center", vertical="center")

#  合并 A2到C4 范围的单元格
sheet.merge_cells('A4:C4')
# 改变左上单元格的对齐方式来改变合并单元格的对齐方式
cell = sheet['A4']
cell.value = 1235467
cell.alignment = Alignment(horizontal="center", vertical="center")

# 边框线条粗细、颜色设置
# 其中thin是细实线,thick是粗实线,dashed是细虚线,mediumDashed是粗虚线
# 使用 color 参数调整单元格上下左右边框的颜色
Border(
    left=Side(style='thick', color='00000000'),
    bottom=Side(style='mediumDashed', color='00000000'),
    right=Side(style='thin', color='00000000'),
    top=Side(style='dashed', color='00000000'))

# 在第1行第1列的那个单元格写入123546
cell = sheet['B5']
cell.value = 12354678
# 设置该单元格边框和颜色
cell.border = Border(
    left=Side(style='thick', color='00FF0000'),
    bottom=Side(style='mediumDashed', color='00FF0000'),
    right=Side(style='thin', color='00FF0000'),
    top=Side(style='dashed', color='00FF0000'))

# 设置水平垂直剧中
cell.alignment = Alignment(horizontal="center", vertical="center")

# 设置单元格背景颜色
# 在第1行第1列的那个单元格写入123546
cell = sheet['A5']
cell.value = 123
# 使用fgColor属性16进制颜色填充
cell.fill = PatternFill('solid', fgColor="FF00FF")

# 设置字体、字体的粗细、大小、颜色
# 在第1行第1列的那个单元格写入123546
cell = sheet['C5']
cell.value = 123546888
# 设置字体样式:  字体大小为30, bold加粗,字体颜色 00FFFF 16进制颜色
sheet['C5'].font = Font(name='微软雅黑', italic=True,
                        size=30, bold=True, color="00FFFF")
sheet['C6'] = 1235468889
sheet['C6'].font = Font(name='微软雅黑', u='double',
                        italic=True, size=30, bold=True, color="00FFFF")

# 设置行高和列宽
# 设置第1行高度为60
sheet.row_dimensions[1].height = 60
# 设置B列宽度为30
sheet.column_dimensions["B"].width = 30

# 插入数据生成图表
ws = workbook.create_sheet('图表')
rows = [
    ['Date', 'Batch 1', 'Batch 2', 'Batch 3'],
    [date(2020, 12, 1), 40, 30, 25],
    [date(2020, 12, 2), 30, 25, 30],
    [date(2020, 12, 3), 50, 26, 30],
    [date(2020, 12, 4), 20, 18, 40],
    [date(2020, 12, 5), 10, 16, 20],
    [date(2020, 12, 6), 30, 38, 25],
]
for row in rows:
    ws.append(row)

c1 = LineChart()
c1.title = 'Line Chart'
c1.x_axis.title = 'Test_number'
c1.y_axis.title = 'size'
data = Reference(ws, min_col=2, min_row=1, max_col=4, max_row=7)  # 数据获取范围
c1.add_data(data,titles_from_data=True)
ws.add_chart(c1, 'A9')

workbook.save("./办公自动化/files/test.xlsx")