鱼C论坛

 找回密码
 立即注册
查看: 2324|回复: 6

[已解决]openpyxl之合并多个数据并修改列名

[复制链接]
发表于 2023-4-17 18:07:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

现有九个Excel表格名称为ABCDEFGHI,要求将这九个表格的第一列数据提取合并至一个新Excel表中命名为J,并且在J表中将ABCDEFGHI表中的第一列的列名对应修改为ABCDEFGHI
求大佬指教
最佳答案
2023-4-17 21:57:36
王大可2000 发表于 2023-4-17 21:54
提问:如果ABCD是文字呢?如Excel文件名为一二三四五六七八九,合并后各列的列名分别为一二三四五六七八 ...

你可以稍微修改一下之前的代码,将列名更改为给定的文本列名。以下是相应的修改:
import openpyxl

def merge_worksheets(filenames, column_names, output_file):
    # 创建一个新的工作簿
    merged_wb = openpyxl.Workbook()
    merged_ws = merged_wb.active

    # 遍历文件名
    for index, filename in enumerate(filenames, start=1):
        # 读取当前工作簿
        wb = openpyxl.load_workbook(filename)
        ws = wb.active

        # 提取第一列数据
        for row in ws.iter_rows(min_row=1, max_row=ws.max_row, min_col=1, max_col=1):
            for cell in row:
                new_cell = merged_ws.cell(row=cell.row, column=index, value=cell.value)

        # 修改列名
        merged_ws.cell(row=1, column=index, value=column_names[index - 1])

    # 保存新的工作簿
    merged_wb.save(output_file)

# 输入文件名列表和输出文件名
input_files = ['一.xlsx', '二.xlsx', '三.xlsx', '四.xlsx', '五.xlsx', '六.xlsx', '七.xlsx', '八.xlsx', '九.xlsx']
column_names = ['一', '二', '三', '四', '五', '六', '七', '八', '九']
output_file = '合并后的表格.xlsx'

# 合并工作表
merge_worksheets(input_files, column_names, output_file)

现在,将文件名列表和列名列表传递给merge_worksheets函数,将输入文件名列表中的工作簿合并为一个新的工作簿,并将列名设置为对应的column_names列表中的文本。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-17 18:07:48 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-4-17 18:09 编辑

您可以使用openpyxl库实现这个功能,具体的步骤如下:
import openpyxl

# 创建新的Excel文件J.xlsx,并获取其活动工作表
new_workbook = openpyxl.Workbook()
new_sheet = new_workbook.active
new_sheet.title = 'J'

# 遍历A至I这九个文件
for filename in ['A.xlsx', 'B.xlsx', 'C.xlsx', 'D.xlsx', 'E.xlsx', 'F.xlsx', 'G.xlsx', 'H.xlsx', 'I.xlsx']:
    workbook = openpyxl.load_workbook(filename)
    sheet = workbook.active
    
    # 获取当前文件的第一列数据
    column_data = [cell.value for cell in sheet['A']]

    # 将当前文件名对应的列名设置为第一列的值
    sheet.column_dimensions['A'].width = 20
    sheet['A1'] = filename[:-5]   # 去掉文件名中的.xlsx后缀
    sheet['A1'].font = openpyxl.styles.Font(bold=True)

    # 将第一列数据追加到新Excel表J的第一列中
    new_sheet.append(column_data)

    # 修改新Excel表J中的第一行为文件名
    new_sheet.cell(row=1, column=len(new_sheet.columns)).value = filename[:-5]
    new_sheet.cell(row=1, column=len(new_sheet.columns)).font = openpyxl.styles.Font(bold=True)

# 保存新Excel表J
new_workbook.save('J.xlsx')
解释一下代码流程:

  • 首先,在代码开头创建了新的Excel文件并获取了其中的活动工作表。
  • 然后,遍历A至I这九个文件,对于每个文件,首先获取其第一列的数据,并将该文件名对应的列名设置为第一列的值,然后将该文件的第一列追加到新Excel表J的第一列中。
  • 最后,修改新Excel表J的第一行为文件名,并保存该文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-17 18:16:51 | 显示全部楼层
