0. 背景
工具是人类文明进步的阶梯,开源是一种精神,本文的代码献给有缘人。感谢参与改进的所有人,我将不征求你们的同意,将这玩意儿公开。
1. 代码
# -*- coding: utf-8 -*-
# TransMarkov.py
# @author: gw
# @contact: gw.hit.edu.cn
# @time: 20XX/X/XX 14:50
import openpyxl as opx
# 针对SY的马尔科夫矩阵,转换为GW可以接受的格式
'''转换代码使用指北
工具基础------->Pycharm,Python3.10
源代码一定要解密!源代码一定要解密!源代码一定要解密!
基础顶标高在载荷文件中写成了0.0,需要抬高0.4m进行处理后才可以进行载荷文件转化
SY载荷文件里面包含了多个sheet,其中Markov矩阵中的Mx My Mz/Fx Fy Fz分量与各工况下载荷分量是各占一个sheet,首先应对该Excel文件进行处理:
Step01 将载荷文件由.xls另存为.xlsx
Step02 将载荷文件拆分为两个文件,1个单独存放Markov矩阵,按照Mx My Mz Fx Fy Fz排列工作簿,并依次重新命名为0~5
另一个.xlsx文件存放极限载荷
Step03 将0~2sheet 中的130*i+2行(i=1,2,3,...sec_num)中的Cycle mean [kNm]替换为kNm,将3~5sheet 中的130*i+2行(i=1,2,3,...sec_num)中的Cycle mean [kN]替换为KN
Step04 104~107行的文件路径、文件名称、目标文件路径及总截面数量根据实际情况修改,注意应创建空的文件夹用于存档马尔科夫截面矩阵
Step05 运行程序,删除Markov_T_000k000.xlsx 文件,将所有数据压缩成*.zip格式
'''
def get_filename4save(info):
'''
用于SY马尔科夫列表中拿取的高度信息转化为GW马尔科夫矩阵文件名称所采用的格式
:param info: SY马尔科夫文件中给出包含该截面标高的信息
:param tail_num: 包含标高信息收尾数字(个、十、百)前的字符长度,info中字符长度不一样,
主要是弯矩和力的单位KNm和KN字符长度不同引起的,
如: 'Rainflow cycle distribution [Tower Mx, Tower station height= 0m]' 则info[50:]
:return: 马尔科夫文件名称,GW马尔科夫文件名称所采用的格式 ,如:Markov_T_022k240.xlsx
'''
# if component == 'Mx' or component == 'My' or component =='Mz':
'''if tail_num == 40:
height = float(info[tail_num:][:-2])
#print(height)
#height = float(info[tail_num:][:-3])
format_height = '{:0>7}'.format("{:.3f}".format(height)) #.nf 是精度控制,保留小数位数;{:0>7} 表示数字补0,(填充左边,宽度为7),需要根据title中的前序数据不断调整info[xx:]中xx的数据,比如28/50
filename4save = "Markov_T_" + str(format_height)[:3] + "k" + str(format_height)[-3:] + ".xlsx"
return filename4save
#else:
print("尾部字符数目输入有误!")
raise ValueError '''
# print(info, info[61:-3])
height = float(info[61:-3])
#print(height)
#height = float(info[tail_num:][:-3])
format_height = '{:0>7}'.format("{:.3f}".format(height)) #.nf 是精度控制,保留小数位数;{:0>7} 表示数字补0,(填充左边,宽度为7),需要根据title中的前序数据不断调整info[xx:]中xx的数据,比如28/50
filename4save = "Markov_T_" + str(format_height)[:3] + "k" + str(format_height)[-3:] + ".xlsx"
return filename4save
def write_new_format(path, old_filename, path_save, sec_num):
wb = opx.load_workbook(path + "\\" + old_filename) # 打开SY的马尔科夫文件
# ws = wb.get_sheet_by_name(old_file_sheetname) # 打开工作表 这个位置得看看哪些能些的对,哪些写的不对
for i in range(sec_num): # 按照截面依次循环
wb_new4save = opx.Workbook() # 创建新的Excel,存放GW格式的马尔科夫
file_name_buffer = set() # 创建集合,用于检测6个矩阵是否为统一标高截面的数据
sheetnames = wb.sheetnames
for j in sheetnames: # 按照分量循环
ws = wb.get_sheet_by_name(j) # 打开工作表 这个位置得看看哪些能些的对,哪些写的不对
info = ws.cell(i * 130 + 1, 1).value # 从马尔科夫文件中提取含标高和分量信息的单元格
c_n = info[14:16] # compnent_name, 提取分量信息
#tail_num = 40 if int(j) > 5 else 41
filename_i = get_filename4save(info)
file_name_buffer.add(filename_i) # 将文件名称放入创建好的集合中,若不是一个截面,那么集合元素将不唯一
ws_new = wb_new4save.create_sheet(c_n) # 创建分量对应的工作表
for u in range(129):
for v in range(129):
ws_new.cell(u + 11, v + 3).value = ws.cell(i * 130 + u + 1, v + 1).value # 逐行逐列复制数据
ws_new.cell(4, 3).value = 'Range'
ws_new.cell(5, 3).value = 'Circles'
for iii in range(128):
ws_new.cell(4, iii + 4).value = ws.cell(i * 130 + 2, iii + 2).value
Circles = 0
for jjj in range(128):
Circles += float(ws.cell(jjj + 2, iii + 2).value)
ws_new.cell(5, iii + 4).value = Circles
unit = 'KNm' if int(j) < 3 else 'KN'
ws_new.cell(2, 1).value = 'Component ' + c_n
ws_new.cell(3, 1).value = 'Equivalent Load: ' + c_n + '=' + 'xxx' + unit + '(m=4)'
if len(file_name_buffer) == 1:
filename4save = list(file_name_buffer)[0]
wb_new4save.remove_sheet(wb_new4save.get_sheet_by_name("Sheet"))
wb_new4save.save(path_save + "\\" + filename4save)
def main():
path = r"C:\Users\Lenovo\Desktop\测试" # SY马尔科夫文件所在路径
old_filename = "HybridTowerLoadResults_Markov.xlsx" # SY马尔科夫文件名称,*.xlsx格式,带后缀
path_save = r"C:\Users\Lenovo\Desktop\测试\HybridTowerLoadResults_Markov" #保存文件路径
# 存放转换为GW格式以后的马尔科夫文件的路径
sec_num = 58 # SY文件中包含的截面数量
write_new_format(path, old_filename, path_save, sec_num)
if __name__ == '__main__':
main()