from openpyxl.styles import NamedStyle, Font, Border, Side, PatternFill, Alignment, colors, Protection
from openpyxl.worksheet.datavalidation import DataValidation
class Made_homepage():
    def __init__(self, wb, data, excel_name_path):
        初始化参数
        :param wb: 创建的Workbook对象
        :param data: 所有数据字典,表中每个sheet的数据,例如
        {"sheet名1":[[第一行数据], [第二行数据].....], "sheet名2": [[第一行数据], [第二行数据].....], ......}
        :param excel_name_path: excel表位置
        self._wb = wb
        self._data = data
        self._excel_name_path = excel_name_path
        # 字体样式
        self._font = Font(name="微软雅黑",
                        color=colors.BLACK, # 字体颜色,使用#FFFFFF也可以
                        italic=True,   # 是否斜体
                        size=14,
                        bold=False,  # 是否加粗
                        vertAlign=None,  # 对齐方式 None、subscript(下标)、baseline(基线)、superscript(上标)
                        underline="none", # 下划线,double、single、doubleAccounting、singleAccounting
                        strike=False,  # 删除线
         self._hyperlink_font = Font(name="微软雅黑",
                          color=colors.BLUE,
                          italic=False,
                          size=12,
                          bold=False,
                          vertAlign=None,
                          underline="single",
                          strike=False,
        # 填充,颜色等
        self._fill = PatternFill(fill_type=None,  # 填充的样式,fill_type为solid颜色背景颜色;fill_type为None,焦点在单元格中才会显示颜色
                           start_color=colors.BLACK,  # start_color和end_color颜色,值为HEX颜色值(渐变色填充,起始和结束颜色一致,单元格中的颜色就是一致的)
                           end_color=colors.BLACK
        # self._border = Border( # border_style边线样式,thin、medium、thick实线依次加粗
        #     left=Side(border_style="thin", color=colors.BLACK),
        #     right=Side(border_style="thin", color=colors.BLACK),
        #     top=Side(border_style="thin", color=colors.BLACK),
        #     bottom=Side(border_style="thin", color=colors.BLACK),
        #     diagonal=Side(border_style=None, color=colors.BLACK), # 对角线
        #     diagonal_direction=0,
        #     outline=Side(border_style=None, color=colors.BLACK),  # 删除线
        #     vertical=Side(border_style=None, color=colors.BLACK),  # 水平线
        #     horizontal=Side(border_style=None, color=colors.BLACK),  # 垂直线
        self._alignment = Alignment(
            # 水平方向right、center(水平居中)、centerContinuous、distributed、general、left、justify、fill
                              horizontal='general',
            # 垂直方向 top、justify、distributed、center(垂直居中)、bottom
                              vertical='bottom',
                              text_rotation=0,
                              wrap_text=False,  # 是否自动换行
                              shrink_to_fit=False,
                              indent=0)
        # 数据格式
        self._number_format = "General"
        # 保护模式
        self._protection = Protection(locked=True, hidden=False)  # 锁定不可编辑,不隐藏
        self._title = NamedStyle(name='title')  # 注册样式
        self._border = Side(style='thin', color='000000')
        self._title.border = Border(
            left=self._border,
            top=self._border,
            right=self._border,
            bottom=self._border)
    def _set_freeze(self, ws, row_col):
        冻结,传入单元格位置,这个单元格之上的所有行和左边的所有列都会被冻结,例如:A2,只冻结首行
        :param ws: sheet对象
        :param row_col: 单元格位置,例如:A2
        :return:
        ws.freeze_panes = row_col
    def _set_row_hidden(self, ws, row_list):
        设置行隐藏
        :param ws: sheet对象
        :param row_list: 行号列表,例如:[1, 2, 3]
        :return: 
        for i in row_list:
            ws.row_dimensions[i].hidden = 1
    def _set_column_hidden(self, ws, column_list):
        设置列隐藏
        :param ws: sheet对象
        :param column_list: 列号列表,例如:["B", "C", "D"]
        :return: 
        for i in column_list:
            ws.column_dimensions[i].hidden = 1  
    def set_protection(self, ws, value, already_hashed=False):
        对sheet进行保护
        :param ws: sheet对象
        :param value: 密码
        :param ws: 是否对密码进行hash,默认:False
        :return:
        ws.protection.set_password(value=value, already_hashed=already_hashed)
    def set_table_colwidth(self, ws, col_name_len_dict):
        :param ws: sheet对象
        :param col_name_len_dict: 列名长度字典,例如:{"A": 10, "B": 15}
        :return: None
        for col_name, length in col_name_len_dict.items():
            ws.column_dimensions[col_name].width = length if length <= 40 else 40  # 最长设置40
    def set_title_style(self, cell, value='', font=None, alignment=None):
        设置单元格数据及样式
        :param cell:  单元格位置
        :param value: 单元格值
        :param font:  样式
        :param alignment: 位置样式
        :return:
        cell.value = value
        cell.style = self._title
        cell.font = font if font else self._font
        cell.alignment = alignment if alignment else self._alignment
	def set_hyperlink(self, ws, row, column, value, link, font=self.hyperlink_font, 	alignment=self.alignment, border=self.border):
        为单元格设置超链接
        :param cell: 单元格对象
        :param value: 单元格需要设置显示的文本
        :param link: 超链接
        :param font: 字体
        :param alignment: 对齐方式
        :param border: 边框
        cell = ws.cell(row=row, column=column)
        cell.value = value
        cell.hyperlink = link
        cell.font = font
        cell.alignment = alignment
        cell.border = border
    def record_max_col(self, col_num_list, text, index):
        记录每列的最大宽度值
        :param col_num_list:
        :param text:
        :param index:
        :return:
        col = len(str(text).encode('gb18030'))  # 列宽度
        if col > col_num_list[index]:
            col_num_list[index] = col
    def get_col_num_dict(self):
        获取位置和列字母的对应关系
        :return: 返回结果: {0: "A", 1: "B" ........25: "Z"}
        A_Z = [chr(a) for a in range(ord("A"), ord("Z"))]
        col_num_dict = {k: v for k, v in enumerate(A_Z)}
        return col_num_dict
    def set_upslide(self,ws, cell_alignment, upslid_list, allow_blank=True):
        单元格设置下拉菜单
        :param ws: sheet对象
        :param cell_alignment: 单元格的范围,例如"G2:G10"
        :param upslid_list: 下拉选项,例如:'"确认漏洞,确认误报,确认报备,待确认"'
        :param allow_blank: 是否可以为空,默认为True,可以为空
        :return:
        dv = DataValidation(type="list", formula1=upslid_list, allow_blank=allow_blank)
        dv.error = "Your entry is not in the list"
        dv.errorTitle = "Invalid Entry"
        dv.prompt = "Please select from the list"
        dv.promptTitle = "List Selection"
        dv.add(cell_alignment)
        ws.add_data_validation(dv)
    def set_table_data(self, ws, data_list):
        给表中添加数据
        :param ws: sheet对象
        :param data_list: 每个sheet中数据列表
        :return: 每列的最大长度列表
        # ws.merge_cells(start_row=1, start_column=1, end_row=1, end_column=7)
        font = Font(name="微软雅黑",
                    color=colors.BLACK, # 使用#FFFFFF也可以
                    italic=True,
                    size=14,
                    bold=True,  # 加粗
                    vertAlign=None,
                    underline="none",
                    strike=False,
        column_num = len(data_list[0])  # 记录列数
        col_num_list = [0 for _ in range(column_num)]  # 设置每列宽度初始值为0
        for row_num, row_list in enumerate(data_list):  # 循环每一行数据
            for col_num, value in enumerate(row_list):  # 循环一行中的数据
                self.set_title_style(
                                     ws.cell(row=row_num + 1, column=col_num + 1),
                                     value=value,
                                     font=font if row_num == 0 else self._font  # 如果是第一行,则单独设置font
                self.record_max_col(col_num_list, value, col_num)
        return col_num_list
    def run(self):
        index = 0
        for sheet_name, data_list in self._data.items():
            # 创建sheet
            ws = self._wb.create_sheet(sheet_name, index=index)
            # 写入数据
            col_num_list = self.set_table_data(ws=ws, data_list=data_list)
            col_num_dict = self.get_col_num_dict()
            # 获取列名和长度对应关系字典
            col_name_len_dict = {col_num_dict[i]: value for i, value in enumerate(col_num_list)}
            # 设置列宽
            self.set_table_colwidth(ws=ws, col_name_len_dict=col_name_len_dict)
            index += 1
        self._wb.save(self._excel_name_path)
openpyxl 下拉框
dv = DataValidation(type="list", formula1='"a,b,v"', allow_blank=True)  # 下拉框可选择值为:a、b、c
dv.error = "Your entry is not in the list"  # 输入错误时候的提示信息
dv.errorTitle = "Invalid Entry"   # 输入错误时候的提示框的标题
dv.prompt = "Please select from the list"  # 鼠标点击输入框时候的提示信息
dv.promptTitle = "List Selection"  # 鼠标点击输入框时候的提示信息
dv.add("P2:P6")  # 这里样例是给P列添加下拉框,从2行到6行
sheet.add_data_validation(dv)  # 给sheet添加下拉框
sheet.column_dimensions["M"].hidden = 1   # 单列隐藏,样例为给M列隐藏
如果想隐藏多列,可以写多个上面的代码,也可以下面这样
sheet.column_dimensions.group("K", "M", hidden=True)  # 这里是给K、M列同时隐藏
sheet.freeze_panes = "A2"  # 冻结首行
sheet.freeze_panes = "B2"  # 冻结首行和首列
                                    我试图使用openpyxl在一个单元中存储一个有效的ip地址列表。目前,数据被简单地放入一个单元中,通常会溢出到其他单元中。使用以下代码:# Regex to return a tidy list of ip addresses in that block"""r = row to be checkeds = source or destination columnsiptc = ips to c...
                                    Python操作Execl实现三级联动下拉功能,查阅了很多资料,也没有明显的样例,没办法,去翻阅了文档,整理出一个实现联动下拉的demo.
以下是:【openpyxl官方文档】
在这里插入代码片# -*-coding: utf-8 -*-
import xlsxwriter
# 定义xlsx文件名称
workbook = xlsxwriter.Workbook('defined_test.xlsx')
# 定义sheet
worksheet1 = workbook.add_worksheet()
                                    在之前的推文中,我们介绍了操作Excel的模块openpyxl的cell单元格操作,相关推文可以从本公众号的底部相关菜单获取。接下来的推文我们来学习一下openpyxl这个python模块中的其他知识,想了想还是先来学习一下怎么借助openpyxl来进行Excel的公式设置。
一.公式数量和种类
我们先看一下在openpyxl中能使用的公式有哪些,我们来看代码:
from openpyxl.utils import FORMULAE
print(len(FORMULAE))
print(FORM..
class DropDown():
    def write_with_dropdown(self, book_name, sheet_name="Sheet1"):
        #官网https://xlsxwriter.readthedocs.io/ 写入下拉列表
        workbook = xlsxw...
                                    利用python获取excel中所有下拉选(drop down)中的值,在百度搜了一下午,都没找到合适的方法,还是google靠谱给力,很快就找到解决办法了,分享一下,供有需要的同行参考。
excel中数据如下图(B3中为:中国,日本,美国,苏联,C1中为:男,女,中性,D1:D3中为:男性,女生,同胞)
图一:B3单元格
图二:D1单元格
图三:C1单元格
图四:所有单元效果
import openpyxl
#封装函数
def read_with_dropdow.
                                    from openpyxl import Workbookfrom openpyxl.styles import Font, Fill, Alignment, Border, Side, PatternFillfrom handlers.boss_accountant import PbOrderManageBasefrom handlers.base.pub_func import Config...
                                    以sheet1和sheet2为例。
(1)在sheet1中选择一行或一列的多个单元格
(2)在“插入”-》“名称”-》“定义”-》“在当前工作簿中的名称”下的输入框中输入一个名字,比如“lbl”.
(3)在sheet2中选择一个单元格
(4)在“数据”-》“在效性”-》“序列”-》“来源”中输入“=lbl”就可以了。
                                    Excel–这才是三级联动下拉菜单的正确做法,跟二级联动菜单完全不同! 文章来源:企鹅号 - Excel学习世界 今天教大家制作三级联动下拉菜单。很多同学以为三级联动下拉做法跟二级联动下拉菜单是一样的,举一反三即可。其实不然!因为第三级要考虑的不仅仅是二级菜单的选择,而是一、二级菜单的组合情况,网上有很多教程是错的,恰恰就是因为忽略了这个关键点。现在就跟着案例来学习正确的做法。案例:下图是学校某兴...
win = tkinter.Tk()
win.title("Kahn Software v1")  # #窗口标题
win.geometry("500x300+200+20")  # #窗口位置500后面是字母x
                                    利用python获取excel中所有下拉选(drop down)中的值,在百度搜了一下午,都没找到合适的方法,还是google靠谱给力,很快就找到解决办法了,分享一下,供有需要的同行参考。
excel中数据如下图(B3中为:中国,日本,美国,苏联,C1中为:男,女,中性,D1:D3中为:男性,女生,同胞)
       图一:B3单元格                           ...
                                    我正在尝试使用openpyxl在单元格中存储有效IP地址列表.目前,数据只是放入一个单元格,通常会溢出到其他单元格中.使用以下代码:# Regex to return a tidy list of ip addresses in that block"""r = row to be checkeds = source or destination columnsiptc = ips to chec...
                                    利用python获取excel中所有下拉选(drop down)中的值,在百度搜了一下午,都没找到合适的方法,还是google靠谱给力,很快就找到解决办法了,分享一下,供有需要的同行参考。excel中数据如下图(B3中为:中国,日本,美国,苏联,C1中为:男,女,中性,D1:D3中为:男性,女生,同胞)图一:B3单元格图二:D1单元格图三:C1单元格图四:所有单元效果#导入库import open...
                                        简单来说,人学习东西后能记住的内容会随时间衰减,为此诞生了“艾宾浩斯遗忘曲线”这一理论,为了记住所学知识,需要及时复习,本文将使用Python读写Excel来管理艾宾浩斯复习计划。...