你可以使用openpyxl库来实现这个任务。首先,确保你已经安装了openpyxl库。如果还没有安装,请运行以下命令进行安装:
pip install openpyxl

接下来,你可以使用以下代码来实现你的需求:
import openpyxl

def merge_worksheets(filenames, output_file):
    # 创建一个新的工作簿
    merged_wb = openpyxl.Workbook()
    merged_ws = merged_wb.active

    # 遍历文件名
    for index, filename in enumerate(filenames, start=1):
        # 读取当前工作簿
        wb = openpyxl.load_workbook(filename)
        ws = wb.active

        # 提取第一列数据
        for row in ws.iter_rows(min_row=1, max_row=ws.max_row, min_col=1, max_col=1):
            for cell in row:
                new_cell = merged_ws.cell(row=cell.row, column=index, value=cell.value)

        # 修改列名
        merged_ws.cell(row=1, column=index, value=chr(ord('A') + index - 1))

    # 保存新的工作簿
    merged_wb.save(output_file)

# 输入文件名列表和输出文件名
input_files = ['A.xlsx', 'B.xlsx', 'C.xlsx', 'D.xlsx', 'E.xlsx', 'F.xlsx', 'G.xlsx', 'H.xlsx', 'I.xlsx']
output_file = 'J.xlsx'

# 合并工作表
merge_worksheets(input_files, output_file)

这段代码将遍历输入的文件名列表,从每个工作簿的第一列提取数据并合并到新工作簿的新工作表中。同时,将列名修改为对应的A到I。最后,将新工作簿保存为指定的输出文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-17 21:54:57 | 显示全部楼层
isdkz 发表于 2023-4-17 18:16
你可以使用openpyxl库来实现这个任务。首先,确保你已经安装了openpyxl库。如果还没有安装,请运行以下命令 ...

提问:如果ABCD是文字呢?如Excel文件名为一二三四五六七八九,合并后各列的列名分别为一二三四五六七八九
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-17 21:57:36 | 显示全部楼层    本楼为最佳答案   
王大可2000 发表于 2023-4-17 21:54
提问:如果ABCD是文字呢?如Excel文件名为一二三四五六七八九,合并后各列的列名分别为一二三四五六七八 ...

你可以稍微修改一下之前的代码,将列名更改为给定的文本列名。以下是相应的修改:
import openpyxl

def merge_worksheets(filenames, column_names, output_file):
    # 创建一个新的工作簿
    merged_wb = openpyxl.Workbook()
    merged_ws = merged_wb.active

    # 遍历文件名
    for index, filename in enumerate(filenames, start=1):
        # 读取当前工作簿
        wb = openpyxl.load_workbook(filename)
        ws = wb.active

        # 提取第一列数据
        for row in ws.iter_rows(min_row=1, max_row=ws.max_row, min_col=1, max_col=1):
            for cell in row:
                new_cell = merged_ws.cell(row=cell.row, column=index, value=cell.value)

        # 修改列名
        merged_ws.cell(row=1, column=index, value=column_names[index - 1])

    # 保存新的工作簿
    merged_wb.save(output_file)

# 输入文件名列表和输出文件名
input_files = ['一.xlsx', '二.xlsx', '三.xlsx', '四.xlsx', '五.xlsx', '六.xlsx', '七.xlsx', '八.xlsx', '九.xlsx']
column_names = ['一', '二', '三', '四', '五', '六', '七', '八', '九']
output_file = '合并后的表格.xlsx'

# 合并工作表
merge_worksheets(input_files, column_names, output_file)

现在,将文件名列表和列名列表传递给merge_worksheets函数,将输入文件名列表中的工作簿合并为一个新的工作簿,并将列名设置为对应的column_names列表中的文本。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-17 22:08:46 | 显示全部楼层
isdkz 发表于 2023-4-17 21:57
你可以稍微修改一下之前的代码,将列名更改为给定的文本列名。以下是相应的修改:

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-17 22:10:05 | 显示全部楼层

不客气,如果答案对你有帮助的话,给个最佳答案支持一下呗!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 22:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表