import os
from openpyxl import load_workbook, Workbook
from openpyxl.utils import get_column_letter
from openpyxl.styles import NamedStyle

# 设置工作表窗格 A1 行的样式
title_style = NamedStyle(name='title_style')
title_style.font = title_style.font.copy(bold=True)
title_style.alignment = title_style.alignment.copy(horizontal='center', vertical='center')
title_style.border = title_style.border.copy(left=title_style.border.LEFT, right=title_style.border.RIGHT,
                                              top=title_style.border.TOP, bottom=title_style.border.BOTTOM)

# 加载原始 Excel 文件
filename = 'example.xlsx'
wb = load_workbook(filename)

# 获取第一个工作表
ws = wb.active

# 冻结窗格 A1 行
ws.freeze_panes = 'A2'

# 获取表头行
header_row = ws[2]

# 遍历表头行
for cell in header_row:
    if cell.value:
        # 获取列字母
        column_letter = get_column_letter(cell.column)
        # 获取列中所有相同内容的行
        column_values = {}
        for row in ws.iter_rows(min_row=3, values_only=True):
            if row[cell.column - 1] in column_values:
                column_values[row[cell.column - 1]].append(row)
            else:
                column_values[row[cell.column - 1]] = [row]
        # 创建新的工作表
        for value, rows in column_values.items():
            # 创建新的工作表
            new_wb = Workbook()
            new_ws = new_wb.active
            new_ws.title = value
            # 写入窗格 A1 的内容
            new_ws['A1'].value = ws['A1'].value
            new_ws['A1'].style = title_style
            # 写入表头行
            for header_cell in header_row:
                new_ws.cell(row=2, column=header_cell.column, value=header_cell.value)
            # 写入数据行
            for row_index, row in enumerate(rows):
                for cell_index, cell_value in enumerate(row):
                    new_ws.cell(row=row_index + 3, column=cell_index + 1, value=cell_value)
            # 保存新的工作表
            new_filename = value + '.xlsx'
            new_foldername = 'split_excel'
            if not os.path.exists(new_foldername):
                os.mkdir(new_foldername)
            new_wb.save(os.path.join(new_foldername, new_filename))

# 关闭原始 Excel 文件
wb.close()

代码功能

  1. 加载原始 Excel 文件(example.xlsx)。
  2. 冻结第一个工作表的 A1 行。
  3. 获取表头行(第二行)。
  4. 遍历表头行,依次获取每个单元格的值和列字母。
  5. 遍历工作表中所有行,获取对应列中所有相同内容的行,并将这些行存储到字典 column_values 中,键为相同值,值为对应行的列表。
  6. 遍历字典 column_values,针对每个键(相同值)创建新的工作表,并将对应行的列表写入工作表中。
  7. 将原始工作表中 A1 单元格的内容写入每个新工作表中的 A1 单元格。
  8. 将表头行写入每个新工作表中的第二行。
  9. 保存每个新工作表为一个新的 Excel 文件,文件名为相同值加 '.xlsx',并将所有新文件保存在名为 'split_excel' 的文件夹中,该文件夹位于桌面中。
  10. 关闭原始 Excel 文件。

代码说明

  • load_workbook(filename) 加载指定文件名(filename)的 Excel 文件。
  • wb.active 获取第一个工作表。
  • ws.freeze_panes = 'A2' 冻结 A1 行,使得 A1 行始终可见。
  • get_column_letter(cell.column) 获取单元格的列字母。
  • ws.iter_rows(min_row=3, values_only=True) 从第三行开始遍历所有行,并仅获取单元格的值。
  • row[cell.column - 1] 获取当前行中对应列的单元格值。
  • new_wb = Workbook() 创建新的工作表。
  • new_ws.title = value 设置新工作表的标题为相同值。
  • new_ws['A1'].value = ws['A1'].value 将原始工作表 A1 单元格的值写入新工作表 A1 单元格。
  • new_ws['A1'].style = title_style 为新工作表 A1 单元格应用 title_style 样式。
  • new_wb.save(os.path.join(new_foldername, new_filename)) 保存新工作表为新的 Excel 文件。
  • os.path.join(new_foldername, new_filename) 拼接新的 Excel 文件路径。
  • os.mkdir(new_foldername) 创建名为 'split_excel' 的文件夹。
  • wb.close() 关闭原始 Excel 文件。

使用说明

  1. 将代码保存为 Python 文件(例如:split_excel.py)。
  2. 确保将代码中的 filename 变量改为原始 Excel 文件名。
  3. 运行 Python 文件(python split_excel.py)。
  4. 代码会根据原始 Excel 文件中的内容生成多个新的 Excel 文件,并将这些文件保存到桌面上的 'split_excel' 文件夹中。

注意

  • 代码中假设原始 Excel 文件的表头行位于第二行,数据从第三行开始。
  • 代码会根据指定的列(通过遍历表头行获取)将所有相同值的行分组。
  • 代码不会覆盖已存在的 'split_excel' 文件夹,如果文件夹已存在,则会将新文件保存到该文件夹中。

示例

假设原始 Excel 文件 example.xlsx 中的数据如下所示:

| 产品名称 | 类别 | 价格 | | --- | --- | --- | | 苹果 | 水果 | 10 | | 香蕉 | 水果 | 5 | | 橘子 | 水果 | 8 | | 牛奶 | 饮料 | 15 | | 啤酒 | 饮料 | 20 |

运行代码后,会在桌面上生成名为 'split_excel' 的文件夹,并在该文件夹中生成两个新的 Excel 文件:

  • 水果.xlsx 包含所有类别为 '水果' 的行数据。
  • 饮料.xlsx 包含所有类别为 '饮料' 的行数据。

每个新 Excel 文件都包含原始 Excel 文件的格式和样式,以及原始 Excel 文件 A1 单元格的内容。

其他说明

  • 代码使用 NamedStyle 类设置 A1 单元格的样式。可以根据需要修改样式。
  • 代码可以根据实际情况调整 min_row 参数,以指定数据开始的行号。
  • 代码可以根据实际情况调整 new_foldername 变量,以更改新文件保存的文件夹名称。

希望这能帮助到您!如果您有任何其他问题,请随时提出。

Python Openpyxl 拆分表格:按列值生成多个 Excel 文件

原文地址: https://www.cveoy.top/t/topic/fW82 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录