Python实现对比两个Excel数据内容并标记出不同

  • Post category:Python

下面我就为您详细讲解如何使用Python实现比对两个Excel数据内容并标记出不同的完整实例教程。

步骤一:安装必要的库

为了完成这个任务,我们需要使用以下两个Python库:

  • pandas:用于处理Excel数据
  • openpyxl:用于和Excel文件进行交互

如果您还没有安装这两个库,请先在终端中执行以下命令进行安装:

pip install pandas openpyxl

步骤二:读取Excel数据

首先,我们需要读取两个Excel文件中的数据,并将它们转换成Pandas DataFrame格式,以方便进行比对。假设这两个Excel文件的文件名分别为file1.xlsxfile2.xlsx,则可以使用以下代码来读取它们:

import pandas as pd

# 读取文件1的数据
file1 = pd.read_excel('file1.xlsx')

# 读取文件2的数据
file2 = pd.read_excel('file2.xlsx')

步骤三:比对数据并标记不同

有了两个Excel文件的DataFrame格式数据,我们就可以开始比对它们了。我们需要将两个DataFrame合并成一个新的DataFrame,并添加一列来表示这行数据在哪个文件中出现过。接着,我们只需要比对两个文件在每个行的对应位置上的值是否相同,如果不相同就在该行的右侧标记出不同。

以下是完整的代码示例:

import pandas as pd
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.styles import Font, PatternFill
from openpyxl import Workbook

# 读取文件1的数据
file1 = pd.read_excel('file1.xlsx')

# 读取文件2的数据
file2 = pd.read_excel('file2.xlsx')

# 合并数据
merged_data = pd.concat([file1, file2], axis=1, join='inner')
merged_data.columns = ['file1', 'file2']

# 创建新的Excel文件
output_file = 'output.xlsx'
wb = Workbook()
ws = wb.active

# 将比对结果写入Excel文件中
for r in dataframe_to_rows(merged_data, index=False, header=True):
    ws.append(r)

    # 比对列的位置(即第一列为0)
    col_idx = len(merged_data.columns) - 1

    # 如果两个文件的值不同,标记出不同
    if r[1] != r[0]:
        ws.cell(row=ws.max_row, column=col_idx+1).fill = PatternFill(start_color='FF0000', end_color='FF0000', fill_type='solid') # 红色填充
        ws.cell(row=ws.max_row, column=col_idx+1).font = Font(color='FFFFFF') # 白色字体

# 保存Excel文件
wb.save(output_file)

在上面的示例中,我们首先使用concat()函数合并两个DataFrame,然后创建一个新的Excel文件,并将合并后的数据写入该文件中。接着,我们比对了两个文件在每个行的对应位置上的值,并在不同的位置标记出不同。最后,我们将标记后的结果保存到新的Excel文件中。

示例一:使用示例数据

假设我们有两个Excel文件,其中一个包含以下数据:

ID  Name    Score
1   Alice   90
2   Bob     85
3   Charlie 92

另一个包含以下数据:

ID  Name    Score
1   Alice   88
2   Bob     85
3   Charlie 92

如果我们对这两个文件进行比对,我们将会得到以下结果:

file1
ID  Name    Score
1   Alice   90
2   Bob     85
3   Charlie 92

file2
ID  Name    Score
1   Alice   88
2   Bob     85
3   Charlie 92

output
ID  Name file1   file2
1   Alice   90  88
2   Bob     85  85
3   Charlie 92  92

在新的Excel文件中,我们可以看到第一列显示的是原始文件中的数据,第二列显示的是比对后的结果,红色的单元格表示两个文件在该位置的值不同。

示例二:使用实际数据

下面我以两个实际的Excel文件为例来演示如何进行比对并标记不同的过程。

假设有两个Excel文件,其文件名分别为data1.xlsxdata2.xlsx。这两个文件每个文件都包含两个sheet,sheet名称分别为Sheet1和Sheet2。以下是数据示例:

