Python Openpyxl 拆分表格:按列值生成多个 Excel 文件
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()
代码功能
- 加载原始 Excel 文件(
example.xlsx)。 - 冻结第一个工作表的 A1 行。
- 获取表头行(第二行)。
- 遍历表头行,依次获取每个单元格的值和列字母。
- 遍历工作表中所有行,获取对应列中所有相同内容的行,并将这些行存储到字典
column_values中,键为相同值,值为对应行的列表。 - 遍历字典
column_values,针对每个键(相同值)创建新的工作表,并将对应行的列表写入工作表中。 - 将原始工作表中 A1 单元格的内容写入每个新工作表中的 A1 单元格。
- 将表头行写入每个新工作表中的第二行。
- 保存每个新工作表为一个新的 Excel 文件,文件名为相同值加 '.xlsx',并将所有新文件保存在名为 'split_excel' 的文件夹中,该文件夹位于桌面中。
- 关闭原始 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 文件。
使用说明
- 将代码保存为 Python 文件(例如:
split_excel.py)。 - 确保将代码中的
filename变量改为原始 Excel 文件名。 - 运行 Python 文件(
python split_excel.py)。 - 代码会根据原始 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变量,以更改新文件保存的文件夹名称。
希望这能帮助到您!如果您有任何其他问题,请随时提出。
原文地址: https://www.cveoy.top/t/topic/fW82 著作权归作者所有。请勿转载和采集!