当前位置: 首页 > news >正文

378_Python_python修改.xls表格,不改变表格原有样式,仅仅修改指定行、列的单元格内容

shell中调用:

        # 4. 调用Python脚本修改Excel
        python3 modify_excel.py \
            "$IE_VERSION" \
            "$EXCEL_PATH" \
            "$RELEASE_NOTES" \
            "$BUILD_LINK" \
            "$SOFTWARE_VERSION" \
            "$PRODUCT_MODEL_OLD" \
            "$CURRENT_DATE" \
            "$CURRENT_DATETIME" \
            "$BOARD_SIDE_LANGUAGE" \
            "$IE_LANGUAGE" \
            "$MY_PATH" \
            "$BUILD_NUMBER"

        if [ $? -ne 0 ]; then
            echo "修改Excel文件失败"
            exit 1
        fi

Python执行

import openpyxl
import xlrd 
from xlutils.copy import copy as xl_copy
import datetime
import sys


def unprotect_sheet(sheet):
    """解除工作表保护(无密码)。"""
    try:
        sheet.protection.disable()
        print(f"工作表 {sheet.title} 已解除保护")
    except Exception as e:
        print(f"解除保护失败:{e}")


def get_master_cell(sheet, row, column):
    """
    获取合并单元格的主单元格(左上角单元格)。
    如果不是合并单元格,返回自身。
    """
    for merged_range in sheet.merged_cells.ranges:
        if (row, column) in merged_range:
            return sheet.cell(merged_range.min_row, merged_range.min_col)
    return sheet.cell(row, column)


def update_ie_version(sheet, ie_version):
    """
    更新 IE 版本:第 9 行第 9 列。
    """
    try:
        row, column = 9, 9

        # 获取目标单元格(包括合并单元格的主单元格)
        target_cell = get_master_cell(sheet, row, column)

        # 强制更新为字符串
        print(f"目标单元格位置:({row}, {column}),当前值:{target_cell.value}")
        target_cell.value = str(ie_version)
        print(f"已成功更新单元格 ({row}, {column}) 的值为:{target_cell.value}")
    except Exception as e:
        print(f"更新 IE 版本失败,单元格位置 (行: {row}, 列: {column}),错误信息:{e}")
        raise


def update_svn_path(sheet, svn_path):
    """
    更新 构建链接地址:第 15 行第 3 列。
    """
    try:
        row, column = 15, 3

        # 获取目标单元格(包括合并单元格的主单元格)
        target_cell = get_master_cell(sheet, row, column)

        # 强制更新为字符串
        print(f"目标单元格位置:({row}, {column}),当前值:{target_cell.value}")
        target_cell.value = str(svn_path)
        print(f"已成功更新单元格 ({row}, {column}) 的值为:{target_cell.value}")
    except Exception as e:
        print(f"更新 Excel 文件路径失败,单元格位置 (行: {row}, 列: {column}),错误信息:{e}")
        raise


def read_txt_content(txt_path):
    """
    读取TXT文件内容,支持多种编码格式
    :param txt_path: TXT文件路径
    :return: 文件内容字符串,如果读取失败返回None
    """
    encodings = ['gb18030', 'gbk', 'gb2312', 'utf-8']  # 常用编码列表
    
    for encoding in encodings:
        try:
            with open(txt_path, 'r', encoding=encoding) as f:
                content = f.read().strip()
            print(f"成功使用 {encoding} 编码读取TXT文件内容: {content[:30]}...")  # 只打印前30个字符
            return content
        except UnicodeDecodeError:
            continue  # 尝试下一种编码
        except Exception as e:
            print(f"使用 {encoding} 编码读取文件时发生错误:{e}")
            continue
    
    print("所有支持的编码格式都无法正确读取文件内容")
    return None

