Python操作Excel之openpyxl

382 阅读4分钟

这主要是为了实现excel中的两份数据在Python中进行比较排序,然后再按顺序存入excel中,实现数据的自动排序。(因为爬取到的子网页中的数据,顺序是乱的,和主页中的信息匹配不上。)

直接上代码(test.py):

import datetime
import  os
# 1. 导包
# import openpyxl
from openpyxl import Workbook  # 新建excel时导入这个
from openpyxl import load_workbook  # 读取excel时导入这个

class OperationExcel:

    # 利用Python的宏来动态计算出项目的根目录
    # 好处:      __file__是Python的宏,返回的是Python文件的路径。os.path.abspath(__file__),返回的是Python文件的绝对路径
    #            但Python是一种脚本语言,它设计的目的就是为了取代Shell。一个Python项目中的很多个Python文件作为主程序来运行,是非常正常的。
    #            因此,使用计算程序绝对路径的方法,来获取项目根目录,就会出现问题。比如说,在不同层次的包下的Python文件,他们作为程序运行时,其需要提取的项目根目录的层次就会不同。
    #      其他被调用的Python文件中,难以正确提取项目根目录。
    #            而使用__file__宏时,每个Python文件是通过自己的文件相对于项目根目录的层次来获取项目根目录的。与哪个Python文件作为可执行程序是无关的。
    PROJECT_ABSOLUTE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    # 测试打印的项目根路径
    # print('PROJECT_ABSOLUTE_PATH:%s' % PROJECT_ABSOLUTE_PATH)



    # 2.打开文件
    wb = load_workbook(PROJECT_ABSOLUTE_PATH+'\spiders\log\job.xlsx')
    # 3.打开默认的表用active,也可以打开指定的表用sheet
    ws = wb.active
    # 获取表中最大的行数,最大的列数( ws.ssmax_column)
    row_counts = ws.max_row-1
    print("表中共有%d条(行)数据"%row_counts)  # 最大的行数及总共的数据条数
    print("处理数据的时间:",datetime.datetime.today())
    # 存放取出的第一个网页中爬取到的岗位名称
    positionNa = {}
    # 存放取出的岗位描述页的岗位名称
    positionNa_1 = {}
    # 存放取出的岗位描述的信息
    # data_jd = {}

    # 遍历取出三列的数据,并且使用key值存放每一个数据对应的行号。
    for row_count in range(row_counts):
        # +2是指,从第二行开始取值。因为第二行才是数据的开始行,ws.cell(row=行号,column=列号).value
       positionNa[row_count+2] = ws.cell(row=row_count+2,column=1).value

       positionNa_1[row_count+2] = ws.cell(row=row_count+2,column=9).value

       # data_jd[row_count+2] = ws.cell(row=row_count+2,column=10).value

    print("这是取到的第一个网页中的岗位名称:",positionNa)
    print("这是取到的岗位描述网页中的岗位名称:",positionNa_1)
    # print("这是取到的岗位描述的详细信息",data_jd)

    # 暂时存放已经对应好第一个网页中所有数据的,排好序的岗位详细信息的数据
    data = {}
    # 按顺序存放  第一个网页中的岗位名称 与 岗位描述页中的岗位名称 相等的行号
    data_count =[]

    #  循环比较:将岗位描述页中的岗位名称一个一个去和第一个网页中的岗位名称比较,比较相等的就记录行号。
    for positionNa_key,positionNa_value in positionNa.items():
        for positionNa_1_key,positionNa_1_value in positionNa_1.items():
            s1 = positionNa_value
            s2 = positionNa_1_value
            if s1 == s2:
                # 测试:打印相等的名称,看是否能匹配上
                # print(s1)
                # print(s2)
                #  记录行号
                data_count.append(positionNa_1_key)
                # 这是测试数据,也是最终的排序后的数据:将排好序的岗位描述信息,存入data,key:表示信息应该重新插入的行号。value: 表示对应的正确的信息。
                # data[positionNa_key] = ws.cell(row=positionNa_1_key,column=10).value
            pass
        pass
    # 这是测试数据,也是最终的排序后的数据:
    # print("这排好序的岗位描述信息,请拿此份数据和excel进行比较:  \n",data)
    # 打印排序好后的行号顺序。
    print("这是排序后的行号顺序,请按此行号顺序,重新存入岗位描述信息:",data_count)
    # 这是匹配相等的岗位名称数量
    print('匹配相等的岗位名称数量有:', len(data_count))

    # data2和data3都是测试数据,为了在控制台查看,是否完成排序。
    data2 =[]
    data3 = []

    # 表示从第几行的下一行开始存入数据,这里是从第三行插入数据。
    row_countin= 2

    # 这是说明在哪一列插入信息
    insert_column=ws.max_column+1
    print('插入排序好的岗位描述信息的列号为第%d列:'%insert_column)

    # 循环遍历匹配结果,然后将岗位详细信息,重新排序插入excel。
    for i in data_count:
        row_countin += 1
        # 以下两行为测试数据:
        data2.append(ws.cell(row=i,column=9).value)
        data3.append(ws.cell(row=i,column=10).value)

        # 这是在列中,插入列名
        ws.cell(row=1, column= insert_column).value = 'data_new_jd'
        # 这是在新的列中,插入排序好的岗位描述信息
        ws.cell(row=row_countin, column= insert_column).value = ws.cell(row=i,column=10).value
        pass
    # 测试数据,可以和excel中正确的数据进行比较
    print("重新排好序的岗位名称数量:",len(data2))
    print("重新排好序的岗位名称信息:",data2)
    print("重新排好序的岗位描述数量:",len(data3))
    print("重新排好序的岗位描述信息",data3)

    # 4.保存xlsx文件
    wb.save(PROJECT_ABSOLUTE_PATH+'\spiders\log\job.xlsx')
    pass