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

这篇具有很好参考价值的文章主要介绍了Python-使用xlsxwriter创建单元格下拉列表(数据校验)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

静态Excel模板

制作Excel模板

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

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

提供下载

from flask import current_app, request, send_from_directory, send_file

def 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 ... Z

def get_column(idx):
    """
        根据数字序号,获取Excel的列名,从0开始
        例如,0->A
    """
    prefix = int(idx/26)
    suffix = idx%26
    if 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_app

def 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
    # flavor
    flavors = get_openstack_flavor_names()  # todo,从数据库获取数据列表
    cellname = get_excel_cell_name(row, header_row.index("flavor"))
    sheet.data_validation(cellname, {"validate": "list", "source": flavors})
    # image
    images = 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,用于作为下拉列表的选项。上述代码可改造为:文章来源地址https://www.toymoban.com/news/detail-682505.html

def save_data_validate_options_sheet(workbook, object_options):
    """
        保存数据校验的待选项到单独的sheet,object_options格式为{'flavor':[], 'image':[]}
    """
    key2cellrange = {}
    opt_sheet = workbook.add_worksheet("options")
    col = 0
    for k in object_options:
        key2cellrange[k] = ""
        opt_sheet.write(0, col, k)
        row = 1
        for opt in object_options[k]:
            opt_sheet.write(row, col, opt)
            row += 1
        col_char = get_column(col)
        cellrange = "='{sheet}'!${col}${row1}:${col}${row2}".format(sheet=sheetname,col=col_char, row1=2, row2=row)
        key2cellrange[k] = cellrange
        col += 1
    return key2cellrange
    
def 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)
    # flavor
    cellname = get_excel_cell_name(row, header_row.index("flavor"))
    sheet.data_validation(cellname, {"validate": "list", "source": key2cellrange['flavor']})
    # image
    cellname = get_excel_cell_name(row, header_row.index("image"))
    sheet.data_validation(cellname, {"validate": "list", "source": key2cellrange['image']})
    workbook.close()
    return newfile

到了这里,关于Python-使用xlsxwriter创建单元格下拉列表(数据校验)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spinner(下拉列表)的使用

      目录 一、介绍: Spinner相关属性: 二、例子 例子一:(含适配器) 完整代码: 例子二(不含适配器): 完整代码:         安卓的Spinner是一个下拉菜单控件,通常用于选择一组选项中的一个。它可以为用户提供一种简单的交互方式,使其能够快速轻松地对应用程序中

    2024年02月06日
    浏览(36)
  • python+selenium下拉列表,滚动条操作失效时,用键盘向下键代替

    我们项目的页面有一个下拉列表,但不是select类型,无法通过封装称Select来操作。看了很多文章都写通过js代码driver.execute_script(\\\"window.scrollTo(0,10000)\\\")可以实现滚动,但我怎么试都不行,就选择换一种思路,通过键盘向下键来代替鼠标滚动 我们项目的下拉列表是ul类型,列表中

    2024年02月08日
    浏览(39)
  • uniapp 微信小程序 Picker下拉列表数据回显问题

    效果图: 1、template 2、data 3、methods

    2024年02月16日
    浏览(42)
  • vue3+element-plus组件下拉列表,数组数据转成树形数据

    引入组件 可以直接在项目中引入element-plus表格组件,如果需要变成下拉列表样式需要添加以下属性: row-key 必填 最好给数字或唯一属性 , 给每个节点设置id 不填的话 没有办法实现展开效果 load 这个是动态添加数据的 前提(开启lazy ,表格数组里设置了hasChildren:true) tre

    2024年02月13日
    浏览(48)
  • Python-爬虫、自动化(selenium,动态网页翻页,模拟搜索,下拉列表选择、selenium行为链)

    selenium是一个Web自动化测试工具,可以直接运行在浏览器上·支持所有主流的浏览器.可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,基础页面截图等。 使用pip install selenium命令下载selenium模块。 运行下列代码: 说明没有下载对应浏览器的驱动,这里使用谷歌

    2024年02月01日
    浏览(69)
  • 猿创征文|vue vant-ui数据列表上拉加载更多,下拉刷新功能

    ⭐️⭐️⭐️   作者: 船长在船上 🚩🚩🚩   主页: 来访地址船长在船上的博客 🔨🔨🔨   简介: CSDN前端领域优质创作者,资深前端开发工程师,专注前端开发,在CSDN总结工作中遇到的问题或者问题解决方法以及对新技术的分享,欢迎咨询交流,共同学习。 🔔🔔🔔

    2023年04月12日
    浏览(40)
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件

    在我们开发的前端项目中,往往为了方便,都需对一些控件进行自定义的处理,以便实现快速的数据绑定以及便捷的使用,本篇随笔介绍通过抽取常见字典列表,实现通用的字典类型绑定;以及通过自定义控件的属性处理,实现系统字典内容的快捷绑定的操作。 在我们创建下

    2024年02月08日
    浏览(57)
  • java eazyexcel 实现excel的动态多级联动下拉列表(1)使用名称管理器+INDIRECT函数

    将数据源放到一个新建的隐藏的sheet中 将选项的子选项的对应字典设置到名称管理器中(名称是当前选项的内容,值是他对应的子菜单的单元格范围,在1里面的sheet中) 子菜单的数据根据INDIRECT函数去左边那个单元格获取内容,根据内容去名称管理器中获取字典的key,也就是

    2024年01月22日
    浏览(49)
  • 微信小程序开发——使用Vant组件库van-dropdown-menu实现下拉列表切换页面内容

    请先根据官网要求安装好vant组件库并引入相关组件 1、思路 在页面中使用hidden属性判断是否选中当前信息,再隐藏其他所有内容,仅显示所选内容。 2、代码 wxml部分 js部分 3、实际效果(view模块中的内容可以根据实际开发调整)

    2024年02月14日
    浏览(42)
  • 【Faker+xlsxwriter】生成测试数据并写入Excel

    一、前言 在工具开发、测试过程中,经常需要使用一些测试数据。手动制造数据的话,可能需要花费大量精力和工作量,并且容易出错,这是Faker可以帮助我们生成一些虚拟测试数据。 faker是一个开源的python库,安装完成后只需要调用Faker库,就可以帮助我们创建需要的数据

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包