def update_excel(excel_path, ie_version, release_Notes, build_link, software_version, 
                 product_model_old, current_date, current_datetime, Board_side_language, 
                 ie_language, txt_content=None, build_number=None):
    """
    更新 Excel 文件中的指定单元格内容。
    """
    try:
        if excel_path.endswith('.xls'):
            # 使用 xlrd 打开 .xls 文件
            workbook = xlrd.open_workbook(excel_path, formatting_info=True)
            wb_copy = xl_copy(workbook)
            sheet = wb_copy.get_sheet(0)

			/* !!!!! 只需要修改哪行哪列即可 !!!!! */
            # 更新第 2 行第 2, 输出日期
            sheet.write(1, 1, current_datetime)
            # 更新第 7 行第 3 列,产品型号旧
            sheet.write(6, 2, product_model_old)
            # 更新第 9 行第 3 列,发布时间
            sheet.write(8, 2, current_date)
            # 更新第 9 行第 9 列到第 12 列的合并单元格,IE端版本
            sheet.write_merge(8, 8, 8, 11, ie_version)
            # 更新第 11 行第 3 列,构建链接地址
            sheet.write(10, 2, build_number)
            # 更新第 15 行第 3 列,构建链接地址
            sheet.write(14, 2, build_link)
            # 更新第 16 行第 3 列,版本说明
            sheet.write(15, 2, release_Notes)
            # 更新第 17 行第 3 列,软件版本号(文件名)
            sheet.write(16, 2, software_version)
            # 更新第 19 行第 3 列,板端Logo/语言
            sheet.write(18, 2, Board_side_language)
            # 更新第 20 行第 3 列,IE端Logo/语言
            sheet.write(20, 2, ie_language)
            # 更新第 31 行第 3 列,修改内容
            if txt_content:
                sheet.write(30, 2, txt_content)
            # 更新第 34 行第 9 列,创建日期
            sheet.write(33, 8, current_date)

            # 保存修改
            wb_copy.save(excel_path)
            print(f"已保存修改后的文件:{excel_path}")
        else:
            print("仅支持 .xls 文件格式")
    except Exception as e:
        print(f"无法处理文件 {excel_path},错误信息:{e}")


if __name__ == '__main__':
    if len(sys.argv) != 13:
        print("用法: python modify_excel.py <1> <2> <3> <4> <5> <6> <7> <8> <9> <10> <11> <12>") 
        sys.exit(1)

	/* !!!!!只需要这里修改传入参数即可!!!!! */
    ie_version = sys.argv[1]
    excel_path = sys.argv[2]
    release_Notes = sys.argv[3]
    build_link = sys.argv[4]
    software_version = sys.argv[5]
    product_model_old = sys.argv[6]
    current_date = sys.argv[7]
    current_datetime = sys.argv[8]
    Board_side_language = sys.argv[9]
    ie_language = sys.argv[10]
    my_path = sys.argv[11]
    build_number = sys.argv[12]

    print("======开始处理 Excel 文件======")

    # 读取TXT文件内容
    txt_content = read_txt_content(my_path)

    update_excel(excel_path, ie_version, release_Notes, build_link, software_version, 
                 product_model_old, current_date, current_datetime, Board_side_language, 
                 ie_language, txt_content, build_number)
    print("======处理完成======")

相关文章:

  • 数仓开发那些事(10)
  • 【亚马逊云科技】大模型选型实战(挑选和测评对比最适合业务的大模型)
  • 实测 Gemini 2.0 Flash 图像生成:多模态 AI 的创作力边界
  • 如何打造企业 DevOps 文化
  • 【初学者】数据结构与算法关系解析
  • 【杂记一】虚拟环境以及项目依赖
  • 一个成功的Git分支模型
  • 深入了解Python的shutil模块
  • 流量层级、流量价格、流量速度如何突破?
  • 基于51单片机和LCD12864、DS3231、独立按键的万年历可调时钟+温度显示
  • 和鲸科技受邀赴中国气象局气象干部培训学院湖南分院开展 DeepSeek 趋势下的人工智能技术应用专题培训
  • 【Java】grpc-java在IDEA中build不成功的相关问题,Android,codegen C++语言排除
  • LeetCode135☞分糖果
  • 【每日论文】Rewards Are Enough for Fast Photo-Realistic Text-to-image Generation
  • 实现前端.ttf字体包的压缩
  • 日程提醒类软件选择用哪个?理由是什么?
  • error LNK2019: 无法解析的外部符号 main,函数 “int __cdecl invoke_main(void)“
  • 信创系统极速文件查找:locate 命令详解
  • 【初学者】请介绍一下指针分析(Pointer Analysis)?
  • 三.Go的第一个程序hello.go
  • 习近平同俄罗斯总统普京会谈
  • 国防部:奉劝有关国家不要引狼入室,甘当棋子
  • 以军总参谋长:已进入“决定性打击计划的第二阶段”
  • 纪念苏联伟大卫国战争胜利80周年阅兵彩排,解放军仪仗队亮相
  • A股三大股指收涨:军工股掀涨停潮,两市成交近1.5万亿元
  • 外交部发言人就当前印巴局势答记者问