欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python 中基于 xlwings 处理 excel

程序员文章站 2024-02-23 19:27:34
...

今天接到一个小任务:
一个excel中存放着所有的学生数据,记为all_data,其他两个excel也存放着部分学生数据,分别记为part_datapart2_datapart1_datapart2_data中所有的数据都是all_data的子集。所有的数据中都有唯一的学生标识,即学号字段。

现在的要求是,在all_data对应的excel标记出part1_datapart2_data中不存在的学生学号。

实现方法:
基于python语言使用xwlings处理。实现思路如下:

  1. 分别读取三个excel中的数据,然后保存到变量all_data、lack1lack2中,然后把lack1lack2中的数据合并到concatenate_data中。
  2. 遍历all_data中的每一个学号,检查这些学号是否存在于concatenate_data中。若存在,则将其添加到存放缺失学号的数组lacks中。
  3. all_data对应的excel中指定的列进行遍历,若某个学号出现在了lacks中,则将这个单元格的背景设置为某种颜色。

excel的数据范围中,列用大写字母标识,行用数字表示,范围用左上角单元格到右下角,用冒号连接

代码:

import xlwings as xw


# 读取excel文件中的数据
def getExcelData(path, boundary, boundary_end=0):
    """
        :param path:         excel的路径
        :param boundary:     选取的excel数据范围,为开始点(左上角)到右侧(选取数据中的最后一列的列名)
        :param boundary_end: 选取的excel数据范围,设定了选取数据的最后一行
        :return: 指定范围的数据,存放于数组中
     """
    app = xw.App(visible=False, add_book=False)
    wb = app.books.open(path)  # 打开Excel文件
    sheet = wb.sheets[0]  # 选择第0个表单,一般都是第0个
    all_drug_date_length = str(sheet.used_range.last_cell.row)  # 获取数据的条数
    # 用户未指定数据的最后一行,则默认是所有数据中的条数
    end = str(boundary_end) if boundary_end else all_drug_date_length
    data = sheet.range(boundary + end).value  # 获取指定范围的数据
    wb.close()  # 关闭数据流
    return data   # 返回数据


def addColor(path, data, col, col_start, makeColor=(255, 0, 0)):
    """
        :param path: excel的路径
        :param data: 需要查找的数据
        :param col:  定义在哪一列中查找
        :param col_start: 定义在哪一行中开始查找
        :param makeColor: 定义标记后的背景颜色,RGB格式,默认为红色
    """
    app = xw.App(visible=False, add_book=False)
    wb = app.books.open(path)  # 打开Excel文件
    sheet = wb.sheets[0]  # 选择第0个表单,一般都是第0个
    all_drug_date_length = sheet.used_range.last_cell.row  # 获取数据的条数
    for i in range(col_start, all_drug_date_length + 1):
        # 每个需要遍历的单元格
        cell = col + str(i) + ":" + col + str(i)
        # 如果这个学号在data中存在,则进行标记
        if sheet.range(cell).value in data:
            # 将背景设置为makeColor对应的颜色
            sheet.range(cell).color = makeColor
    wb.save()  # 保存更改到excel中
    print('处理成功!')
    wb.close()


if __name__ == "__main__":
    # 读取三个excel中的数据
    # 最后面两个参数设定了数据范围,从A3到A4
    all_data = getExcelData('./excels/all_data.xlsx', "A3:A", 8)
    part1 = getExcelData('./excels/part1.xlsx', "A3:A", 4)
    part2 = getExcelData('./excels/part2.xlsx', "A3:A", 4)
    # 合并两个excel中的数据
    concatenate_data = part1 + part2
    # 存放缺少的学生的学号
    lacks = []
    for item in all_data:
        if item not in concatenate_data:
            lacks.append(item)
    # 最后面两个参数设定了遍历范围,从A3开始
    addColor("./excels/all_data.xlsx", lacks, "A", 3)

项目地址:
本人的代码和测试文件已经上传到了仓库中,把项目download下来后,打开项目,直接在命令行中运行main.py文件即可

python main.py

点我跳转到gitee仓库