您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python中怎么利用openpyxl新增sheet
## 一、openpyxl库简介
### 1.1 openpyxl是什么
openpyxl是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它诞生于2010年,是当前Python生态中最主流的Excel操作库之一,具有以下核心特性:
- 完整支持Excel公式、格式、图表等高级功能
- 内存优化设计,可处理大型Excel文件
- 提供底层API和高级封装两种操作方式
- 活跃的社区支持和持续更新
### 1.2 与其他Excel库的对比
| 特性 | openpyxl | xlrd/xlwt | pandas | xlsxwriter |
|------------|----------|-----------|----------|------------|
| 读写支持 | 读写 | 读/写分开 | 读写 | 只写 |
| 大文件支持 | 优秀 | 一般 | 一般 | 优秀 |
| 格式支持 | 完整 | 基础 | 基础 | 完整 |
| 图表支持 | 支持 | 不支持 | 不支持 | 支持 |
### 1.3 安装openpyxl
```bash
pip install openpyxl
# 如需处理图片需要额外安装
pip install pillow
from openpyxl import Workbook
# 创建新工作簿(默认包含一个Sheet)
wb = Workbook()
# 获取默认Sheet(通常名为'Sheet')
default_sheet = wb.active
print(f"默认Sheet名称: {default_sheet.title}")
# 添加新Sheet(默认插入到最后)
new_sheet = wb.create_sheet("月度报表")
print(f"新建Sheet名称: {new_sheet.title}")
# 查看所有Sheet名称
print(f"当前所有Sheet: {wb.sheetnames}")
# 在索引0位置插入Sheet(最前面)
first_sheet = wb.create_sheet("年度汇总", 0)
# 在索引1位置插入Sheet
middle_sheet = wb.create_sheet("季度分析", 1)
# 最终Sheet顺序
print(f"当前Sheet顺序: {wb.sheetnames}")
# 输出: ['年度汇总', '季度分析', 'Sheet', '月度报表']
# 修改现有Sheet名称
default_sheet.title = "原始数据"
# 名称长度限制验证
try:
default_sheet.title = "这个名称非常长以至于超过了Excel的31个字符限制"
except Exception as e:
print(f"错误: {str(e)}")
from openpyxl.styles import Color
from openpyxl.styles.colors import RED, BLUE
# 使用RGB颜色设置
new_sheet.sheet_properties.tabColor = "FF0000" # 红色
# 使用预定义颜色
middle_sheet.sheet_properties.tabColor = BLUE
# 深拷贝Sheet(包括内容和格式)
copied_sheet = wb.copy_worksheet(new_sheet)
copied_sheet.title = "月度报表_备份"
# 验证复制结果
print(f"原始Sheet A1: {new_sheet['A1'].value}")
print(f"复制Sheet A1: {copied_sheet['A1'].value}")
# 隐藏Sheet
copied_sheet.sheet_state = "hidden"
# 完全隐藏(用户不可见)
# copied_sheet.sheet_state = "veryHidden" # 只能通过代码取消隐藏
# 显示Sheet
# copied_sheet.sheet_state = "visible"
from datetime import datetime
from openpyxl.utils import get_column_letter
def generate_monthly_sheets(wb, year):
"""生成全年月度Sheet"""
for month in range(1, 13):
# 创建带月份名称的Sheet
month_name = datetime(year, month, 1).strftime("%Y年%m月")
sheet = wb.create_sheet(month_name)
# 添加表头
sheet['A1'] = "日期"
sheet['B1'] = "销售额"
sheet['C1'] = "成本"
# 设置列宽
for col in range(1, 4):
sheet.column_dimensions[get_column_letter(col)].width = 15
return wb
wb = Workbook()
wb.remove(wb.active) # 移除默认Sheet
generate_monthly_sheets(wb, 2023)
print(f"生成的Sheet: {wb.sheetnames}")
import sqlite3
from openpyxl.styles import Font
def export_db_to_excel(db_path, excel_path):
"""将SQLite数据库表导出为多SheetExcel"""
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
wb = Workbook()
wb.remove(wb.active)
# 获取所有表名
tables = cursor.execute("SELECT name FROM sqlite_master WHERE type='table';").fetchall()
for table in tables:
table_name = table[0]
sheet = wb.create_sheet(table_name)
# 获取表数据
data = cursor.execute(f"SELECT * FROM {table_name};").fetchall()
columns = [desc[0] for desc in cursor.description]
# 写入表头
for col_num, col_name in enumerate(columns, 1):
sheet.cell(row=1, column=col_num, value=col_name).font = Font(bold=True)
# 写入数据
for row_num, row_data in enumerate(data, 2):
for col_num, cell_value in enumerate(row_data, 1):
sheet.cell(row=row_num, column=col_num, value=cell_value)
conn.close()
wb.save(excel_path)
return True
# 使用示例
# export_db_to_excel("example.db", "output.xlsx")
try:
# 尝试创建重复名称的Sheet
wb.create_sheet("月度报表")
except ValueError as e:
print(f"创建Sheet错误: {e}")
try:
# 尝试使用无效名称
wb.create_sheet("Invalid:Name")
except Exception as e:
print(f"无效Sheet名称: {e}")
# 启用只写模式提升性能
wb = Workbook(write_only=True)
# 注意:write_only模式下某些功能不可用
# 处理大文件时及时清理
del wb['大数据Sheet']
wb.save('large_file.xlsx')
from openpyxl import load_workbook
# 禁用缓存提升读取速度
wb = load_workbook('large.xlsx', read_only=True, keep_vba=False)
import os
def safe_save(wb, filename):
"""安全保存函数"""
if not filename.endswith('.xlsx'):
raise ValueError("仅支持.xlsx格式")
basename = os.path.basename(filename)
wb.save(basename)
# 加载时禁用宏
wb = load_workbook('file.xlsx', keep_vba=False)
import pandas as pd
def pandas_to_sheets(excel_path, data_dict):
"""将多个DataFrame保存到不同Sheet"""
with pd.ExcelWriter(excel_path, engine='openpyxl') as writer:
for sheet_name, df in data_dict.items():
df.to_excel(writer, sheet_name=sheet_name, index=False)
# 使用示例
data = {
"销售数据": pd.DataFrame({'产品': ['A', 'B'], '销量': [100, 200]}),
"用户统计": pd.DataFrame({'地区': ['北京', '上海'], '用户数': [500, 400]})
}
pandas_to_sheets("pandas_output.xlsx", data)
from openpyxl.chart import BarChart, Reference
def create_chart_sheet(wb, data_sheet_name):
"""创建带图表的Sheet"""
data_sheet = wb[data_sheet_name]
chart_sheet = wb.create_chartsheet(f"{data_sheet_name}_图表")
# 创建条形图
chart = BarChart()
data = Reference(data_sheet, min_col=2, max_col=3, min_row=1, max_row=5)
categories = Reference(data_sheet, min_col=1, min_row=2, max_row=5)
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)
# 将图表添加到chart sheet
chart_sheet.add_chart(chart)
return chart_sheet
# 使用前需确保数据Sheet有足够数据
# create_chart_sheet(wb, "月度报表")
openpyxl提供了全面而强大的Sheet操作能力,本文详细介绍了: 1. 基础Sheet创建、定位和命名 2. 高级特性如标签颜色、隐藏、复制等 3. 实战中的批量生成和数据导出模式 4. 性能优化和安全注意事项
通过合理运用这些功能,可以自动化生成复杂的Excel报表,大幅提升工作效率。建议读者结合实际需求,灵活组合使用这些技术。
方法/属性 | 说明 |
---|---|
Workbook() | 创建新工作簿 |
create_sheet() | 创建新Sheet |
remove() | 删除Sheet |
copy_worksheet() | 复制Sheet |
sheetnames | 获取所有Sheet名称列表 |
active | 获取/设置活动Sheet |
sheet_properties | 访问Sheet属性(如tabColor) |
本文基于openpyxl 3.1.2编写,大部分功能在3.0+版本中均可使用,部分高级特性可能需要更新版本。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。