导读: 大家好,我是小郭老师,硕士毕业于中科院,专注于运用 Python 深度集成 ANSYS 进行工程数值计算与仿真自动化开发,精通基于 Python实现ANSYS Workbench众多模块的全流程脚本驱动(建模、求解、后处理),并具备将复杂仿真流程封装为高效、可复用软件工具的专业能力,今天给大家分享一些ANSYS二次开发方面的干货。
之前给大家分享过导出ANSYS瞬态时域数据的方法《Python & ANSYS | 数据处理新突破:Python在Mechanical瞬态时域分析中的应用》。
今天再补充一种更灵活的实现方式。这种方法通过直接读取后处理表格数据并写入Excel,特别适合处理复杂结果对象的数据导出。
先上干货,直接看完整实现代码:
代码块
Python
自动换行
复制代码
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
import clr # 导入clr库,用于在Python中调用.NET库
clr.AddReference("Microsoft.Office.Interop.Excel") # 添加Excel互操作程序集引用
import Microsoft.Office.Interop.Excel as Excel # 导入Excel互操作库
import os # 导入os模块,处理文件路径
from System import Array # 导入.NET数组类
def extractresultdata_to_excel(result_names): # 定义数据导出函数,参数为结果名称列表
# 内部函数:将行列索引转换为Excel单元格地址(如1,1→A1)
def Cells(a, b):
return str(chr(a+96) + str(b)) # 通过ASCII码转换实现列字母生成
# 循环保存各结果对象数据
for result_name in result_names:
# 获取结果对象
resultobject = ExtAPI.DataModel.GetObjectsByName(result_name)[0]
# 向上遍历找到分析对象(获取工作目录需要)
obj = resultobject
while obj.GetType()!= Ansys.ACT.Automation.Mechanical.Analysis:
obj = obj.Parent # 循环获取父对象直到找到分析对象
analysis = obj
# 构建保存路径(工作目录下的user_files文件夹)
user_files_dir = os.path.join(analysis.WorkingDir, '../../../user_files')
file_name = os.path.join(user_files_dir, '%s_result.xlsx'%result_name)
# 激活结果对象(确保表格数据正确加载)
resultobject.Activate()
# 获取表格数据控件
paneTabular = ExtAPI.UserInterface.GetPane(MechanicalPanelEnum.TabularData)
control = paneTabular.ControlUnknown # 表格控件对象
# 获取表格行列数(+1是因为控件索引从0开始)
num_columns = control.ColumnsCount + 1
num_rows = control.RowsCount + 1
# 读取表格数据到二维列表
result = []
for row in range(1, num_rows):
r = []
for col in range(1, num_columns):
r.append(control.cell(row, col).Text) # 读取单元格文本
result.append(r) # 构建二维数据列表
# 初始化Excel操作
ex = Excel.ApplicationClass()
ex.Visible = False # 后台运行不显示窗口
ex.DisplayAlerts = False # 禁用保存提示
# 创建工作簿和工作表
workbook = ex.Workbooks.Add()
worksheet = workbook.Worksheets[1]
worksheet.Name = "Results" # 重命名工作表
# 创建.NET数组(Excel互操作需要特定格式)
array = Array.CreateInstance(object, len(result), len(result[0]))
for rowcount, row in enumerate(result):
for columncount, column in enumerate(row):
array[rowcount, columncount] = column # 填充数据
# 写入Excel并保存
worksheet.Range[Cells(1, 1), Cells(len(result[0]), len(result))].Value2 = array
workbook.SaveAs(file_name)
# 调试时可显示Excel窗口,生产环境建议注释
ex.Visible = True
# 执行示例:导出温度结果
result_names = ['result_Temperature', 'result_Total Heat Flux'] # 替换为你的结果名称
extractresultdata_to_excel(result_names) # 调用函数执行导出
复制成功
这种方法的本质是:直接读取ANSYS后处理界面中"表格数据"面板的内容,再通过Excel互操作将数据写入表格。相比之前分享的方法,它更贴近用户操作习惯,不需要手动定义变量名。
代码块
Python
自动换行
复制代码
1
resultobject = ExtAPI.DataModel.GetObjectsByName(result_name)[0]
复制成功
通过方法根据名称精准定位结果对象,这要求结果对象必须有唯一可识别的名称(建议在建模时规范命名)。
代码块
Python
自动换行
复制代码
12
while obj.GetType()!= Ansys.ACT.Automation.Mechanical.Analysis:
obj = obj.Parent
复制成功
这段循环是精华!通过向上遍历父对象找到最顶层的分析对象,从而获取模型的工作目录,确保文件保存路径正确。
代码块
Python
自动换行
复制代码
12
paneTabular = ExtAPI.UserInterface.GetPane(MechanicalPanelEnum.TabularData)
control = paneTabular.ControlUnknown
复制成功
直接获取"表格数据"面板的控件对象,然后通过、和读取所有数据。
使用库实现数据写入,注意:
用户手动操作时,常通过以下方法,导出后处理对象表格控件内的数据。

当使用Python脚本时,通过如下方法,导出后处理对象表格控件内的数据。
以上就是本次分享的 ANSYS 瞬态数据导出新方法,核心优势在于无需复杂配置,直接读取界面表格数据,完美复刻手动操作的逻辑,却能节省大量重复工作时间 —— 尤其是需要批量导出多个结果、多次迭代分析的场景,把代码保存为脚本,一键运行就能搞定!
如果在使用过程中遇到问题(比如 Excel 互操作失败、结果对象找不到、路径报错等),欢迎在评论区留言具体报错信息,我会逐一回复解答。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删