• Python
  • openpyxl库在Excel自动化中的10个应用实例

  • @ 2024-11-16 15:07:51

引言在数据处理与分析领域,Excel 是一个不可或缺的工具。openpyxl 库作为 Python 中处理 Excel 文件的强大工具,提供了丰富的功能来简化各种操作。本文将详细介绍 openpyxl 库的基本使用方法,包括读取数据、写入数据、复制工作表、合并单元格、设置单元格样式、插入图片等,并通过一个实战案例来演示如何利用 openpyxl 进行销售数据分析。

1. 读取 Excel 文件数据

首先,让我们从最基本的开始——如何使用 openpyxl 库读取 Excel 文件中的数据。

# 导入必要的库
import openpyxl

# 加载工作簿
workbook = openpyxl.load_workbook('example.xlsx')

# 选择工作表
sheet = workbook.active

# 读取单元格值
cell_value = sheet['A1'].value
print("A1 的值是:", cell_value)

# 遍历所有行和列
for row in sheet.iter_rows(values_only=True):
    print(row)

代码解析:

  • 第一步,导入 openpyxl 库。
  • 使用 load_workbook 函数加载一个 Excel 文件。
  • 通过 active 属性获取活动的工作表。
  • 通过索引访问单元格并打印其值。
  • 使用 iter_rows 方法遍历所有行,打印每一行的内容。

2. 写入数据到 Excel 文件

接下来,我们将学习如何将数据写入到一个新的 Excel 文件中。

# 创建新的工作簿
wb = openpyxl.Workbook()

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

# 写入数据
ws['A1'] = 'Hello'
ws['B1'] = 'World'

# 保存文件
wb.save('output.xlsx')

代码解析:

使用 Workbook() 创建一个新的工作簿对象。 通过 active 属性获取活动工作表。 将字符串写入指定的单元格位置。 使用 save 方法保存工作簿到本地文件。

3. 复制工作表

有时候我们需要复制一个工作表到另一个工作簿中。

# 加载源工作簿
source_wb = openpyxl.load_workbook('source.xlsx')

# 加载目标工作簿
target_wb = openpyxl.load_workbook('target.xlsx')

# 获取源工作表
source_ws = source_wb.active

# 在目标工作簿中创建新工作表
target_ws = target_wb.create_sheet(title='New Sheet')

# 复制数据
for row in source_ws.iter_rows():
    row_data = [cell.value for cell in row]
    target_ws.append(row_data)

# 保存目标工作簿
target_wb.save('target.xlsx')

代码解析:

分别加载源工作簿和目标工作簿。 获取源工作簿中的活动工作表。 在目标工作簿中创建一个新的工作表。 使用 iter_rows 方法遍历源工作表的所有行,并将数据复制到目标工作表中。 保存修改后的目标工作簿。

4. 批量处理数据

在处理大量数据时,批量处理可以大大提高效率。下面是一个批量处理数据的例子。

# 导入必要的库
import openpyxl

# 加载工作簿
wb = openpyxl.load_workbook('example.xlsx')

# 获取工作表
ws = wb.active

# 批量处理数据
data = [
    ['Name', 'Age', 'City'],
    ['Alice', 25, 'New York'],
    ['Bob', 30, 'Los Angeles'],
    ['Charlie', 22, 'Chicago']
]

# 将数据写入工作表
for row in data:
    ws.append(row)

# 保存文件
wb.save('example.xlsx')

代码解析:

导入 openpyxl 库。 加载现有工作簿。 获取活动工作表。 定义一个包含多行数据的列表。 使用 append 方法将数据逐行写入工作表。 保存修改后的工作簿。

实战案例:销售数据分析

假设我们有一个包含销售数据的 Excel 文件,需要对这些数据进行处理和分析。具体任务如下:

  1. 读取数据:从 Excel 文件中读取销售数据。
  2. 数据清洗:删除无效或重复的数据。
  3. 计算总销售额:统计每个月的总销售额。
  4. 生成图表:绘制每个月销售额的折线图。

步骤 1: 读取数据

# 导入必要的库
import openpyxl

# 加载工作簿
wb = openpyxl.load_workbook('sales_data.xlsx')

# 获取工作表
ws = wb.active

