Python处理excel查找相同列内容并输出对应行数据
如默
撰写于 2023年 05月 18 日

前言

前两天帮同学处理了一个excel,可以用Python实现,记录一下。

正文

说明:有一个excel工作簿,含有两个表,sheet1和sheet2,这两个表都有基金名称这个字段,sheet1内容不重复,sheet2有重复,以sheet1基金名称为模板,在sheet2中查找,最后导出sheet2中含有sheet1内容的数据。

其实用vlookup,然后再去重就好了,但正好好久没有写python了,实现一下。

思路是这样的,先把sheet1和sheet2的基金名称存在列表里,然后,对比两个列表,查找出相同项的序号,这个序号是列表里面的,再把序号转换成真实的excel行号,最后,根据行号从sheet2中获取对应的行数据,写入新的excel文件,然后去除空行即可。

头一次用openpyxl模块,对于函数不是很熟悉,应该是有更简单的方式,不需要放在两个列表里面,这里就不再讨论

源代码:

import openpyxl as xl

# 加载源文件
wb = xl.load_workbook("source.xlsx")

# 选择当前工作表
source_sheet = wb["Sheet1"]

# 定义源数据列
source = []

# 遍历源数据表,将对应的列内容添加至数组
for i in range(1, source_sheet.max_row):
    source.append(source_sheet.cell(row=i + 1, column=4).value)

# 选择目标数据表
target_sheet = wb["Sheet2"]

# 定义目标数据列
target = []

# 遍历目标数据表,将对应的列内容添加至数组
for i in range(1, target_sheet.max_row):
    target.append(target_sheet.cell(row=i + 1, column=3).value)

# 定义匹配结果的行号
result_index = []

# 遍历源数据和目标数据,将相等的结果序号,存入刚才定义的列表
for i in range(len(target)):
    for j in range(len(source)):
        if source[j] == target[i]:
            result_index.append(i)

# 数组序号转换为真实的excel行号
result_index = [(i + 2) for i in result_index]

# 定义过滤后的字典(map)
data = {}

# 定义需要查找的列序号
column = ["A", "B", "C", "D", "E", "F", "G"]

# 根据获取到的行号,遍历取出相应的行数据
for i in result_index:
    for j in column:
        index = j + str(i)  # 拼接出单元格序号
        # 根据单元格序号获取对应的值,并将值存入字典
        data.update({index: target_sheet[index].value})

# 创建新excel表
wb2 = xl.Workbook()
sheet = wb2.active

# 重命名新表为result
sheet.title = "result"

# 将获取到的结果数据写入excel文件
for key in data:
    sheet[key] = data[key]

wb2.save("result.xlsx")

# 加载结果数据表
ws = wb2["result"]

# 过滤excel中的空行
rows_to_delete = []
for row in ws.iter_rows(min_row=1, max_row=ws.max_row):
    if all([cell.value is None for cell in row]):
        rows_to_delete.append(row)

for row in rows_to_delete:
    ws.delete_rows(row[0].row, 1)

# 保存结果文件
wb2.save("result.xlsx")

最后

附上原始数据表:source.xlsx

代码仅供参考,可以根据个人情况自行调整。

Python处理excel查找相同列内容并输出对应行数据

温馨提示:

本文最后更新于2023年05月18日,已超过344天没有更新,若内容或图片失效,请留言反馈。

前言

前两天帮同学处理了一个excel,可以用Python实现,记录一下。

正文

说明:有一个excel工作簿,含有两个表,sheet1和sheet2,这两个表都有基金名称这个字段,sheet1内容不重复,sheet2有重复,以sheet1基金名称为模板,在sheet2中查找,最后导出sheet2中含有sheet1内容的数据。

其实用vlookup,然后再去重就好了,但正好好久没有写python了,实现一下。

思路是这样的,先把sheet1和sheet2的基金名称存在列表里,然后,对比两个列表,查找出相同项的序号,这个序号是列表里面的,再把序号转换成真实的excel行号,最后,根据行号从sheet2中获取对应的行数据,写入新的excel文件,然后去除空行即可。

