openpyxl 复制带格式的Excel 表格,并且合并

参考https://blog.csdn.net/weixin_45081575/article/details/124144987

实现了把多个 excel 文件合并成一个 excel,保存格式

import os
import copy
import openpyxl
from openpyxl.utils import get_column_letter as gcl

# 指定输入、输出文件路径



class SplitMultiSheet:


    def get_all_sheet(self, files):
        new_wb = openpyxl.Workbook()
        for file in files:
            wb = openpyxl.load_workbook(filename=file)
            for sn in wb.sheetnames:
                sheet = wb[sn]
                sheet2 = new_wb.create_sheet(sn)
                sheet2.sheet_properties.tabColor = sheet.sheet_properties.tabColor

                # 开始处理合并单元格形式为“(<CellRange A1:A4>,),替换掉(<CellRange 和 >,)' 找到合并单元格
                wm = list(sheet.merged_cells)
                if len(wm) > 0:
                    for i in range(0, len(wm)):
                        cell2 = str(wm[i]).replace('(<CellRange ', '').replace('>,)', '')
                        sheet2.merge_cells(cell2)
                #
                for i, row in enumerate(sheet.iter_rows()):
                    sheet2.row_dimensions[i + 1].height = sheet.row_dimensions[i + 1].height
                    for j, cell in enumerate(row):
                        sheet2.column_dimensions[gcl(j + 1)].width = sheet.column_dimensions[gcl(j + 1)].width
                        sheet2.cell(row=i + 1, column=j + 1, value=cell.value)

                        # 设置单元格格式
                        source_cell = sheet.cell(i + 1, j + 1)
                        target_cell = sheet2.cell(i + 1, j + 1)
                        target_cell.fill = copy.copy(source_cell.fill)
                        if source_cell.has_style:
                            target_cell._style = copy.copy(source_cell._style)
                            target_cell.font = copy.copy(source_cell.font)
                            target_cell.border = copy.copy(source_cell.border)
                            target_cell.fill = copy.copy(source_cell.fill)
                            target_cell.number_format = copy.copy(source_cell.number_format)
                            target_cell.protection = copy.copy(source_cell.protection)
                            target_cell.alignment = copy.copy(source_cell.alignment)
        # 第一个 Sheet 默认为 Sheet,可以选择删除
        if 'Sheet' in new_wb.sheetnames:
            del new_wb['Sheet']
        new_wb.save(f"res.xlsx")
        new_wb.close()


    def main(self):
        files = []
        for file in os.listdir("."):
            if file.endswith(".xlsx") and os.path.basename(file) != "res.xlsx":
                files.append(file)

        self.get_all_sheet(files)




if __name__ == '__main__':
    sms = SplitMultiSheet()
    sms.main()
    print('Done.')
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值