批量合并单元格范围并保留全部内容 openpyxl

 合成后效果:

识别或者导出的excel内容,每一行有一部分数据,现在想把它们合并到一起,网上找了很多办法不能用只能自己python写了,代码水平有限仅供大家参考

# -*- codeing = utf-8 -*-
# @Time : 2023/10/12 13:38
# @Author : liu
# @File : ptexcel.py
# @Software : PyCharm

from openpyxl import load_workbook
from openpyxl.utils import range_boundaries
import re


def convert_to_merge_range(merge_string):
    # 提取字母部分和数字部分
    matches = re.findall(r"([A-Z]+)(\d+)", merge_string)
    if matches:
        start_col = matches[0][0]
        start_row = matches[0][1]
        end_col = matches[-1][0]
        end_row = matches[-1][1]

        # 合并范围字符串
        merge_range = f"{start_col}{start_row}:{end_col}{end_row}"

        return merge_range

    return None


def get_column_range(range_str, column):
    match = re.search(r'A(\d+):A(\d+)', range_str)
    if match:
        start_row = int(match.group(1))
        end_row = int(match.group(2))
        new_range = f'{column}{start_row}:{column}{end_row}'
        return new_range
    return None


def is_merged_range(workbook, sheet_name, range_str):
    wb = load_workbook(workbook)
    sheet = wb[sheet_name]
    merged_ranges = sheet.merged_cells.ranges
    for merged_range in merged_ranges:
        if range_str in merged_range:
            return True
    return False


def merge_cells_by_solid_border(file_path, sheet_name):
    # 加载工作簿
    wb = load_workbook(file_path)

    # 选择要处理的工作表
    ws = wb[sheet_name]

    merged = ["A3:A10", "A11:A18", "A19:A26", "A27:A34", "A35:A44", "A45:A52", "A53:A60", "A61:A68", "A69:A76",
              "A77:A84", "A85:A92", "A93:A102", "A103:A110", "A111:A134", "A135:A172", "A173:A179", "A180:A191"]
    

    for rangelist in merged:
        for column in range(ord('B'), ord('J') + 1):
            column_range = get_column_range(rangelist, chr(column))
            if column_range:
                is_merged = is_merged_range(file_path, "Sheet1", column_range)
                if is_merged is False:
                    start_row, start_col, end_row, end_col = range_boundaries(column_range)
                    # print(start_row, start_col, end_row, end_col)
                    values = []
                    for row in ws.iter_rows(min_row=start_col, min_col=start_row, max_row=end_col, max_col=end_row):
                        row_values = [cell.value for cell in row]
                        values.append(row_values)
                    ws.merge_cells(column_range)
                    stringvalue = ""
                    for row in values:
                        for value in row:
                            if value is not None:
                                stringvalue = stringvalue + str(value) + "\n"
                    print(stringvalue)
                    ws.cell(row=start_col, column=start_row).value = stringvalue
    # 保存工作簿
    wb.save("file_path1.xlsx")


# 调用示例
file_path = "你的excel文件.xlsx"  # 替换为您的 Excel 文件路径
sheet_name = "Sheet1"  # 替换为要处理的工作表名称
merge_cells_by_solid_border(file_path, sheet_name)

没空优化 跑的比较慢,每次都要全表比对是否是合并单元格,欢迎大家提出优化建议,或者提供更好的合并单元格的办法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值