头一次用openpyxl模块,对于函数不是很熟悉,应该是有更简单的方式,不需要放在两个列表里面,这里就不再讨论

源代码:

import openpyxl as xl

# 加载源文件
wb = xl.load_workbook("source.xlsx")

# 选择当前工作表
source_sheet = wb["Sheet1"]

# 定义源数据列
source = []

# 遍历源数据表,将对应的列内容添加至数组
for i in range(1, source_sheet.max_row):
    source.append(source_sheet.cell(row=i + 1, column=4).value)

# 选择目标数据表
target_sheet = wb["Sheet2"]

# 定义目标数据列
target = []

# 遍历目标数据表,将对应的列内容添加至数组
for i in range(1, target_sheet.max_row):
    target.append(target_sheet.cell(row=i + 1, column=3).value)

# 定义匹配结果的行号
result_index = []

# 遍历源数据和目标数据,将相等的结果序号,存入刚才定义的列表
for i in range(len(target)):
    for j in range(len(source)):
        if source[j] == target[i]:
            result_index.append(i)

# 数组序号转换为真实的excel行号
result_index = [(i + 2) for i in result_index]

# 定义过滤后的字典(map)
data = {}

# 定义需要查找的列序号
column = ["A", "B", "C", "D", "E", "F", "G"]

# 根据获取到的行号,遍历取出相应的行数据
for i in result_index:
    for j in column:
        index = j + str(i)  # 拼接出单元格序号
        # 根据单元格序号获取对应的值,并将值存入字典
        data.update({index: target_sheet[index].value})

# 创建新excel表
wb2 = xl.Workbook()
sheet = wb2.active

# 重命名新表为result
sheet.title = "result"

# 将获取到的结果数据写入excel文件
for key in data:
    sheet[key] = data[key]

wb2.save("result.xlsx")

# 加载结果数据表
ws = wb2["result"]

# 过滤excel中的空行
rows_to_delete = []
for row in ws.iter_rows(min_row=1, max_row=ws.max_row):
    if all([cell.value is None for cell in row]):
        rows_to_delete.append(row)

for row in rows_to_delete:
    ws.delete_rows(row[0].row, 1)

# 保存结果文件
wb2.save("result.xlsx")

最后

附上原始数据表:source.xlsx

代码仅供参考,可以根据个人情况自行调整。


那年今日
05月
18日
赞 (0)

猜您想看

  • Git使用教程

    多人协作开发项目的时候,都是使用GitHub或者GitLab等,新手踩了很多坑,所以做此记录,方便查阅。 Git是目前世界上最先进的分布式版本控制系统(没有之一),更多内容就请自行百度。

    2019年07月24日
  • Magic Trackpad使用体验(Windows11 和 Mac OS13.2)

    如题,我购买了apple的Magic Trackpad和一台Mac Mini,但是后者预计发货时间在月底,可秒控板首先到了,没有Mac,不能测试触控板吗?幸好,我在全球最大的同性交友网站上找到了相关驱动,记录一下。

    2023年02月19日
  • 微信小程序使用阿里巴巴矢量图标库方法

    最近在写了一个小程序,原生组件里面的图标很少,而且不好看,这里记录一下如何使用阿里巴巴矢量图标库的方法。

    2023年07月18日
  • 技嘉小雕 RX 6750XT ELITE 12G独立显卡

    之前给自己的电脑换了硬件,但由于预算问题,唯独显卡没有更换,正好这次生日,就算是送我自己的生日礼物吧。

    2022年12月16日
  • 华为MateView 28.2显示器一周评测

    前两天之前买的AOC显示器出了一点故障,总是无法识别主机信号,动不动就无信号了,送回京东自营换新了,临时买了一个华为的显示器顶几天,发现了很多问题,分享一下。

    2023年01月23日
  • Docker自动更新镜像方法(定时任务或Watchtower)

    平时运行docker如果需要更新,则需要先停止原来的容器,更新新的镜像,然后再创建新容器,这样操作虽然不繁琐,但是如果容器过多,还是会很麻烦,本文记录一下如何简化自动更新。

    2023年11月22日

评论区(暂无评论)

这里空空如也,快来评论吧~

我要评论

Vaptcha 初始化中...