明白了,合并多个Excel文件时,要保留格式,并且表头是共用的。这其实是一道稍显复杂的“拼图题”,但我们可以逐步来解决。
为了做到这一点,主要步骤如下:
1. **读取多个Excel文件。**
2. **提取各个表格的内容(排除表头)。**
3. **将所有数据合并到一个新的Excel文件中,并只保留一个公用表头。**
4. **保留格式(使用`openpyxl`库来复制样式)。**
### 代码示例
这里是一个示例代码,包含了你所需要的功能:
import os
import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font
def get_tables_from_excel(filename, separators, sheet_name=0):
df = pd.read_excel(filename, sheet_name=sheet_name)
separator_rows = df[df.apply(lambda row: row.astype(str).str.contains('|'.join(separators)).any(), axis=1)].index.to_list()
tables = []
start = 0
for end in separator_rows:
if start != end:
table = df.iloc[start:end].reset_index(drop=True)
tables.append(table)
start = end + 1
if start < len(df):
table = df.iloc[start:].reset_index(drop=True)
tables.append(table)
return tables
def copy_styles(source_ws, dest_ws):
for r_idx, row in enumerate(source_ws.iter_rows()):
for c_idx, cell in enumerate(row):
new_cell = dest_ws.cell(row=r_idx+1, column=c_idx+1, value=cell.value)
if cell.has_style:
new_cell.font = Font(copy=cell.font)
new_cell.border = Border(copy=cell.border)
new_cell.fill = PatternFill(copy=cell.fill)
new_cell.number_format = cell.number_format
new_cell.protection = Protection(copy=cell.protection)
new_cell.alignment = Alignment(copy=cell.alignment)
def main(file_list, output_file, separators, sheet_name=0):
all_tables = []
header = None
for file in file_list:
tables = get_tables_from_excel(file, separators, sheet_name)
for idx, table in enumerate(tables):
if idx == 0 and header is None:
header = table.columns.tolist() # 第一张表的表头
all_tables.extend(table.values.tolist()[1:]) # 跳过表头
# 创建一个新的Excel文件并写入数据
with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
workbook = writer.book
worksheet = workbook.active
worksheet.append(header) # 添加表头
for row in all_tables:
worksheet.append(row)
# 保留格式
source_wb = load_workbook(file_list[0], read_only=True)
source_ws = source_wb[sheet_name]
copy_styles(source_ws, worksheet)
writer.save()
if __name__ == "__main__":
files = ["file1.xlsx", "file2.xlsx"] # 请替换为你的文件路径列表
output = "merged_output.xlsx"
separators = ["隔离文字1", "隔离文字2"] # 替换为你的分隔符
main(files, output, separators, sheet_name=0)
### 解释
1. **get_tables_from_excel**:从单个Excel文件中根据分隔符提取不同的小表格。
2. **copy_styles**:将样式从源工作表复制到目标工作表。
3. **main**:主函数
- 读取多个文件中的表格数据,并跳过表头。
- 将所有数据合并到一个新的Excel文件中,只添加一次表头。
- 保留格式
### 注意
- **路径问题**:确保文件路径正确。
- **表头**:假设第一张表的表头是标准表头,后面的表都采用同样的表头。
希望这个示例能帮到你,如果有任何疑问或需要进一步调整,随时告诉我哦!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |