python-openpyxl和win32-修改excel

 excel文件是以月份作为sheet页,日作为首行列,实现每日巡检正常后对该日列下第3和16行赋值对号。

当excel多页时,openpyxl库修改excel打开后无法默认显示在修改页,为此可借鉴方法2--win32库(但此库只能在window下使用),后来换了种思路:每月1号将模板进行排序,然后将当月sheet页放在第一页,目前只能想到这么多。

openpyxl库实现

复制代码
from datetime import datetime
from openpyxl import load_workbook
import pandas as pd

def change_excel():
    try:
        today = datetime.today()
        sheet_name = today.strftime("%Y年%m月")   #excel页名
        col_name = today.strftime("%d日")        #excel列名
        # 打开Excel文件
        workbook=load_workbook("文件路径")    #读取excel
        print("读取文件开始修改")    

        # 选择指定的页
        sheet = workbook[sheet_name]   #指定excel页名
        # 读取首行作为列名
        df = pd.DataFrame(sheet.values)
        df.columns = df.iloc[0]
        df = df[1:]
        col=(df.columns.get_loc(col_name))
        # 将指定范围内的单元格内容改为"√",第{col+1}列下第3-16单元格改为√
        for row in sheet.iter_rows(min_row=3, max_row=16, min_col=col+1, max_col=col+1):
            for cell in row:
                cell.value = ""

        workbook.save("文件路径")    #覆盖保存
        print("修改完成,保存本地")

    except Exception as e:
        print(f"-修改excel异常{e}")
复制代码

win32和openpyxl结合范例

复制代码
import pandas as pd
from openpyxl import load_workbook
from datetime import datetime
import win32com.client as win32

def change_excel_test():
    try:
        today = datetime.today()
        sheet_name = today.strftime("%Y年%m月")   #页名
        col_name = today.strftime("%d日")        #列名

        workbook_moban = load_workbook(excel_moban_path)   #读取模板文件
        print(f"打开模板文件{excel_moban_path}")
        workbook_moban.save(filename=excel_path)    #另存为附件
        print(f"另存为文件为{excel_path}")

        excel = win32.gencache.EnsureDispatch('Excel.Application')
        workbook = excel.Workbooks.Open(excel_path)  

        sheet = workbook.Sheets(sheet_name)
        sheet.Select()    #使用Select方法选择了指定的工作表,以达到默认显示的效果

        # 获取列号
        col = None
        for i, value in enumerate(sheet.Rows(1).Value[0]):
            if value == col_name:
                col = i + 1
                break
        if col is None:
            bad_resules.append("excel日期列名未找到,修改excel失败")

        # # 获取单元格范围
        range_start = sheet.Cells(3, col)
        range_end = sheet.Cells(16, col)
        cell_range = sheet.Range(range_start, range_end)

        # 将单元格范围内的值改为"√"
        cell_range.Value = ""

        excel.DisplayAlerts = False  # 禁止显示警告对话框
        excel.Visible = False  # 后台运行Excel
        excel.ScreenUpdating = False  # 禁止屏幕刷新

        # 保存并关闭Excel文件
        workbook.Save()
        workbook.Close()
        excel.Quit()
        print("修改完成,保存本地完成")

        workbook_fujian = load_workbook(excel_path)   #读取附件
        workbook_fujian.save(filename=excel_moban_path)    #另存为模板
        print("另存为模板完成")
        

    except Exception as e:
        bad_resules.append("巡检结果正常---修改excel异常")
        print(f"巡检结果正常---修改excel异常{e}")
复制代码

每月1号模板排序

复制代码
def change_moban():
    try:
        today = datetime.today()
        sheet_name = today.strftime("%Y年%m月")   #页名
        col_name = today.strftime("%d日")        #列名

        # 打开Excel文件

        workbook_moban = load_workbook(excel_moban_path)   #读取模板文件
        # 获取所有 sheet 页,并按名称排序
        sorted_sheets = sorted(workbook_moban.sheetnames)
        # 将指定的 sheet 名称移动到第二个位置(即索引为 1)
        sorted_sheets.remove(sheet_name)   # 先从列表中移除该 sheet 名称
        sorted_sheets.insert(1, sheet_name)   # 再将其插入到所需位置
        # 重新排序后的 sheet 页名称列表
        print(sorted_sheets)
        # 将 sheet 页按排序后的顺序写回 Excel 文件
        workbook_moban._sheets.sort(key=lambda x: sorted_sheets.index(x.title))
        workbook_moban.save(excel_moban_path)


if __name__ == '__main__':
        # 获取现在的时间
    date = datetime.now().date()
    date_str = date.strftime("%d")
    if date_str == "01":
        change_moban()
        if SYSTEM_select=="windows_system":
            os.system("pip install -U chinesecalendar")
        elif SYSTEM_select=="linux_system":
            os.system("/opt/miniconda3/bin/pip3 install -U chinesecalendar")

    if is_workday(date):
        main()
    else:
        pass
复制代码

 

posted @   阿锋888  阅读(89)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示