【python操作excel数据有效性(含excel的基本操作)】学习笔记

Excel的数据有效性功能,可以对输入单元格的数据进行内容上的限制。当我们利用 excel 生成代码时,可以通过此类方式规范输入。
以下是:【openpyxl官方文档】

excel的基本操作
  • 生成xlsx
wb = Workbook()
wb.save(xls_path)
  • 加载excel文件
# 加载excel文件(data_only=True 代表以数据形式而非公式)
wb = load_workbook(xls_path, data_only=True)
  • 新建 sheet页
wb = load_workbook(xls_path, data_only=True)
wb.create_sheet(title=sheet_name)
  • 删除 sheet页
wb = load_workbook(xls_path, data_only=True)
wb.remove(wb[sheet_name])
  • 加载 sheet页
wb = load_workbook(xls_path, data_only=True)
xxx_sheet = wb[sheet_name]
  • 设置列宽
wb = load_workbook(xls_path, data_only=True)
xxx_sheet = wb[sheet_name]
xxx_sheet.column_dimensions["A"].width = 20
  • 加载 单元格
wb = load_workbook(xls_path, data_only=True)
xxx_sheet = wb[sheet_name]
cell = xxx_sheet.cell(row=1, column=1)  # 1行1列
  • 设置单元格格式
wb = load_workbook(xls_path, data_only=True)
xxx_sheet = wb[sheet_name]
cell = xxx_sheet.cell(row=1, column=1)  # 1行1列

from openpyxl.styles import Font
font = Font(b=True, color="FF0000")  # 红色字体
cell.font = font
  • 单元格赋值
wb = load_workbook(xls_path, data_only=True)
xxx_sheet = wb[sheet_name]
cell = xxx_sheet.cell(row=1, column=1)  # 1行1列
cell.value = 'YourName666'
  • 获取 sheet页 最大列数、行数
wb = load_workbook(xls_path, data_only=True)
xxx_sheet = wb[sheet_name]
# 最大列数
print(xxx_sheet.max_column)
# 最大行数
print(xxx_sheet.max_row)
  • 保存
wb = load_workbook(xls_path, data_only=True)
wb.save(xls_path)
excel数据有效性
wb = load_workbook(xls_path, data_only=True)
xxx_sheet= wb[sheet_name]

# 清空原有有效性校验规则
xxx_sheet.data_validations.dataValidation = []

# 建立有效性(以"序列"的形式)
dv = DataValidation(type="list", formula1=f'={sheet_name}!$A$1', allow_blank=True)
# 设置自定义提示消息
dv.promptTitle = "XXX"
dv.prompt = "XXX"
# 设置自定义错误消息
dv.errorTitle = "XXX"
dv.error = "XXX"

dv.add(xxx_sheet.cell(1, 1))
xxx_sheet.add_data_validation(dv)
完整代码
# -*-coding: utf-8 -*-
import os
from time import sleep
from openpyxl import load_workbook, Workbook
from openpyxl.worksheet.datavalidation import DataValidation


class Data_Validation:

    def __init__(self, xls_path: str = 'demo.xlsx'):
        # 判断文件是否存在,若不存在,则生成该文件
        if os.path.exists(xls_path) is False:
            print(f"<{xls_path}> not exist, creat <{xls_path}>...")
            wb = Workbook()
            wb.save(xls_path)

        # 加载excel文件(data_only=True 代表以数据形式而非公式)
        self.wb = load_workbook(xls_path, data_only=True)
        self.sheet_init()

    def sheet_init(self):
        """
        初始化 sheet页,即删除不必要的 sheet 页,新建所需的 sheet 页,并附上测试数据
        :return:
        """
        sheet_need = ['DEMO', 'base']
        for sheet_name in self.wb.sheetnames:
            if sheet_name not in sheet_need:
                self.wb.remove(self.wb[sheet_name])
                print(f"<{sheet_name}> deleted")
        for sheet_name in sheet_need:
            if sheet_name not in self.wb.sheetnames:
                self.wb.create_sheet(title=sheet_name)
                print(f"<{sheet_name}> added")

        # 加载 sheet页
        base_sheet = self.wb['base']
        # 设置列宽
        base_sheet.column_dimensions["A"].width = 20
        # 加载 单元格
        cell = base_sheet.cell(row=1, column=1)

        # 设置单元格格式
        from openpyxl.styles import Font
        font = Font(b=True, color="FF0000")  # 红色字体
        cell.font = font

        # 单元格赋值
        cell.value = 'YourName666'

        # # 最大列数
        # print(base_sheet.max_column)
        # # 最大行数
        # print(base_sheet.max_row)

        self.wb.save('demo.xlsx')

    def load_validation(self, sheet_name: str = 'DEMO'):
        DEMO_sheet = self.wb[sheet_name]
        # 设置列宽
        DEMO_sheet.column_dimensions["A"].width = 20
        # 清空原有有效性校验规则
        DEMO_sheet.data_validations.dataValidation = []

        # 建立有效性(以"序列"的形式)
        dv = DataValidation(type="list", formula1=f'=base!$A$1', allow_blank=True)
        # 设置自定义提示消息
        dv.promptTitle = "SELECT DATA"
        dv.prompt = "Select data from <base>"
        # 设置自定义错误消息
        dv.errorTitle = "DATA ERROR"
        dv.error = "Select data from <base>"

        dv.add(DEMO_sheet.cell(1, 1))
        DEMO_sheet.add_data_validation(dv)
        
        print(f"<{sheet_name}> add data validation")

        self.wb.save('demo.xlsx')


if __name__ == '__main__':
    ins = Data_Validation()
    ins.load_validation()
    sleep(3)
运行结果(当前路径不存在 demo.xlsx 的情况下)
  • 代码运行提示:
<demo.xlsx> not exist, creat <demo.xlsx>...
<Sheet> deleted
<DEMO> added
<base> added
<DEMO> add data validation
  • 运行前目录文件结构
project
│   excel.py
  • 运行后目录文件结构
project
│   demo.xlsx
│   excel.py
  • 生产的 demo.xlsx 文件
    文件下有两个 sheet页,分别为 DEMO,base
    Figure 1
    base内容如下
    Figure 2
    DEMO内容如下
    Figure 3
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值