合成后效果:
识别或者导出的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)
没空优化 跑的比较慢,每次都要全表比对是否是合并单元格,欢迎大家提出优化建议,或者提供更好的合并单元格的办法。