- 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 文件,需要对这些数据进行处理和分析。具体任务如下:
- 读取数据:从 Excel 文件中读取销售数据。
- 数据清洗:删除无效或重复的数据。
- 计算总销售额:统计每个月的总销售额。
- 生成图表:绘制每个月销售额的折线图。
步骤 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 条评论
-
mrhowe SU @ 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