# 读取数据
sales_data = []
for row in ws.iter_rows(values_only=True):
    sales_data.append(row)

代码解析:

加载销售数据的 Excel 文件。 获取活动工作表。 使用 iter_rows 方法读取所有行的数据,并存储在一个列表中。

步骤 2: 数据清洗

# 删除无效或重复的数据
valid_sales_data = []

for row in sales_data[1:]:
    if row[1] != '' and row[2] != '':
        valid_sales_data.append(row)

# 添加表头
valid_sales_data.insert(0, sales_data[0])

代码解析: 过滤掉无效或重复的数据行。 将有效数据存储在一个新的列表中。 重新插入表头。

步骤 3: 计算总销售额

# 计算每个月的总销售额
monthly_sales = {}
for row in valid_sales_data[1:]:
    month = row[0]
    amount = float(row[2])
    if month in monthly_sales:
        monthly_sales[month] += amount
    else:
        monthly_sales[month] = amount

代码解析:

遍历有效数据行,提取月份和金额。 使用字典统计每个月的总销售额。

步骤 4: 生成图表

# 导入必要的库
from openpyxl.chart import LineChart, Reference

# 创建新的工作表用于图表
chart_ws = wb.create_sheet(title='Monthly Sales')

# 将数据写入新的工作表
chart_ws.append(['Month', 'Total Sales'])
for month, amount in monthly_sales.items():
    chart_ws.append([month, amount])

# 创建图表对象
chart = LineChart()
chart.title = "Monthly Sales"
chart.style = 13
chart.x_axis.title = 'Month'
chart.y_axis.title = 'Sales'

# 添加数据
data = Reference(chart_ws, min_col=2, max_col=2, min_row=1, max_row=len(monthly_sales) + 1)
categories = Reference(chart_ws, min_col=1, max_col=1, min_row=2, max_row=len(monthly_sales) + 1)
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)

# 添加图表到工作表
chart_ws.add_chart(chart, "D1")

# 保存文件
wb.save('sales_data.xlsx')

代码解析:

创建一个新的工作表用于存放每月的总销售额。 将统计数据写入新的工作表。 创建折线图对象,并设置标题和轴标签。 使用 Reference 类引用数据和类别。 将图表添加到新的工作表中。 保存修改后的工作簿。

