平时的工作中总有一些需求可以用python来解决,但是平时解决掉之后并没有做记录,然后导致同样的需求重复出现后又去重新写脚本,非常滴不nice😄。有一个需求是excel表格中有若干条(上千条)关于番号和版本的记录(其中第一版为“N”版,其他版本是从1开始递增的整数),针对以上需求写了一个小脚本,此处整理后做个小记录。顺便说一句,今天心情不错呵呵🎈🎆🎇😄。

import openpyxl


# 从第二行开始遍历(假设第一行是表头)
def get_max_versions(file_path, name_idx, version_idx):
    # 读取 Excel 文件
    workbook = openpyxl.load_workbook(file_path)
    sheet = workbook.active  # 获取活动工作表

    # 获取表头(第一行)
    headers = [cell.value for cell in sheet[1]]  # sheet[1] 获取第一行,cell.value 获取单元格的值
    # 创建一个字典来存储每个名称及其最大版本
    max_versions = {}
    for row in sheet.iter_rows(min_row=2, max_col=len(headers), values_only=True):
        row = list(row)
        row[version_idx] = 0 if row[version_idx] == 'N' else int(row[version_idx])
        # 如果名称不存在字典中,或者当前版本大于已存储的最大版本,则更新
        if row[name_idx] not in max_versions or row[version_idx] > max_versions[row[name_idx]][version_idx]:
            max_versions[row[name_idx]] = row
    return headers, max_versions


def save_to_excel(headers, data, output_filename):
    # 创建一个新的 Excel 工作簿
    workbook = openpyxl.Workbook()
    sheet = workbook.active  # 获取活动工作表

    sheet.append(headers)

    # 将数组写入工作表
    for row in data:
        print(row)
        print(type(row))
        sheet.append(row)

    # 保存文件
    output_file_path = output_filename  # 输出文件路径
    workbook.save(output_file_path)

    print(f'数据已写入 {output_file_path}')


if __name__ == '__main__':
    headers, max_versions = get_max_versions(file_path='台账(1).xlsx', name_idx=0, version_idx=3)  # 名字或者番号对应第一列,版本在第三列
    save_to_excel(headers=headers, data=max_versions.values(), output_filename='output.xlsx')