Python-使用xlsxwriter创建单元格下拉列表(数据校验)

在一个B/S系统中,用户经常需要从以Excel的方式填写后导入,此时网页上需要提供Excel填写的模板,将所需填写的字段以及所处的列的位置固定下来。其中,避免用户随意填写导致系统后台校验出错,对于某些字段,系统需要预设好固定的选项值,用户只能在给定的范围内选择,不允许人工输入填写。

如果字段值的数据范围长期不变,则可直接固化在Excel中;如果字段值偶尔会更新,需要在下载Excel模板时,实时从数据库获取,则需要动态生成该Excel模板。

静态Excel模板

制作Excel模板

新建Excel文件,设置好表头名称,从第二行开始设置数据校验。具体步骤为:

数据》数据验证》设置,“允许”选择“序列”,“来源”字段可手动输入文本(以英文逗号分隔)或选中任意sheet的任意表格内容。

提供下载

from flask import current_app, request, send_from_directory, send_filedef download_excel_template():"""下载Excel模板"""file_dir = os.path.join(current_app.config['LIB_DIR'], 'files', 'templates')  # 模板存放目录current_app.logger.info("下载%s下的文件:%s" % (file_dir, 'Template.xlsx'))return send_from_directory(file_dir, 'Template.xlsx', as_attachment=True)

动态Excel模板

更特殊的场景下,Excel单元格下拉列表的内容需要从系统中动态获取。例如,用户希望通过填写并上传Excel到某系统,由系统在openstack平台上创建一台虚拟机。虚机的hostname、ip等内容需要由用户自行指定,但虚机所使用的Flavor(即CPU/内存)、镜像(image)、卷的类型(volume type)、网络(network)、子网(subnet)等,名称较为复杂不便记忆,最好是能提供Excel的下拉选择功能。image等信息需要从openstack平台拉取,且管理员随时都有可能会在openstack平台上进行增删改的操作,因此为保持Excel模板的准确性、避免经常性的更新维护,可以动态Excel模板的方式提供下载。

这里,推荐使用xlsxwriter模块生成Excel文件。[Creating Excel files with Python and XlsxWriter — XlsxWriter Documentation]

确定Excel的列名

header_row = ['hostname', 'flavor', 'image']

获取下拉选项数据

flavors = get_openstack_flavor_names()
images = get_openstack_image_names()

列表直接写在文本中

通用函数

# chr(i)  65-90   # A,B,C ... Zdef get_column(idx):"""根据数字序号,获取Excel的列名,从0开始例如,0->A"""prefix = int(idx/26)suffix = idx%26if not prefix:return chr(suffix+65)else:return get_column(prefix)+chr(suffix+65)def get_excel_cell_name(row_idx, col_idx):"""根据行列的序号,获取单元格的名称,从(0,0)开始例如,(0,0)->A1"""if row_idx < 0:raise ValueError("Excel的行号必须大于等于0")if col_idx < 0:raise ValueError("Excel的列号必须大于等于0")return "%s%s"%(get_column(col_idx), row_idx+1)

生成Excel

对于单元格的数据校验,可以使用其data_validation功能。Working with Data Validation — XlsxWriter Documentation

import xlsxwriter
from flask import current_appdef generate_excel_template():newfile = os.path.join(current_app.config['TMP_DIR'], 'download', 'Template-%s.xlsx' % (time.strftime("%Y%m%d%H%M")))workbook = xlsxwriter.Workbook(newfile)sheet = workbook.add_worksheet("Sheet1")row = 0# 表头for idx, header in enumerate(header_row):sheet.write(row, idx, header)row += 1# flavorflavors = get_openstack_flavor_names()  # todo,从数据库获取数据列表cellname = get_excel_cell_name(row, header_row.index("flavor"))sheet.data_validation(cellname, {"validate": "list", "source": flavors})# imageimages = get_openstack_image_names()    #todo,从数据库获取数据列表cellname = get_excel_cell_name(row, header_row.index("image"))sheet.data_validation(cellname, {"validate": "list", "source": images})workbook.close()return newfile@app.route()    # 略
def download():file_path = generate_excel_template()return send_file(file_path, as_attachment=True)

注意:在该方法中,是将列表的内容直接放在了source里,xlsxwriter对此有所限制,内容长度不超过255,否则无法生效,该单元格最终会变成普通的单元格。

列表维护在单独sheet中

对于列表内容较长的场景,建议单独创建一个sheet,用于作为下拉列表的选项。上述代码可改造为:

