您好,登录后才能下订单哦!
# Python中openpyxl模块如何玩转Excel
## 一、前言:为什么选择openpyxl?
在数据分析和办公自动化领域,Excel文件处理是常见需求。Python作为最受欢迎的编程语言之一,提供了多个操作Excel的模块(如xlrd/xlwt、pandas等),而**openpyxl**因其独特优势脱颖而出:
- **全面支持.xlsx格式**:完美兼容Excel 2010+文件格式
- **读写兼备**:既能读取现有文件,也能创建新工作簿
- **丰富的API**:支持单元格格式、公式、图表等高级操作
- **纯Python实现**:无需安装Excel软件
- **活跃社区**:持续维护更新(最新版本3.1.2)
本文将带你从安装配置到实战应用,全面掌握这个强大的工具。
---
## 二、环境配置与基础操作
### 1. 安装openpyxl
```bash
pip install openpyxl
# 如需处理图片安装额外依赖
pip install pillow
from openpyxl import Workbook
# 创建空白工作簿
wb = Workbook()
# 获取活动工作表
ws = wb.active
# 写入数据
ws['A1'] = "Hello"
ws['B1'] = "World"
# 保存文件
wb.save("first_excel.xlsx")
# 单单元格写入
ws['A2'] = 42
ws.cell(row=3, column=1, value=3.14)
# 批量写入(效率更高)
data = [
["ID", "Name", "Score"],
[1, "Alice", 95],
[2, "Bob", 88]
]
for row in data:
ws.append(row)
# 使用公式
ws['D2'] = "=SUM(B2:C2)"
# 按坐标读取
print(ws['A1'].value)
# 遍历所有数据
for row in ws.iter_rows(values_only=True):
print(row)
# 按范围读取
for row in ws['A1:C3']:
for cell in row:
print(cell.value)
# 获取最大行列数
print(f"最大行:{ws.max_row}, 最大列:{ws.max_column}")
# 日期处理
from datetime import datetime
ws['A4'] = datetime.now()
# 布尔值
ws['B4'] = True
# 保存后读取时会自动转换类型
from openpyxl.styles import Font, Color
bold_font = Font(name='微软雅黑', size=14, bold=True, color='FF0000')
ws['A1'].font = bold_font
from openpyxl.styles import Border, Side, PatternFill
thin_border = Border(left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin'))
yellow_fill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid')
ws['B2'].border = thin_border
ws['B2'].fill = yellow_fill
from openpyxl.styles import Alignment, numbers
# 居中对齐
center_alignment = Alignment(horizontal='center', vertical='center')
ws['C3'].alignment = center_alignment
# 货币格式
ws['D2'].number_format = numbers.FORMAT_CURRENCY_USD_SIMPLE
# 创建/删除工作表
wb.create_sheet("月度报表", 0) # 插入到首位
del wb["Sheet"] # 删除默认表
# 工作表复制
source = wb["月度报表"]
target = wb.copy_worksheet(source)
target.title = "年度汇总"
# 添加数据验证
from openpyxl.worksheet.datavalidation import DataValidation
dv = DataValidation(type="list", formula1='"男,女"')
dv.add('B1:B10')
ws.add_data_validation(dv)
# 使用数组公式
ws['E1'] = '=SUM(IF(A1:A10>5,1,0))'
from openpyxl.chart import BarChart, Reference
chart = BarChart()
data = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=4)
categories = Reference(ws, min_col=1, min_row=2, max_row=4)
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)
ws.add_chart(chart, "E5")
from openpyxl import load_workbook
wb = load_workbook('large_file.xlsx', read_only=True)
# 处理完成后需手动关闭
wb.close()
wb = Workbook(write_only=True)
ws = wb.create_sheet()
# 只能使用append()添加整行数据
for row in range(10000):
ws.append([row, row*2])
import sqlite3
from openpyxl import Workbook
from openpyxl.chart import PieChart, Reference
from openpyxl.styles import Font, Alignment
def generate_sales_report():
# 连接数据库
conn = sqlite3.connect('sales.db')
cursor = conn.cursor()
# 获取数据
cursor.execute("SELECT product, amount FROM sales WHERE strftime('%Y-%m', date) = '2023-05'")
data = cursor.fetchall()
# 创建工作簿
wb = Workbook()
ws = wb.active
ws.title = "五月销售"
# 写入标题
ws['A1'] = "五月产品销售报表"
ws['A1'].font = Font(size=16, bold=True)
ws.merge_cells('A1:B1')
# 写入数据
ws.append(["产品名称", "销售额(元)"])
for row in data:
ws.append(row)
# 添加汇总公式
last_row = len(data) + 2
ws[f'A{last_row}'] = "总计"
ws[f'B{last_row}'] = f"=SUM(B2:B{last_row-1})"
# 创建饼图
chart = PieChart()
labels = Reference(ws, min_col=1, min_row=2, max_row=last_row-1)
values = Reference(ws, min_col=2, min_row=2, max_row=last_row-1)
chart.add_data(values, titles_from_data=False)
chart.set_categories(labels)
chart.title = "五月销售占比"
ws.add_chart(chart, "D2")
# 保存文件
wb.save("五月销售报表.xlsx")
conn.close()
generate_sales_report()
A: openpyxl不支持直接读取加密文件,建议先用其他工具解密或使用msoffcrypto-tool
库解密后再处理。
A: openpyxl会保留修改历史,可通过optimized_write=True
或手动清理冗余数据减少体积。
from openpyxl.utils import get_column_letter
for col in ws.columns:
max_length = 0
column = col[0].column_letter
for cell in col:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = (max_length + 2) * 1.2
ws.column_dimensions[column].width = adjusted_width
通过本文,你已经掌握了: - openpyxl的核心API使用方法 - Excel样式定制技巧 - 大数据量处理的优化方案 - 完整的自动化报表生成流程
进一步学习建议:
1. 官方文档:https://openpyxl.readthedocs.io
2. 结合Pandas进行复杂数据分析
3. 使用win32com
实现openpyxl不支持的Excel功能
4. 探索自动化报告邮件发送(搭配smtplib)
“自动化不是替代人类,而是让我们有更多时间解决更有价值的问题。” —— 佚名
现在就开始用openpyxl解放你的双手,让重复的Excel操作成为历史吧! “`
注:本文实际约3800字(含代码),可根据需要调整代码示例的复杂度或增加更多实战案例来精确控制字数。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。