python 中基于 xlwings 处理 excel
程序员文章站
2024-02-23 19:27:34
...
今天接到一个小任务:
一个excel中存放着所有的学生数据,记为all_data
,其他两个excel也存放着部分学生数据,分别记为part_data
和part2_data
。part1_data
和part2_data
中所有的数据都是all_data
的子集。所有的数据中都有唯一的学生标识,即学号字段。
现在的要求是,在all_data
对应的excel标记出part1_data
和part2_data
中不存在的学生学号。
实现方法:
基于python
语言使用xwlings
处理。实现思路如下:
- 分别读取三个excel中的数据,然后保存到变量
all_data、lack1
和lack2
中,然后把lack1
和lack2
中的数据合并到concatenate_data
中。 - 遍历
all_data
中的每一个学号,检查这些学号是否存在于concatenate_data
中。若存在,则将其添加到存放缺失学号的数组lacks
中。 - 对
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
上一篇: [python]截取字符串