data1.xlsx – Sheet1:

ID Name Age
1 Alice 20
2 Bob 25
3 Tom 30

data1.xlsx – Sheet2:

ID Gender City
1 F Beijing
2 M Shanghai
3 M Guangzhou

data2.xlsx – Sheet1:

ID Name Age
1 Alice 20
2 Bob 25
3 Tom 31

data2.xlsx – Sheet2:

ID Gender City
1 F Beijing
2 M Shanghai
3 M Shenzhen

现在我们需要对这两个文件进行比对并标记不同。我们可以使用以下代码:

import pandas as pd
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.styles import Font, PatternFill
from openpyxl import Workbook

# 读取文件1的数据
file1_sheet1 = pd.read_excel('data1.xlsx', sheet_name='Sheet1')
file1_sheet2 = pd.read_excel('data1.xlsx', sheet_name='Sheet2')

# 读取文件2的数据
file2_sheet1 = pd.read_excel('data2.xlsx', sheet_name='Sheet1')
file2_sheet2 = pd.read_excel('data2.xlsx', sheet_name='Sheet2')

# 合并Sheet1数据
merged_sheet1 = pd.merge(file1_sheet1, file2_sheet1, on='ID', how='inner')
merged_sheet1.columns = ['ID', 'Name', 'Age (file1)', 'Age (file2)']

# 合并Sheet2数据
merged_sheet2 = pd.merge(file1_sheet2, file2_sheet2, on='ID', how='inner')
merged_sheet2.columns = ['ID', 'Gender (file1)', 'City (file1)', 'Gender (file2)', 'City (file2)']

# 创建新的Excel文件
output_file = 'output.xlsx'
wb = Workbook()
ws1 = wb.create_sheet('Sheet1')
ws2 = wb.create_sheet('Sheet2')

# 将比对结果写入Excel文件中 - Sheet1
for r in dataframe_to_rows(merged_sheet1, index=False, header=True):
    ws1.append(r)

    # 比对列的位置(即第一列为0)
    col_idx = len(merged_sheet1.columns) - 1

    # 如果两个文件的值不同,标记出不同
    if r[2] != r[3]:
        ws1.cell(row=ws1.max_row, column=col_idx+1).fill = PatternFill(start_color='FF0000', end_color='FF0000', fill_type='solid') # 红色填充
        ws1.cell(row=ws1.max_row, column=col_idx+1).font = Font(color='FFFFFF') # 白色字体

# 将比对结果写入Excel文件中 - Sheet2
for r in dataframe_to_rows(merged_sheet2, index=False, header=True):
    ws2.append(r)

    # 比对列的位置(即第一列为0)
    col_idx = len(merged_sheet2.columns) - 1

    # 如果两个文件的值不同,标记出不同
    if r[1] != r[3] or r[2] != r[4]:
        ws2.cell(row=ws2.max_row, column=col_idx+1).fill = PatternFill(start_color='FF0000', end_color='FF0000', fill_type='solid') # 红色填充
        ws2.cell(row=ws2.max_row, column=col_idx+1).font = Font(color='FFFFFF') # 白色字体

# 保存Excel文件
wb.save(output_file)

在上面的示例中,我们首先使用read_excel()函数读取了两个Excel文件中的数据,然后使用merge()函数将两个文件中的数据合并到一起。接着,我们创建一个新的Excel文件,并将合并后的数据写入文件中。在这个示例中,我们没有使用concat()函数,而是使用了merge()函数,因为在这个实际的例子中,我们需要按照ID这一列来合并数据。

最后,我们使用了两个循环来将结果写入Excel文件中,以及在不同的位置标记出不同。请注意,在Sheet2中,我们需要比对每一行的两个不同的位置。

好了,以上就是如何使用Python实现对比两个Excel数据内容并标记出不同的完整实例教程。希望这能帮助到您。