python中怎么利用openpyxl 新增sheet

发布时间:2021-07-05 14:50:44 作者:Leah
来源:亿速云 阅读:2516
# 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

二、基础Sheet操作

2.1 创建工作簿时添加Sheet

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}")

2.2 在指定位置插入Sheet

# 在索引0位置插入Sheet(最前面)
first_sheet = wb.create_sheet("年度汇总", 0)

# 在索引1位置插入Sheet
middle_sheet = wb.create_sheet("季度分析", 1)

# 最终Sheet顺序
print(f"当前Sheet顺序: {wb.sheetnames}")  
# 输出: ['年度汇总', '季度分析', 'Sheet', '月度报表']

2.3 修改Sheet名称

# 修改现有Sheet名称
default_sheet.title = "原始数据"

# 名称长度限制验证
try:
    default_sheet.title = "这个名称非常长以至于超过了Excel的31个字符限制"
except Exception as e:
    print(f"错误: {str(e)}")

三、高级Sheet操作

3.1 设置Sheet标签颜色

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

3.2 复制现有Sheet

# 深拷贝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}")

3.3 隐藏/显示Sheet

# 隐藏Sheet
copied_sheet.sheet_state = "hidden"

# 完全隐藏(用户不可见)
# copied_sheet.sheet_state = "veryHidden"  # 只能通过代码取消隐藏

# 显示Sheet
# copied_sheet.sheet_state = "visible"

四、实战应用案例

4.1 批量生成多个月份Sheet

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}")

4.2 从数据库生成多个Sheet

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")

五、异常处理与最佳实践

5.1 常见错误处理

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}")

5.2 性能优化建议

  1. 批量操作模式
# 启用只写模式提升性能
wb = Workbook(write_only=True)
# 注意:write_only模式下某些功能不可用
  1. 内存管理
# 处理大文件时及时清理
del wb['大数据Sheet']
wb.save('large_file.xlsx')
  1. 缓存策略
from openpyxl import load_workbook

# 禁用缓存提升读取速度
wb = load_workbook('large.xlsx', read_only=True, keep_vba=False)

5.3 安全注意事项

  1. 验证输入文件名防止路径遍历
import os

def safe_save(wb, filename):
    """安全保存函数"""
    if not filename.endswith('.xlsx'):
        raise ValueError("仅支持.xlsx格式")
    basename = os.path.basename(filename)
    wb.save(basename)
  1. 处理宏安全
# 加载时禁用宏
wb = load_workbook('file.xlsx', keep_vba=False)

六、扩展应用

6.1 与Pandas集成

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)

6.2 生成动态图表Sheet

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报表,大幅提升工作效率。建议读者结合实际需求,灵活组合使用这些技术。

附录

A. openpyxl常用方法速查

方法/属性 说明
Workbook() 创建新工作簿
create_sheet() 创建新Sheet
remove() 删除Sheet
copy_worksheet() 复制Sheet
sheetnames 获取所有Sheet名称列表
active 获取/设置活动Sheet
sheet_properties 访问Sheet属性(如tabColor)

B. 推荐学习资源

  1. openpyxl官方文档
  2. 《Python自动化秘籍》- 第4章 Excel处理
  3. openpyxl GitHub仓库中的示例代码

C. 版本兼容说明

本文基于openpyxl 3.1.2编写,大部分功能在3.0+版本中均可使用,部分高级特性可能需要更新版本。 “`

推荐阅读:
  1. Python利用openpyxl库遍历Sheet的实例
  2. Python中openpyxl怎么实现vlookup函数

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python openpyxl

上一篇:微信小程序Page中如何实现data数据操作和函数调用

下一篇:微信小程序中srcoll-view组件有什么用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》