如何用Python脚本批量将Excel多列按|合并至新工作表?
解决Excel多列按行合并为单列的Python脚本问题
嘿,我懂你现在的需求啦——要把Excel里1800多行的每一行所有列用|分隔符合并成单列,并且存到新工作表里对吧?你的原代码只处理了单独一行,我们来调整一下,给你两种可选的方案:
方案1:直接计算合并后的值(静态结果)
这种方法会直接把合并后的文本写入新工作表,后续原表数据修改不会影响新表内容,适合需要固定结果的场景。
from openpyxl import load_workbook # 加载目标Excel文件 wb = load_workbook(filename='Filename.xlsx') # 获取存放原始数据的工作表 source_sheet = wb['Sheet1'] # 创建新工作表用于存储合并结果 combined_sheet = wb.create_sheet(title='Combined_Results') # 获取原表的最大行数和列数,自动适配数据范围 max_rows = source_sheet.max_row max_cols = source_sheet.max_column # 循环处理每一行(从第2行开始,假设第1行是表头;如果表头也要合并,就改成range(1, max_rows+1)) for row_num in range(2, max_rows + 1): row_contents = [] # 遍历当前行的每一列 for col_num in range(1, max_cols + 1): cell_val = source_sheet.cell(row=row_num, column=col_num).value # 处理空值:如果单元格为空,就用空字符串替代,避免出现连续的`||` row_contents.append(str(cell_val) if cell_val is not None else '') # 用`|`拼接当前行所有内容 merged_text = '|'.join(row_contents) # 将合并结果写入新工作表的对应行(新表从第1行开始) combined_sheet.cell(row=row_num - 1, column=1).value = merged_text # 给新工作表添加表头(可选) combined_sheet.cell(row=1, column=1).value = 'Merged Column' # 保存修改后的文件(建议用新文件名,避免覆盖原文件) wb.save("Filename_Merged.xlsx")
方案2:写入Excel公式(动态更新)
如果希望后续原表数据修改时,合并结果能自动更新,可以用这种方法,直接在新工作表中写入合并公式:
from openpyxl import load_workbook wb = load_workbook(filename='Filename.xlsx') source_sheet = wb['Sheet1'] combined_sheet = wb.create_sheet(title='Combined_Formulas') max_rows = source_sheet.max_row max_cols = source_sheet.max_column # 构建公式模板:生成类似 Sheet1!A{row}&"|"&Sheet1!B{row}... 的结构 column_refs = [f'Sheet1!{chr(64 + col)}{{row}}' for col in range(1, max_cols + 1)] formula_template = f'={"&\"|\"&".join(column_refs)}' # 循环为每一行写入公式 for row_num in range(2, max_rows + 1): # 替换模板中的{row}为当前行号 final_formula = formula_template.format(row=row_num) combined_sheet.cell(row=row_num - 1, column=1).value = final_formula # 添加表头(可选) combined_sheet.cell(row=1, column=1).value = 'Merged Formula' wb.save("Filename_Formula_Merged.xlsx")
关键说明
- 用
max_row和max_cols代替硬编码的列数(比如原代码里的A到G),这样不管你的表格有多少列,代码都能自动适配,不用手动修改。 - 空值处理:方案1中加入了空值判断,避免出现
||的情况;如果需要保留空值的位置(比如空单元格也要占一个|分隔的位置),可以去掉if cell_val is not None else ''的判断,直接写str(cell_val)。 - 新工作表命名:你可以根据自己的需求修改
create_sheet里的title参数。
内容的提问来源于stack exchange,提问作者Sophon
相关产品推荐
相关产品推荐

