使用Python+openpyxl实现导出自定义样式的Excel文件

简介: 本文介绍了如何使用Python的openpyxl库导出具有自定义样式的Excel文件,包括设置字体、对齐方式、行列宽高、边框和填充等样式,并提供了完整的示例代码和运行效果截图。

前言

之前项目中的导出Excel文件操作都是在前端完成的,项目是由vue+vite构建的,效果还不错的,所需依赖包如下所示。

npm i xlsx@0.18.5
npm i xlsx-style-vite@0.0.2

现在了解了一下Python的openpyxl依赖库后,试一下编写脚本进行Excel导出,效果也不错的。

一、导入依赖

pip install openpyxl

二、示例代码

(1)export_excel_demo.py

#! /usr/bin/env python3
# -*- coding: utf-8 -*-

from openpyxl.styles import Alignment, PatternFill, Border, Side, Font
from openpyxl.workbook import Workbook

if __name__ == '__main__':
    # 定义表头键值对列表
    keyMap = {
   
   
        'hero': '英雄',
        'level': '等级',
        'gold': '金币',
        'kill': '击杀',
        'be_killed': '被击杀',
        'assists': '助攻',
        'score': '评分',
        'is_mvp': '是否MVP',
    }

    # 定义目标数组列表
    targetList = [
        {
   
   
            'hero': '云缨',
            'level': 15,
            'gold': 20013,
            'kill': 21,
            'be_killed': 5,
            'assists': 16,
            'score': 12.9,
            'is_mvp': True,
        },
        {
   
   
            'hero': '王昭君',
            'level': 15,
            'gold': 17336,
            'kill': 2,
            'be_killed': 6,
            'assists': 20,
            'score': 7.5,
            'is_mvp': False,
        },
        {
   
   
            'hero': '狄仁杰',
            'level': 15,
            'gold': 16477,
            'kill': 9,
            'be_killed': 8,
            'assists': 22,
            'score': 8.4,
            'is_mvp': False,
        },
        {
   
   
            'hero': '兰陵王',
            'level': 15,
            'gold': 16154,
            'kill': 15,
            'be_killed': 8,
            'assists': 14,
            'score': 8.6,
            'is_mvp': False,
        },
        {
   
   
            'hero': '赵怀真',
            'level': 15,
            'gold': 17414,
            'kill': 6,
            'be_killed': 6,
            'assists': 21,
            'score': 10.2,
            'is_mvp': False,
        },
    ]

    # 将目标对象列表转为二维数组列表
    processList = []
    for e in targetList:
        arr = []
        for i in keyMap:
            arr.append(e.get(i))
        processList.append(arr)

    # 将表头数组列表追加到二维数组列表中
    lableArr = []
    for i in keyMap:
        lableArr.append(keyMap.get(i) + '-' + i)
    processList.insert(0, lableArr)

    # 打印加工后的二维数组列表
    # print(processList)

    # 创建一个工作簿
    wb = Workbook()

    # 获取当前活动的工作表
    ws = wb.active

    # 设置工作表的名称
    ws.title = u'胜利匹配赛'

    # 往工作表写入数据
    r = 1
    for line in processList:
        for col in range(1, len(line) + 1):
            ws.cell(row=r, column=col).value = line[col - 1]
        r += 1

    # 设置行高和列宽
    ws.column_dimensions["A"].width = 15
    ws.column_dimensions["B"].width = 10
    ws.column_dimensions["C"].width = 20
    ws.column_dimensions["D"].width = 20
    ws.column_dimensions["E"].width = 20
    ws.column_dimensions["F"].width = 20
    ws.column_dimensions["G"].width = 20
    ws.column_dimensions["H"].width = 20
    ws.row_dimensions[1].height = 20

    for row in ws:
        # print(row)
        for cell in row:
            # print(cell)  # 单元格对象
            # print(cell.value)  # 单元格的值
            # print(cell.row)  # 单元格所在的列
            # print(cell.column)  # 单元格所在的行
            # print(cell.coordinate)  # 单元格的坐标,如:A1
            string = str(cell.coordinate)  # 单元格的坐标,如:A1

            # 在字符串中提取所有数字
            num = ''.join([char for char in string if char.isdigit()])
            # print(num)

            # 匹配非首行的所有单元格
            if not ('1' == str(num)):
                # 设置字体
                cell.font = Font(
                    name="Calibri",  # 字体
                    size=11,  # 字体大小
                    color="000000",  # 字体颜色,用16进制rgb表示
                    bold=False,  # 是否加粗,True/False
                    italic=False,  # 是否斜体,True/False
                    strike=False,  # 是否使用删除线,True/False
                    # underline='singleAccounting',  # 下划线, 可选'singleAccounting', 'double', 'single', 'doubleAccounting'
                )

                # 设置布局
                cell.alignment = Alignment(
                    horizontal='center',  # 水平对齐,可选general、left、center、right、fill、justify、centerContinuous、distributed
                    vertical='center',  # 垂直对齐, 可选top、center、bottom、justify、distributed
                    text_rotation=0,  # 字体旋转,0~180整数
                    wrap_text=False,  # 是否自动换行
                    shrink_to_fit=False,  # 是否缩小字体填充
                    indent=0,  # 缩进值
                )

                # 设置填充
                cell.fill = PatternFill(
                    patternType="solid",  # 填充类型,可选none、solid、darkGray、mediumGray、lightGray、lightDown、lightGray、lightGrid
                    fgColor="ffffcc",  # 前景色,16进制rgb
                    bgColor="ff2600",  # 背景色,16进制rgb
                    # fill_type=None,  # 填充类型
                    # start_color=None, # 前景色,16进制rgb
                    # end_color=None    # 背景色,16进制rgb
                )

                # 设置边框
                side = Side(
                    style="thin",  # 边框样式,可选dashDot、dashDotDot、dashed、dotted、double、hair、medium、mediumDashDot、mediumDashDotDot、mediumDashed、slantDashDot、thick、thin
                    color="000000",  # 边框颜色,16进制rgb表示
                )
                cell.border = Border(
                    top=side,  # 上
                    bottom=side,  # 下
                    left=side,  # 左
                    right=side,  # 右
                    diagonal=side  # 对角线
                )
            # 匹配首行的单元格
            else:
                # 设置字体
                cell.font = Font(
                    name="宋体",  # 字体
                    size=11,  # 字体大小
                    color="ffffff",  # 字体颜色,用16进制rgb表示
                    bold=False,  # 是否加粗,True/False
                    italic=False,  # 是否斜体,True/False
                    strike=False,  # 是否使用删除线,True/False
                    # underline='singleAccounting',  # 下划线, 可选'singleAccounting', 'double', 'single', 'doubleAccounting'
                )

                # 设置布局
                cell.alignment = Alignment(
                    horizontal='left',  # 水平对齐,可选general、left、center、right、fill、justify、centerContinuous、distributed
                    vertical='center',  # 垂直对齐, 可选top、center、bottom、justify、distributed
                    text_rotation=0,  # 字体旋转,0~180整数
                    wrap_text=False,  # 是否自动换行
                    shrink_to_fit=False,  # 是否缩小字体填充
                    indent=0,  # 缩进值
                )

                # 设置填充
                cell.fill = PatternFill(
                    patternType="solid",  # 填充类型,可选none、solid、darkGray、mediumGray、lightGray、lightDown、lightGray、lightGrid
                    fgColor="5e7ce0",  # 前景色,16进制rgb
                    bgColor="9bc2e6",  # 背景色,16进制rgb
                    # fill_type=None,  # 填充类型
                    # start_color=None, # 前景色,16进制rgb
                    # end_color=None    # 背景色,16进制rgb
                )

                # 设置边框
                side = Side(
                    style="thin",  # 边框样式,可选dashDot、dashDotDot、dashed、dotted、double、hair、medium、mediumDashDot、mediumDashDotDot、mediumDashed、slantDashDot、thick、thin
                    color="000000",  # 边框颜色,16进制rgb表示
                )
                cell.border = Border(
                    top=side,  # 上
                    bottom=side,  # 下
                    left=side,  # 左
                    right=side,  # 右
                    diagonal=side  # 对角线
                )

    # 将工作簿保存到磁盘
    wb.save('王者荣耀战绩.xlsx')

