openpyxl - 使用move_sheet,对工作簿的sheet排序

        在项目进行时,发现比较细的数据往往是最初进行处理和分析的,根据不同的维度统计和分析数据往往是根据最初的数据进行的,所以表格的数据往往跟我们的顺序是相反的,或者跟我们需求的顺序不一致。

排序的方法有两种:

  • 第一种:所有的完成之后单独进行排序,此时如果是新建的工作簿比较方便。
  • 第二种:在建立sheet的时候规定其位置,此方法可以用在新建的和打开的旧的的工作簿
函数: move_sheet
  • 语法:
move_sheet(title,n) 
# title :sheet名称
# n:负数表示向左移动,正数表示向右移动,数字表示移动几个位置
  • 实例:新建的工作簿
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = 'sheet1'
new_worksheet_summary = wb.create_sheet('sheet2',2)
# new_worksheet_summary.title = 'summary'
PN = wb.create_sheet('sheet3',1)
Project = wb.create_sheet()
Project.title = 'sheet4'
sort_lst = wb.sheetnames
print(sort_lst)

# output 
#['sheet1', 'sheet3', 'sheet2', 'sheet4']
desired_order = ['sheet4','sheet3','sheet2','sheet1']  # 以你期望的顺序列出工作表的名称

# 根据给定的顺序,重新排列工作表
for idx, sheet_name in enumerate(desired_order, 1):
    wb.move_sheet(sheet_name, idx)
sort_lst = wb.sheetnames
print(sort_lst)

# output 
# ['sheet4', 'sheet3', 'sheet2', 'sheet1']

  • 实例二:已经有的excel文件
    from openpyxl import Workbook
    from openpyxl import load_workbook
    wb = load_workbook(r'.\test.xlsx')
    sort_lst = wb.sheetnames
    print(sort_lst)
    # output 
    #['sheet4', 'sheet3', 'sheet2', 'sheet1']
    desired_order = ['sheet2','sheet1','sheet4','sheet3']  # 以你期望的顺序列出工作表的名称
    
    # 根据给定的顺序,重新排列工作表
    for idx, sheet_name in enumerate(desired_order, 1):
        wb.move_sheet(sheet_name, idx)
    sort_lst = wb.sheetnames
    print(sort_lst)
    # output 
    # ['sheet2', 'sheet1', 'sheet4', 'sheet3']
    wb.save(r'.\test2.xlsx')

 直接在创建sheet的时候指定sheet的位置
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = 'sheet1'
new_worksheet_summary = wb.create_sheet('sheet2',2)
# new_worksheet_summary.title = 'summary'
PN = wb.create_sheet('sheet3',1)
Project = wb.create_sheet()
Project.title = 'sheet4'
sort_lst = wb.sheetnames
sort_lst

总结:两种方案各自有各自的优缺点,使用move_sheet进行调整sheet的顺序的时候会存在一些bug,主要是在打开工作簿的时候会出现明明已经设定了顺序,但是保存之后的exeel文件中sheet的顺序不对。当使用在创建sheet的时候就设置sheet的位置,后期调整会很麻烦。

如果哪个大神可以给出解决第一种方案存在的bug的方案,小弟在此抱大腿。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
非常抱歉,我的错误。openpyxl 库中实际上没有名为 `copy_style` 的模块或函数。我之前的回答中的代码有误。 在这种情况下,我们可以使用 `openpyxl.styles` 模块中的 `copy` 方法来复制单元格的样式。以下是修正后的代码示例: ```python from openpyxl import load_workbook, Workbook from openpyxl.utils import get_column_letter from openpyxl.styles import copy def copy_data(file_path1, sheet1_name, file_path2, sheet2_name): # 加载工作簿1 wb1 = load_workbook(file_path1) # 获取 Sheet1 sheet1 = wb1[sheet1_name] # 创建新的工作簿2 wb2 = Workbook() # 获取或创建 Sheet2 if sheet2_name in wb2.sheetnames: sheet2 = wb2[sheet2_name] else: sheet2 = wb2.create_sheet(sheet2_name) # 复制列数据和格式 for col_idx in range(1, sheet1.max_column + 1): column_has_data = False for row_idx in range(1, sheet1.max_row + 1): cell = sheet1.cell(row=row_idx, column=col_idx) cell_value = cell.value if cell_value is not None: column_has_data = True new_col_idx = len(sheet2.columns) + 1 new_col_letter = get_column_letter(new_col_idx) sheet2.column_dimensions[new_col_letter].width = sheet1.column_dimensions[get_column_letter(col_idx)].width sheet2[new_col_letter + str(row_idx)].value = cell_value copy(source=cell, target=sheet2[new_col_letter + str(row_idx)]) if column_has_data: sheet2.move_range(f"A{row_idx}:{get_column_letter(new_col_idx)}{row_idx}", rows=-row_idx+1, cols=-new_col_idx+col_idx) # 保存工作簿2 wb2.save(file_path2) # 示例用法 copy_data('工作簿1.xlsx', 'Sheet1', '工作簿2.xlsx', 'Sheet2') ``` 在这个修改后的示例代码中,我们使用 `openpyxl.styles.copy` 方法来复制单元格的样式。我们将样式从源单元格复制到目标单元格,以保持原来的格式。 请确保你已经安装了 openpyxl 库,并替换示例用法中的文件路径和工作表名称为你实际使用的值。 非常抱歉给你带来的困惑。如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值