pandas+XlsxWriter: 利用python自动化操作excel文件内容,简单实用,小白轻松上手!

219 阅读8分钟

背景介绍

image.png image.png

大家好。之前给大家介绍pandas+openpyxl+calamine: 利用python轻松操作excel类文件(写入图表数据)~ ,今天给大家介绍一个神器xlsxwriter库,它提供非常详细的函数接口,可以快速方便的定制化你的excel文件内容,轻松实现自动化办公。本文附带详细的python代码,干货满满。接下来进入今天的主题~ 本文涉及的python库版本信息如下:

# !pip install pyjanitor==0.26.0
# !pip install plottable==0.1.5 
# !pip install mpl_font==1.1.0
# !pip install mplcyberpunk
# !pip install  xlsxwriter==3.2.0
import numpy as np # linear algebra
import pandas as pd 
import pandas as pd
import numpy as np
import os
import janitor
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
# 完全屏蔽所有警告
import warnings
warnings.filterwarnings("ignore"print("pandas: ", pd.__version__)  # pandas:  2.2.0
print("numpy: ", np.__version__) # numpy: 1.26.4
print("matplotlib: ", mpl.__version__) # matplotlib:  3.7.5
print("seaborn: ", sns.__version__) # seaborn:  0.12.2

本文目录

xlsxWriter库操作

xlsxWriter库(其官方github:github.com/jmcnamara/X… 下面我给搭建介绍2个案例,以利用python自动插入迷你图和精美图表在excel文件中。

案例展示

自动向excel文件中插入迷你图

下面是一个使用python来自动向excel表格中

# 导入xlsxwriter库,用于创建和编辑Excel文件
import xlsxwriter

# 使用with语句创建一个新的Excel工作簿(文件名:"自动化生成excel文件.xlsx")
with xlsxwriter.Workbook("自动化生成excel文件.xlsx"as workbook:
    row = 1
    # 添加1个工作表(worksheet)到工作簿中
    worksheet1 = workbook.add_worksheet(name='sheet1')  # 第一个工作表
    worksheet2 = workbook.add_worksheet(name='sheet2')# 第二个工作表

    # 设置工作表1的第一列和第二列宽度以便于展示数据
    worksheet1.set_column("A:A"60)  # 设置第一列为60个字符宽
    worksheet1.set_column("B:B"50)   # 设置第二列为50个字符宽
    worksheet1.set_zoom(150)          # 设置工作表1的缩放比例为150%

    # 创建一个居中对齐并加粗的单元格格式
    centered_format = workbook.add_format({"align"'center''valign''vcenter'"bold"True})

    # 在工作表1的顶部写入标题行
    worksheet1.write("A1""Sparkline", centered_format)
    worksheet1.write("B1""Description", centered_format)

    # -------------------------------------------------------------------------
    # 开始逐个创建并配置sparklines(迷你图表)
    # 并在每个sparkline下方写出对应的描述文字

    # 默认线型sparkline,范围来自工作表2的A1:J1
    text = 'A default "line" sparkline.'
    worksheet1.add_sparkline("A2", {"range""Sheet2!A1:J1"})
    worksheet1.write(row, 1, text)  # 写入描述
    row += 1  # 行数递增1

    # 默认柱形sparkline,范围来自工作表2的A2:J2
    text = 'A default "column" sparkline.'
    worksheet1.add_sparkline("A3", {"range""Sheet2!A2:J2""type""column"})
    worksheet1.write(row, 1, text)
    row += 1

    # 默认胜败图sparkline,范围来自工作表2的A3:J3
    text = 'A default "win/loss" sparkline.'
    worksheet1.add_sparkline("A4", {"range""Sheet2!A3:J3""type""win_loss"})
    worksheet1.write(row, 1, text)
    row += 2

    # 线型sparkline带标记点
    text = "Line with markers."
    worksheet1.add_sparkline("A6", {"range""Sheet2!A1:J1""markers"True})
    worksheet1.write(row, 1, text)
    row += 1

    # 线型sparkline带有高点和低点突出显示
    text = "Line with high and low points."
    worksheet1.add_sparkline(
        "A7", {"range""Sheet2!A1:J1""high_point"True"low_point"True}
    )
    worksheet1.write(row, 1, text)
    row += 1

    # 线型sparkline带有首尾标记点
    text = "Line with first and last point markers."
    worksheet1.add_sparkline(
        "A8", {"range""Sheet2!A1:J1""first_point"True"last_point"True}
    )
    worksheet1.write(row, 1, text)
    row += 1

    # 线型sparkline带有负值标记点
    text = "Line with negative point markers."
    worksheet1.add_sparkline("A9", {"range""Sheet2!A1:J1""negative_points"True})
    worksheet1.write(row, 1, text)
    row += 1

    # 线型sparkline带有坐标轴
    text = "Line with axis."
    worksheet1.add_sparkline("A10", {"range""Sheet2!A1:J1""axis"True})
    worksheet1.write(row, 1, text)
    row += 2

    # 柱形sparkline使用默认样式1
    text = "Column with default style (1)."
    worksheet1.add_sparkline("A12", {"range""Sheet2!A2:J2""type""column"})
    worksheet1.write(row, 1, text)
    row += 1

    # 柱形sparkline使用预设样式2
    text = "Column with style 2."
    worksheet1.add_sparkline("A13", {"range""Sheet2!A2:J2""type""column""style"2})
    worksheet1.write(row, 1, text)
    row += 1

    # 柱形sparkline使用预设样式3至样式6
    for style_num in range(37):
        text = f"Column with style {style_num}."
        worksheet1.add_sparkline(
            f"A{row}", {"range""Sheet2!A2:J2""type""column""style": style_num}
        )
        worksheet1.write(row, 1, text)
        row += 1

    # 柱形sparkline使用自定义颜色
    text = "Column with a user defined color."
    worksheet1.add_sparkline(
        "A18", {"range""Sheet2!A2:J2""type""column""series_color""#E965E0"}
    )
    worksheet1.write(row, 1, text)
    row += 2

    # 胜败图sparkline
    text = "A win/loss sparkline."
    worksheet1.add_sparkline("A20", {"range""Sheet2!A3:J3""type""win_loss"})
    worksheet1.write(row, 1, text)
    row += 1

    # 胜败图sparkline带有负值突出显示
    text = "A win/loss sparkline with negative points highlighted."
    worksheet1.add_sparkline(
        "A21", {"range""Sheet2!A3:J3""type""win_loss""negative_points"True}
    )
    worksheet1.write(row, 1, text)
    row += 2

    # 从左至右排列的柱形sparkline(默认)
    text = "A left to right column (the default)."
    worksheet1.add_sparkline(
        "A23", {"range""Sheet2!A4:J4""type""column""style"20}
    )
    worksheet1.write(row, 1, text)
    row += 1

    # 从右至左排列的柱形sparkline
    text = "A right to left column."
    worksheet1.add_sparkline(
        "A24", {"range""Sheet2!A4:J4""type""column""style"20"reverse"True}
    )
    worksheet1.write(row, 1, text)
    row += 1

    # 单元格内同时包含sparkline与文本
    text = "Sparkline and text in one cell."
    worksheet1.add_sparkline(
        "A25", {"range""Sheet2!A4:J4""type""column""style"20}
    )
    worksheet1.write(row, 0"Growth")  # 写入类别标签
    worksheet1.write(row, 1, text)
    row += 2

    # 组合sparkline示例,三个sparkline共享相同的配置变化
    text = "A grouped sparkline. Changes are applied to all three."
    worksheet1.add_sparkline(
        "A27",
        {
            "location": ["A27""A28""A29"],
            "range": ["Sheet2!A5:J5""Sheet2!A6:J6""Sheet2!A7:J7"],
            "markers"True,
        },
    )
    worksheet1.write(row, 1, text)
    row += 1

    # -------------------------------------------------------------------------
    # 在第二个工作表中填充数据以供第一个工作表中的sparklines引用
    # 设置工作表2各列宽度为11个字符
    worksheet2.set_column("A:J"11)

    # 定义不同类型的样本数据
    data = [
        # 简单的线型数据
        [-223, -10, -23210],
        # 简单的柱形数据
        [3020332015551510],
        # 简单的胜败图数据
        [11, -1, -11, -1111, -1],
        # 不平衡直方图数据
        [567101520305070100],
        # 用于组合sparkline例子的数据
        [-223, -10, -23210],
         # 组合sparkline例子的第二组数据 
        [3, -10, -2321021],
         # 组合sparkline例子的第三组数据 
        [0, -232101231],
    ]
    # 将样本数据写入到工作表2的对应位置
    worksheet2.write_row("A1", data[0])  # 写入线型数据
    worksheet2.write_row("A2", data[1])  # 写入柱形数据
    worksheet2.write_row("A3", data[2])  # 写入胜败图数据
    worksheet2.write_row("A4", data[3])  # 写入不平衡直方图数据
    worksheet2.write_row("A5", data[4])  # 写入组合sparkline的第一组数据
    worksheet2.write_row("A6", data[5])  # 写入组合sparkline的第二组数据
    worksheet2.write_row("A7", data[6])  # 写入组合sparkline的第三组数据

可视化结果:

保存精美matplotlib可视化图表为对应的图片

import matplotlib.pyplot as plt
import mplcyberpunk
import mpl_font.noto
with plt.style.context("cyberpunk"):
    categories = ['成都''重庆''上海''西安''南京']
    values = [2567194510]
    colors = ["C0""C1""C2""C3""C4"]
    fig, axes =plt.subplots(2,2,figsize=(10,6))
    ## 绘制图一
    ax = axes[0,0]
    bars = ax.bar(categories, values, color=colors, zorder=1)
    ax.bar_label(bars)
    mplcyberpunk.add_bar_gradient(bars=bars,ax=ax)
    
    ## 绘制图四
    ax =axes[0,1]
    ax.plot([1395211], marker='o')
    ax.plot([4557986], marker='o') 
    mplcyberpunk.add_glow_effects(ax=ax, gradient_fill=False#使图形中的下方开启发光效果
#     ## 等价于
#     mplcyberpunk.make_lines_glow(ax=ax, alpha_line=0.3) # 使线条具有发光效果
#     mplcyberpunk.add_underglow(ax=ax,alpha_underglow=0.1) # 使线条下面发光效果

    ## 绘制图三
    ax = axes[1,0]
    x = np.linspace(0,7,20)
    y = np.sin(x) + 1
    ax.step(x, y, where='mid', marker='o', markersize=3)
    mplcyberpunk.add_gradient_fill(ax,alpha_gradientglow= 0.6, gradient_start='top')
    #  gradient_start in('min','max','bottom','top','zero')
    ax.legend(['mid'])
    
    ## 绘制图二
    axes[1,1].scatter([23357812],[3556676], marker='*')
    mplcyberpunk.make_scatter_glow(ax=axes[1,1],alpha=0.3# 使散点图有发光效果
    
    fig.suptitle('mplcyberpunk赛博朋克科技主题风格效果展示', fontsize=18)  # 调整字体大小和垂直位置

fig.tight_layout()
fig.savefig("demo.png",dpi=400)

可视化效果:

将图片结果插入对应的excel的页面指定的位置

# 导入xlsxwriter库,用于创建和编辑Excel文件
import xlsxwriter

# 使用with语句创建一个新的Excel工作簿(文件名:"自动化生成excel文件.xlsx")
with xlsxwriter.Workbook("自动化生成excel文件.xlsx"as workbook:
    # -------------------------------------------------------------------------
    # 在第二个工作表中填充数据以供第一个工作表中的sparklines引用
    worksheet2 = workbook.add_worksheet(name='sheet2')  # 第二个工作表
    # 设置工作表2各列宽度为11个字符
    worksheet2.set_column("A:J"11)

    # 定义不同类型的样本数据
    data = [
        # 简单的线型数据
        [-223, -10, -23210],
        # 简单的柱形数据
        [3020332015551510],
        # 简单的胜败图数据
        [11, -1, -11, -1111, -1],
        # 不平衡直方图数据
        [567101520305070100],
        # 用于组合sparkline例子的数据
        [-223, -10, -23210],
         # 组合sparkline例子的第二组数据 
        [3, -10, -2321021],
         # 组合sparkline例子的第三组数据 
        [0, -232101231],
    ]
    # 将样本数据写入到工作表2的对应位置
    worksheet2.write_row("A1", data[0])  # 写入线型数据
    worksheet2.write_row("A2", data[1])  # 写入柱形数据
    worksheet2.write_row("A3", data[2])  # 写入胜败图数据
    worksheet2.write_row("A4", data[3])  # 写入不平衡直方图数据
    worksheet2.write_row("A5", data[4])  # 写入组合sparkline的第一组数据
    worksheet2.write_row("A6", data[5])  # 写入组合sparkline的第二组数据
    worksheet2.write_row("A7", data[6])  # 写入组合sparkline的第三组数据

    # 在工作表2插入一个图片(例如:'demo.png')
    worksheet2.insert_image('A10''demo.png')

结果展示:

参考文档

  1. github.com/dhaitz/mplc…
  2. github.com/jmcnamara/X…

z先生说

大家好,今天给大家分享神器XlsxWriter库结合pandas等利用python轻松实现自动化办公excel文件定制化展示,简单易用,新人也可快速入手,功能丰富~

如果本文对你有帮助,还请你点赞在看转发。你的支持就是我创作的最大动力,关注下面公众号不迷路~

image.png