三、运行效果

四、参考资料

【openpyxl】设置样式(字体样式、行列宽高、对齐方式、边框、填充和渐变)_openpyxl alignment_冰冷的希望的博客-CSDN博客

目录
相关文章
|
20天前
|
机器学习/深度学习 存储 算法
解锁文件共享软件背后基于 Python 的二叉搜索树算法密码
文件共享软件在数字化时代扮演着连接全球用户、促进知识与数据交流的重要角色。二叉搜索树作为一种高效的数据结构,通过有序存储和快速检索文件,极大提升了文件共享平台的性能。它依据文件名或时间戳等关键属性排序,支持高效插入、删除和查找操作,显著优化用户体验。本文还展示了用Python实现的简单二叉搜索树代码,帮助理解其工作原理,并展望了该算法在分布式计算和机器学习领域的未来应用前景。
|
3天前
|
文字识别 Serverless 开发工具
【全自动改PDF名】批量OCR识别提取PDF自定义指定区域内容保存到 Excel 以及根据PDF文件内容的标题来批量重命名
学校和教育机构常需处理成绩单、报名表等PDF文件。通过OCR技术,可自动提取学生信息并录入Excel,便于统计分析和存档管理。本文介绍使用阿里云服务实现批量OCR识别、内容提取、重命名及导出表格的完整步骤,包括开通相关服务、编写代码、部署函数计算和设置自动化触发器等。提供Python示例代码和详细操作指南,帮助用户高效处理PDF文件。 链接: - 百度网盘:[链接](https://pan.baidu.com/s/1mWsg7mDZq2pZ8xdKzdn5Hg?pwd=8866) - 腾讯网盘:[链接](https://share.weiyun.com/a77jklXK)
25 5
|
1月前
|
监控 网络安全 开发者
Python中的Paramiko与FTP文件夹及文件检测技巧
通过使用 Paramiko 和 FTP 库,开发者可以方便地检测远程服务器上的文件和文件夹是否存在。Paramiko 提供了通过 SSH 协议进行远程文件管理的能力,而 `ftplib` 则提供了通过 FTP 协议进行文件传输和管理的功能。通过理解和应用这些工具,您可以更加高效地管理和监控远程服务器上的文件系统。
58 20
|
1月前
|
存储 数据采集 数据处理
如何在Python中高效地读写大型文件?
大家好,我是V哥。上一篇介绍了Python文件读写操作,今天聊聊如何高效处理大型文件。主要方法包括:逐行读取、分块读取、内存映射(mmap)、pandas分块处理CSV、numpy处理二进制文件、itertools迭代处理及linecache逐行读取。这些方法能有效节省内存,提升效率。关注威哥爱编程,学习更多Python技巧。
|
Python
Python中引入自定义路径下的用户自定义类
自定义类如下: import math class Circle: # Construct a circle object def __init__(self, radius = 1): self.
805 0
|
2月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
2月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2月前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
128 80
|
1月前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
71 5
Python高性能编程:五种核心优化技术的原理与Python代码
|
2月前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
56 14

热门文章

最新文章