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("======处理完成======")