1,文档数据
文档A
批次编号 | 编号 | 风险等级 | 意见 |
ps001 | code1 | 低风险 | 同意 |
ps001 | code2 | 中风险 | 同意 |
ps001 | code3 | 低风险 | 同意 |
ps001 | code4 | 低风险 | 同意 |
ps001 | code5 | 低风险 | 同意 |
ps001 | code6 | 低风险 | 同意 |
ps002 | code11 | 低风险 | 同意 |
ps002 | code12 | 中风险 | 否决 |
ps002 | code13 | 低风险 | 否决 |
ps002 | code14 | 低风险 | 否决 |
ps002 | code15 | 中风险 | 否决 |
ps002 | code16 | 低风险 | 否决 |
ps002 | code17 | 中风险 | 否决 |
ps003 | code111 | 低风险 | 否决 |
ps003 | code112 | 低风险 | 否决 |
ps003 | code113 | 中风险 | 否决 |
ps003 | code114 | 低风险 | 同意 |
ps003 | code115 | 低风险 | 同意 |
ps003 | code116 | 中风险 | 同意 |
ps003 | code117 | 低风险 | 同意 |
文档B
批次编号 | 编号 | 风险等级 | 意见 |
ps001 | code1 | ||
ps001 | code2 | ||
ps001 | code3 | ||
ps001 | code4 | ||
ps001 | code5 | ||
ps001 | code6 | ||
ps002 | code11 | ||
ps002 | code12 | ||
ps002 | code13 | ||
ps002 | code14 | ||
ps002 | code15 | ||
ps002 | code16 | ||
ps002 | code17 | ||
ps003 | code111 | ||
ps003 | code112 | ||
ps003 | code113 | ||
ps003 | code114 | ||
ps003 | code115 | ||
ps003 | code116 | ||
ps003 | code117 | ||
ps004 | code118 | ||
ps005 | code119 | ||
ps006 | code120 | ||
ps007 | code121 | ||
ps008 | code122 | ||
ps009 | code123 | ||
ps010 | code124 |
2,匹配两列数据,复制单元格值
import pandas as pd
# 读取文档A和文档B
doc_A = pd.read_excel('A.xlsx') # 替换为实际文件路径
doc_B = pd.read_excel('B.xlsx') # 替换为实际文件路径
# 假设文档A的A列和B列对应的是ps1和code1,C列为需要复制的数据
# 遍历文档A
for index_A, row_A in doc_A.iterrows():
ps1 = row_A['批次编号'] # 替换'A'为实际列名
code1 = row_A['编号'] # 替换'B'为实际列名
c_value = row_A['风险等级'] # 获取文档A中C列的值,准备复制到文档B
d_value = row_A['意见'] # 获取文档A中C列的值,准备复制到文档B
# 在文档B中查找匹配的行
matching_rows = (doc_B['批次编号'] == ps1) & (doc_B['编号'] == code1)
# 如果找到匹配的行,将文档A的C列值复制到文档B的C列
if matching_rows.any():
doc_B.loc[matching_rows, '风险等级'] = c_value
doc_B.loc[matching_rows, '意见'] = d_value
# 保存修改后的文档B
doc_B.to_excel('文档B_修改后.xlsx', index=False) # 保存为新的文件
print("文档B已更新并保存。")
3,两文档两列数据不一致的,标记红色
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
# 读取文档A和文档B
doc_A = pd.read_excel('A.xlsx') # 替换为实际文件路径
doc_B = pd.read_excel('B.xlsx') # 替换为实际文件路径
# 假设文档A的"批次编号"和"编号"列用于匹配,风险等级为需要复制的数据
for index_A, row_A in doc_A.iterrows():
ps1 = row_A['批次编号']
code1 = row_A['编号']
c_value = row_A['风险等级']
d_value = row_A['意见']
# 在文档B中查找匹配的行
matching_rows = (doc_B['批次编号'] == ps1) & (doc_B['编号'] == code1)
# 如果找到匹配的行,将文档A的"风险等级"值复制到文档B
if matching_rows.any():
doc_B.loc[matching_rows, '风险等级'] = c_value
doc_B.loc[matching_rows, '意见'] = d_value
# 保存修改后的文档B
doc_B.to_excel('文档B_修改后.xlsx', index=False) # 保存为新的文件
print("文档B已更新并保存。")
# 保存修改后的文档B,并标记未匹配的行
# 加载文档B的Excel文件
wb = load_workbook('文档B_修改后.xlsx') # 替换为实际文件路径
ws = wb.active
# 定义红色填充样式
red_fill = PatternFill(start_color="FF0000", end_color="FF0000", fill_type="solid")
# 遍历文档B的行,标记未匹配的行(风险等级为空的行)
for row in ws.iter_rows(min_row=2, max_col=ws.max_column, max_row=ws.max_row):
# 获取批次编号和编号
ps1_cell, code_cell, risk_cell = row[0], row[1], row[2]
# 检查是否匹配到文档A中的数据
if doc_B[(doc_B['批次编号'] == ps1_cell.value) & (doc_B['编号'] == code_cell.value)]['风险等级'].isna().any():
# 如果没有匹配到,标记为红色
for cell in [ps1_cell, code_cell, risk_cell]:
cell.fill = red_fill
# 保存到新文件
wb.save('文档B_修改为红色.xlsx') # 保存为新的文件
print("文档B已更新并保存,未匹配的数据已被标记为红色。")
4,统计批次编号不一致的数量,输出该不一致的批次编号
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# 文件名:demo9.py
# 作者:Administrator
# 日期:2024/12/9
# 描述:
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
# 读取文档A和文档B
doc_A = pd.read_excel('A.xlsx') # 替换为实际文件路径
doc_B = pd.read_excel('B.xlsx') # 替换为实际文件路径
# 统计文档A和文档B中每个批次编号的数量
doc_A_counts = doc_A['批次编号'].value_counts().reset_index()
doc_B_counts = doc_B['批次编号'].value_counts().reset_index()
# 重命名列以便后续合并
doc_A_counts.columns = ['批次编号', 'A_count']
doc_B_counts.columns = ['批次编号', 'B_count']
# 合并两个统计结果
count_comparison = pd.merge(doc_A_counts, doc_B_counts, on='批次编号', how='outer')
# 找出数量不一致的批次编号
inconsistent_batches = count_comparison[count_comparison['A_count'].fillna(0) != count_comparison['B_count'].fillna(0)]
# 输出数量不一致的批次编号
if not inconsistent_batches.empty:
print("文档A和文档B中批次编号数量不一致的批次编号如下:")
print(inconsistent_batches[['批次编号', 'A_count', 'B_count']])
else:
print("文档A和文档B中批次编号数量一致。")
# 继续执行原有的数据更新和未匹配行标记操作
for index_A, row_A in doc_A.iterrows():
ps1 = row_A['批次编号']
code1 = row_A['编号']
c_value = row_A['风险等级']
d_value = row_A['意见']
# 在文档B中查找匹配的行
matching_rows = (doc_B['批次编号'] == ps1) & (doc_B['编号'] == code1)
# 如果找到匹配的行,将文档A的"风险等级"值复制到文档B
if matching_rows.any():
doc_B.loc[matching_rows, '风险等级'] = c_value
doc_B.loc[matching_rows, '意见'] = d_value
# 保存修改后的文档B
doc_B.to_excel('文档B_修改后.xlsx', index=False) # 保存为新的文件
print("文档B已更新并保存。")
# 保存修改后的文档B,并标记未匹配的行
# 加载文档B的Excel文件
wb = load_workbook('文档B_修改后.xlsx') # 替换为实际文件路径
ws = wb.active
# 定义红色填充样式
red_fill = PatternFill(start_color="FF0000", end_color="FF0000", fill_type="solid")
# 遍历文档B的行,标记未匹配的行(风险等级为空的行)
for row in ws.iter_rows(min_row=2, max_col=ws.max_column, max_row=ws.max_row):
# 获取批次编号和编号
ps1_cell, code_cell, risk_cell = row[0], row[1], row[2]
# 检查是否匹配到文档A中的数据
if doc_B[(doc_B['批次编号'] == ps1_cell.value) & (doc_B['编号'] == code_cell.value)]['风险等级'].isna().any():
# 如果没有匹配到,标记为红色
for cell in [ps1_cell, code_cell, risk_cell]:
cell.fill = red_fill
# 保存到新文件
wb.save('文档B_修改为红色.xlsx') # 保存为新的文件
print("文档B已更新并保存,未匹配的数据已被标记为红色。")