Python处理表格合并后 保留表格格式问题

Python处理表格合并后 保留表格格式问题
表格合并去重后表格格式保留
(如我的1.xlsx里有颜色填充,我想要在合并的表格shuchu.xlsx中也有相应的填充颜色)

import pandas as pd

df1 = pd.read_excel('1.xlsx')
df2 = pd.read_excel(’2.xlsx')

df = pd.concat([df1, df2], ignore_index=True)
newDf = df.drop_duplicates(subset='流水号', ignore_index=True)

df.to_excel('shuchu.xlsx',index=False)



import openpyxl

# 定义一个列表,用来存储所有要合并的Excel文件名

file_names = ["file1.xlsx", "file2.xlsx", "file3.xlsx"]

# 创建一个新的Excel文件作为合并后的文件

merged_file = openpyxl.Workbook()

# 遍历所有要合并的Excel文件

for file_name in file_names:

    # 打开要合并的Excel文件

    wb = openpyxl.load_workbook(file_name)

    # 遍历所有的工作表

    for sheet_name in wb.sheetnames:

        # 获取要合并的工作表

        sheet = wb[sheet_name]

        # 获取工作表的所有行和列

        rows = sheet.rows

        columns = sheet.columns

        # 创建一个新的工作表,并将原工作表的名称设置为新工作表的名称

        new_sheet = merged_file.create_sheet(title=sheet_name)

        # 遍历原工作表的所有单元格,并将其复制到新工作表

        for row in rows:

            row_values = []

            for cell in row:

                row_values.append(cell.value)

            new_sheet.append(row_values)

        # 设置新工作表的列宽度和行高度等其他格式

        for column in columns:

            new_sheet.column_dimensions[column[0].column_letter].width = sheet.column_dimensions[column[0].column_letter].width

        for i in range(1, sheet.max_row+1):

            new_sheet.row_dimensions[i].height = sheet.row_dimensions[i].height

# 删除新工作表默认创建的第一张工作表

merged_file.remove(merged_file.active)

# 将合并后的Excel文件保存并关闭

merged_file.save("merged_file.xlsx")

merged_file.close()

参考GPT和自己的思路:如果想要保留原本表格填充颜色等格式,建议使用OpenPyXL库来操作Excel文件。具体操作是:

  1. 导入OpenPyXL库
import openpyxl
  1. 读取Excel文件
wb = openpyxl.load_workbook('shuchu.xlsx')
ws = wb.active
  1. 对表格进行遍历,获取所有单元格的位置和数据
data = {}
for row in ws.iter_rows():
    for cell in row:
        data[cell.coordinate] = cell.value
  1. 根据原本表格填充颜色等格式进行单元格格式的调整
for row in ws.iter_rows():
    for cell in row:
        if cell.fill.start_color.index != '00000000':
            # 如果单元格有填充颜色,设置新单元格的填充颜色
            new_cell = ws.cell(row=cell.row, column=cell.column)
            new_cell.fill = cell.fill
            new_cell.value = data[cell.coordinate]
        else:
            # 如果单元格没有填充颜色,直接设置新单元格的值
            new_cell = ws.cell(row=cell.row, column=cell.column)
            new_cell.value = data[cell.coordinate]
  1. 保存Excel文件
wb.save('shuchu.xlsx')

以上就是保留原本表格填充颜色等格式的Python处理表格合并后的操作方法。

参考GPT和自己的思路:如果想要保留表格填充颜色,可以使用第三方库openpyxl来实现。可以使用以下代码:

import pandas as pd
from openpyxl import load_workbook

df1 = pd.read_excel('1.xlsx')
df2 = pd.read_excel('2.xlsx')

df = pd.concat([df1, df2], ignore_index=True)
newDf = df.drop_duplicates(subset='流水号', ignore_index=True)

writer = pd.ExcelWriter('shuchu.xlsx', engine='openpyxl')
book = load_workbook('shuchu.xlsx')
writer.book = book

newDf.to_excel(writer, index=False, sheet_name='Sheet1')
worksheet = writer.sheets['Sheet1']

color_map = {'Red': 'FFFF0000', 'Green': 'FF00CD00'} # 填充颜色对应的RGB值
for idx, row in newDf.iterrows():
    for col_num, value in enumerate(row):
        cell = worksheet.cell(row=idx+2, column=col_num+1)
        if cell.fill.start_color.index in color_map.values():
            for k, v in color_map.items():
                if cell.fill.start_color.index == v:
                    cell.fill = PatternFill(start_color=v,
                                            end_color=v,
                                            fill_type='solid')
                    break

writer.save()

这个代码中,我们使用openpyxl来读取已存在的Excel文件,在新Sheet中写入新数据,并遍历该Sheet中的单元格,如果该单元格的填充颜色对应color_map中的RGB值,则将该单元格填充成对应RGB颜色。最后保存文件即可。

来自NewBing和LP的编写:

  • openpyxl库


import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import PatternFill

def copy_fill(from_cell, to_cell):
    if from_cell.fill.start_color.index != '00000000':
        fill = PatternFill(start_color=from_cell.fill.start_color.index,
                           end_color=from_cell.fill.start_color.index,
                           fill_type="solid")
        to_cell.fill = fill

# 读取数据
df1 = pd.read_excel('1.xlsx')
df2 = pd.read_excel('2.xlsx')

# 合并数据
df = pd.concat([df1, df2], ignore_index=True)
newDf = df.drop_duplicates(subset='流水号', ignore_index=True)

# 保存数据
newDf.to_excel('shuchu.xlsx', index=False)

# 打开源工作簿和目标工作簿
wb1 = load_workbook('1.xlsx')
wb2 = load_workbook('shuchu.xlsx')

# 获取工作表
sheet1 = wb1.active
sheet2 = wb2.active

# 遍历单元格,复制颜色
for i in range(1, sheet1.max_row+1):
    for j in range(1, sheet1.max_column+1):
        copy_fill(sheet1.cell(row=i, column=j), sheet2.cell(row=i, column=j))

# 保存目标工作簿
wb2.save('shuchu.xlsx')

这段代码假设你的源工作簿和目标工作簿的数据结构是完全相同的,即它们具有相同的行数和列数。如果它们的结构不同,你可能需要调整代码以适应你的实际情况。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
要保留表格格式,可以使用 openpyxl 模块。

  1. 安装 openpyxl
pip install openpyxl
  1. 在导出的 Excel 文件中保留样式,可以使用 openpyxl 中的样式对象 openpyxl.styles
# 导入 openpyxl 模块中的样式库
from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font

# 创建红色背景颜色填充对象
red_fill = PatternFill(start_color='FFC7CE', end_color='FFC7CE', fill_type='solid')

# 创建蓝色字体对象
blue_font = Font(color='FF0000')

# 样式对象
style_red = NamedStyle(name='style_red')
style_red.font = blue_font
style_red.fill = red_fill

# 获取 Pandas 对象
df1 = pd.read_excel('1.xlsx')
df2 = pd.read_excel('2.xlsx')

# 将上面创建的样式对象写到新的 Excel 文件中
with pd.ExcelWriter('shuchu.xlsx', engine='openpyxl') as writer:
    writer.book = load_workbook('shuchu.xlsx')
    style_red = writer.book.add_named_style(style_red)

    # 将 Pandas 对象写入新文件中,并设置样式
    df1.to_excel(writer, sheet_name='Sheet1', index=False, startrow=0, startcol=0)
    worksheet = writer.sheets['Sheet1']
    worksheet.conditional_formatting.add('C1:C{}'.format(len(df1)+1), CellIsRule(operator='lessThan', formula=['10000'], stopIfTrue=False, fill=red_fill))

    df2.to_excel(writer, sheet_name='Sheet1', index=False, startrow=len(df1)+1, startcol=0)
    worksheet = writer.sheets['Sheet1']
    worksheet.conditional_formatting.add('C{}:C{}'.format(len(df1)+1, len(df1)+len(df2)+1), CellIsRule(operator='greaterThan', formula=['50000'], stopIfTrue=False, font=blue_font))

上面的示例代码:

  • load_workbook 函数用于加载已有的 Excel 文件,以便向其中添加样式;
  • 使用 writer.book.add_named_style 函数添加自定义命名的样式;
  • conditional_formatting.add 函数可用于实现基于单元格值的不同格式设置;

此外,上述示例中的样式可以按照需求修改为其他颜色和样式。
如果我的回答解决了您的问题,请采纳!

以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

要保留合并后表格的格式,需要采取以下措施:

  1. 读取Excel文件时,指定dtype参数,将某些列识别为日期列、数字列等,保留其格式:
python
df1 = pd.read_excel('1.xlsx', dtype={'日期': str})

  1. 合并表格时,使用pd.concat()的join='outer'参数,填充NaN值而不是丢失数据:
python 
df = pd.concat([df1, df2], join='outer', ignore_index=True)

  1. 使用Style.apply()或loc对指定单元格应用格式:
python
def color_red(val): 
    color = 'red' if val > 0 else 'black'
    return 'color: %s' % color

df.style.apply(color_red, subset=['利润'])  
或
python  
df.loc[df['利润'] > 0, '利润'] = 'color: red'

  1. to_excel()方法指定excel_writer和sheet_name,并将df.style.apply()设置的格式一并导出:
python  
writer = pd.ExcelWriter('output.xlsx', engine='openpyxl') 
df.to_excel(writer, sheet_name='Sheet1')
writer.save()
openpyxl引擎可以最大限度保留DataFrame的格式和样式。

  1. 检查输出的Excel,确认格式是否正确保留。

以上代码实现了在合并去重DataFrame后最大限度保留其格式的功能。