def save_data_validate_options_sheet(workbook, object_options):"""保存数据校验的待选项到单独的sheet,object_options格式为{'flavor':[], 'image':[]}"""key2cellrange = {}opt_sheet = workbook.add_worksheet("options")col = 0for k in object_options:key2cellrange[k] = ""opt_sheet.write(0, col, k)row = 1for opt in object_options[k]:opt_sheet.write(row, col, opt)row += 1col_char = get_column(col)cellrange = "='{sheet}'!${col}${row1}:${col}${row2}".format(sheet=sheetname,col=col_char, row1=2, row2=row)key2cellrange[k] = cellrangecol += 1return key2cellrangedef generate_excel_template():newfile = os.path.join(current_app.config['TMP_DIR'], 'download', 'Template-%s.xlsx' % (time.strftime("%Y%m%d%H%M")))workbook = xlsxwriter.Workbook(newfile)sheet = workbook.add_worksheet("Sheet1")row = 0# 表头for idx, header in enumerate(header_row):sheet.write(row, idx, header)row += 1# 统一获取待选项flavors = get_openstack_flavor_names()  # todo,从数据库获取数据列表images = get_openstack_image_names()    #todo,从数据库获取数据列表object_options = {"flavor": flavors, "image": images}key2cellrange = save_data_validate_options_sheet(workbook, object_options)# flavorcellname = get_excel_cell_name(row, header_row.index("flavor"))sheet.data_validation(cellname, {"validate": "list", "source": key2cellrange['flavor']})# imagecellname = get_excel_cell_name(row, header_row.index("image"))sheet.data_validation(cellname, {"validate": "list", "source": key2cellrange['image']})workbook.close()return newfile

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/60082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【运维】hadoop3.0.3集群安装(一)多节点安装

文章目录 一.Purpose二. Prerequisites三. Installation1. 节点规划2. Configuring Hadoop in Non-Secure Mode3. 准备工作4. 配置core-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xmlworkers 4. 分发配置、创建文件夹5. 格式化6. 操作进程6.1. hdfs启动停止 6.2. yarn启动…

PyQt6 GUI界面设计和Nuitka包生成exe程序(全笔记)

PyQt6 GUI界面设计和Nuitka包,生成exe程序全笔记 目录一、PyQt6包安装1.1 进行环境配置和安装1.2 检查包是否安装成功。1.3 运行desinger.exe二、GUI界面设计,写程序,并能运行成功。三、Nuitka打包生成exe程序3.1 做Nuitka安装准备工作(1)安装C编译器,设置环境变量3.2 安…

创建Vue项目时报错!

Vue CLI v5.0.8 ✨ Creating project in F:\program\demodemo\demo. &#x1f5c3; Initializing git repository... ⚙️ Installing CLI plugins. This might take a while... npm ERR! code EPERM npm ERR! syscall open npm ERR! path D:\NodeJs\node_cache\_cacache\tm…

新功能上线!Salesforce Field Service人工智能创新

Salesforce Field Service是Service Cloud的扩展&#xff0c;可提供员工管理的全面视图。Field Service专为进行现场服务的员工而设计&#xff0c;例如服务技术人员、服务座席、调度员等。随着Salesforce平台上线越来越多的生成式AI新增功能&#xff08;包括Sales Cloud、Marke…

【PHP】常用的PHP内置函数

1、PHP内置函数非常丰富&#xff0c;用于执行各种任务。以下是一些常用的PHP内置函数&#xff1a; 字符串操作函数&#xff1a; strlen(): 返回字符串的长度。 strpos(): 查找字符串中的某个子串第一次出现的位置。 substr(): 返回字符串的子串。 str_replace(): 替换字符串中的…

Camunda 7.x 系列【38】表单服务 FormService

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 概述2. 演示2.1 获取流程开始表单2.2 启动流程2.3 查询任务表单2.4 完成任务3. 实际开发…

linux磁盘空间满了

登录服务器&#xff0c;通过df -Hl查看 确定告警信息一致&#xff0c;接着是找到占用空间大目录或文件 一种比较笨的方法是&#xff0c;在根目录下&#xff0c;通过du -sh命令&#xff0c;列出各目录所占空间大小 之后再用同样的方法继续到对应目录下去找 再相对高效一点的…

useState

道阻且长&#xff0c;行而不辍&#xff0c;未来可期 Hook是React 16.8.0版本增加的新特性 state hook让函数组件也有状态&#xff0c;也可以进行状态的读写。 语法&#xff1a;const [xxx&#xff0c;setXxx] React.useState(initValue); useState()说明&#xff1a;参数&am…

浅谈红队资产信息收集经验

文章目录 子公司资产收集备案号|官网收集子域名|ip收集fofa灯塔ARLX情报社区 资产确认目录扫描Google Hacking绕过CDNnmap端口扫描参数技巧其他常用工具 子公司资产收集 红蓝对抗中往往只会给你目标企业的名称&#xff0c;以及对应的靶标系统地址&#xff0c;而很少有直接从靶标…

给前端返回http链接,由于浏览器缓存不能获取到最新资源怎么办?

1、问题描述 今天在工作中接到这样一个需求&#xff0c;接收前端的图片文件并上传到远程&#xff0c;将原有图片覆盖并返回一个http链接以供前端展示。用户使用后反馈没有修改成功&#xff0c;上了远程拉图片发现已经修改了&#xff0c;但是用户浏览器还是老的图片。排查原因是…

MySQL基础入门

推荐查看 数据库相关概念 MySQL百度百科 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Databa…

Unity Android Bugly 报错地址查询

借助Android NDK arm-linux-androideabi-addr2line.exe 对报错的地址转换成对应代码行。 一、报错信息&#xff0c;例如来自Firebase 报错如下&#xff1a; Fatal Exception: Tombstone: Version 2020.3.33f1 (915a7af8b0d5), Build type Release, Scripting Backend il2cpp,…

KylinOS配置完静态IP地址后,保存按钮是灰色

问题: 配置完静态IP地址后,保存按钮置灰,并且提示“无效设置IPv4设置:ipv4.gateway:网关与”never-default”不兼容”。 原因: 这是由于禁止添加默认路由导致的。 解决方案: 1、使用nmcli命令: nmcli con modify "有线连接 1" ipv4.never-default no 执…

常见的数据结构之队列

一、介绍 队列(Queue)是一种常见的数据结构,用于存储和管理一系列数据元素,其中元素按照 先进先出(First-In-First-Out,简称FIFO)的原则进行插入和删除。 队列可以类比为现实生活中排队等候的场景,例如在超市收银台排队购物的顾客队列。 二、队列的基本操作 2.1 出…

Java代码审计15之Apache log4j2漏洞

文章目录 1、log4j简介2、复现2.1、高版本测试2.2、测试代码2.3、补充之dns探测2.3.1、rmi、ldap也可以dnslog探测 2.3.2、dnslog外带信息 3、漏洞原理3.1、漏洞的危害大的背景3.2、具体的代码调试 4、靶场测试4.1、dns探测4.2、工具下载与使用4.3、测试 5、bypass 1、log4j简介…

【一维差分】

一维差分 #include<iostream> using namespace std; const int N 100000 11;int n,m; int a[N],b[N];int main(){cin>>n>>m;for(int i1;i<n;i) cin>>a[i];for(int i1;i<n;i) b[i] a[i] - a[i-1];while(m--){int l,r,c;cin>>l>&…

13、监测数据采集物联网应用开发步骤(9.2)

监测数据采集物联网应用开发步骤(9.1) TCP/IP Server开发 新建TCP/IP Server线程类com.zxy.tcp.ServerThread.py #! python3 # -*- coding: utf-8 -Created on 2017年05月10日 author: zxyong 13738196011 import socket,threading,time from com.zxy.tcp.TcpServer import …

CSA研讨会|聚焦云原生安全,探讨技术与应用策略

为产业数字化保驾护航&#xff0c; 云原生安全体系如何有效抵御网络威胁&#xff1f; 网络安全的下一个十年&#xff0c; 云原生安全是网络安全创新之路吗&#xff1f; CNAPP部署现状&#xff0c;你了解多少&#xff1f; 9月6日&#xff08;周三&#xff09;下午14&#xff1a…

推荐一本AI+医疗书:《机器学习和深度学习基础以及医学应用》,附21篇精选综述

当代医学仍然存在许多亟待解决的问题&#xff0c;比如日益增加的成本、医疗服务水平的下降...但近几年AI技术的发展却给医疗领域带来了革命性的变化&#xff0c;因此AI医疗迅速兴起。 从目前已知的成果来看&#xff0c;人工智能在医学领域的应用已经相当广泛&#xff0c;智能诊…

ChatGPT在创新和创业中的应用如何?

ChatGPT是一种基于大规模预训练的语言模型&#xff0c;它在创新和创业中有着广泛的应用。作为一种具备自然语言处理能力的模型&#xff0c;ChatGPT可以与用户进行对话&#xff0c;并提供相关的信息、建议和创意。以下是ChatGPT在创新和创业中的一些应用&#xff1a; 创意生成和…