3 条评论

  • @ 2024-11-23 20:13:28

    • @ 2024-11-23 19:32:13

      • @ 2024-11-16 20:13:33
        import openpyxl
        import random
        name1 = "赵 、钱 、孙 、李 、 周、 吴、 郑、 王、 冯、 陈 、褚、 卫、 蒋、 沈、 韩 、杨、 朱、 秦 、尤 、许、 吕、 施 、张、孔、 曹 、严 、华、金、 魏 、陶、 姜、戚 、谢、 邹 、喻、 柏 、水、 窦 、章、 云 、苏 、潘 、葛 、奚 、范 、彭"
        name1 = name1.split("、")
        name2 = '''梦琪、忆柳、之桃、慕青、问兰、尔岚、元香、初夏、沛菡、傲珊、
        曼文、乐菱、痴珊、恨玉、惜文、香寒、新柔、语蓉、海安、夜蓉、
        涵柏、水桃、醉蓝、春儿、语琴、从彤、傲晴、语兰、又菱、碧彤、
        元霜、怜梦、紫寒、妙彤、曼易、南莲、紫翠、雨寒、易烟、如萱、
        若南、寻真、晓亦、向珊、慕灵、以蕊、寻雁、映易、雪柳、孤岚、
        笑霜、海云、凝天、沛珊、寒云、冰旋、宛儿、绿真、盼儿、晓霜、
        碧凡、夏菡、曼香、若烟、半梦、雅绿、冰蓝、灵槐、平安、书翠、
        翠风、香巧、代云、梦曼、幼翠、友巧、听寒、梦柏、醉易、访旋、
        亦玉、凌萱、访卉、怀亦、笑蓝、春翠、靖柏、夜蕾、冰夏、梦松、
        书雪、乐枫、念薇、靖雁、寻春、恨山、从寒、忆香、觅波、静曼、
        凡旋、以亦、念露、芷蕾、千兰、新波、代真、新蕾、雁玉、冷卉、
        紫山、千琴、恨天、傲芙、盼山、怀蝶、冰兰、山柏、翠萱、恨松、
        问旋、从南、白易、问筠、如霜、半芹、丹珍、冰彤、亦寒、寒雁、
        怜云、寻文、乐丹、翠柔、谷山、之瑶、冰露、尔珍、谷雪、乐萱、
        涵菡、海莲、傲蕾、青槐、冬儿、易梦、惜雪、宛海、之柔、夏青、
        亦瑶、妙菡、春竹、痴梦、紫蓝、晓巧、幻柏、元风、冰枫、访蕊、
        南春、芷蕊、凡蕾、凡柔、安蕾、天荷、含玉、书兰、雅琴、书瑶、
        春雁、从安、夏槐、念芹、怀萍、代曼、幻珊、谷丝、秋翠、白晴、
        海露、代荷、含玉、书蕾、听白、访琴、灵雁、秋春、雪青、乐瑶、
        含烟、涵双、平蝶、雅蕊、傲之、灵薇、绿春、含蕾、从梦、从蓉、
        初丹、听兰、听蓉、语芙、夏彤、凌瑶、忆翠、幻灵、怜菡、紫南、
        依珊、妙竹、访烟、怜蕾、映寒、友绿、冰萍、惜霜、凌香、芷蕾、
        雁卉、迎梦、元柏、代萱、紫真、千青、凌寒、紫安、寒安、怀蕊、
        秋荷、涵雁、以山、凡梅、盼曼、翠彤、谷冬、新巧、冷安、千萍、
        冰烟、雅阳、友绿、南松、诗云、飞风、寄灵、书芹、幼蓉、以蓝、
        笑寒、忆寒、秋烟、芷巧、水香、映之、醉波、幻莲、夜山、芷卉、
        向彤、小玉、幼南、凡梦、尔曼、念波、迎松、青寒、笑天、涵蕾、
        碧菡、映秋、盼烟、忆山、以寒、寒香、小凡、代亦、梦露、映波、
        友蕊、寄凡、怜蕾、雁枫、水绿、曼荷、笑珊、寒珊、谷南、慕儿、
        夏岚、友儿、小萱、紫青、妙菱、冬寒、曼柔、语蝶、青筠、夜安、
        觅海、问安、晓槐、雅山、访云、翠容、寒凡、晓绿、以菱、冬云、
        含玉、访枫、含卉、夜白、冷安、灵竹、醉薇、元珊、幻波、盼夏、
        元瑶、迎曼、水云、访琴、谷波、乐之、笑白、之山、妙海、紫霜、
        平夏、凌旋、孤丝、怜寒、向萍、凡松、青丝、翠安、如天、凌雪、
        绮菱、代云、南莲、寻南、春文、香薇、冬灵、凌珍、采绿、天春、
        沛文、紫槐、幻柏、采文、春梅、雪旋、盼海、映梦、安雁、映容、
        凝阳、访风、天亦、平绿、盼香、觅风、小霜、雪萍、半雪、山柳、
        谷雪、靖易、白薇、梦菡、飞绿、如波、又晴、友易、香菱、冬亦、
        问雁、妙春、海冬、半安、平春、幼柏、秋灵、凝芙、念烟、白山、
        从灵、尔芙、迎蓉、念寒、翠绿、翠芙、靖儿、妙柏、千凝、小珍'''
        
        name2 = name2.split("、")
        
        
        # 创建新的工作簿
        wb = openpyxl.Workbook()
        
        # 获取活动工作表
        ws = wb.active
        data =[['姓名', '语文', '数学', '英语', '总分']]
        
        for i in range(100):
            rr = []
            a = random.choice(name1)+random.choice(name2)
            rr.append(a)
            a1 = random.randint(60,99)
            a2 = random.randint(60,99)
            a3 = random.randint(60,99)
            rr.append(a1)
            rr.append(a2)
            rr.append(a3)
            rr.append(a1+a2+a3)
            data.append(rr)
        
        # 将数据写入工作表
        for row in data:
            ws.append(row)
        
        # 保存文件
        wb.save('output.xlsx')
        
        
        
        
        • 1