许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  ANSYS Mechanical表格瞬态数据导出新方法:Python+Excel互操作实现

ANSYS Mechanical表格瞬态数据导出新方法:Python+Excel互操作实现

阅读数 3
点赞 0
article_banner


导读: 大家好,我是小郭老师,硕士毕业于中科院,专注于运用 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)  # 调用函数执行导出

      复制成功
     
     
     
     

1. 核心思路

这种方法的本质是:直接读取ANSYS后处理界面中"表格数据"面板的内容,再通过Excel互操作将数据写入表格。相比之前分享的方法,它更贴近用户操作习惯,不需要手动定义变量名。

2. 关键技术点

(1)结果对象定位

代码块

Python


     自动换行
   


     复制代码
   

1


resultobject = ExtAPI.DataModel.GetObjectsByName(result_name)[0]

      复制成功
     
     
     
     

通过方法根据名称精准定位结果对象,这要求结果对象必须有唯一可识别的名称(建议在建模时规范命名)。

(2)工作目录获取

代码块

Python


     自动换行
   


     复制代码
   

12


while obj.GetType()!= Ansys.ACT.Automation.Mechanical.Analysis:
    obj = obj.Parent
    
      复制成功
     
     
     
     

这段循环是精华!通过向上遍历父对象找到最顶层的分析对象,从而获取模型的工作目录,确保文件保存路径正确。

(3)表格数据读取

代码块

Python


     自动换行
   


     复制代码
   

12


paneTabular = ExtAPI.UserInterface.GetPane(MechanicalPanelEnum.TabularData)
control = paneTabular.ControlUnknown

      复制成功
     
     
     
     

直接获取"表格数据"面板的控件对象,然后通过、和读取所有数据。

(4)Excel交互

使用库实现数据写入,注意:

  • 需要确保电脑安装了Excel
  • 用.NET Array而不是Python列表进行数据传递(互操作要求)
  • Visible属性控制是否显示Excel窗口(调试时设为True,批量处理时设为False)

3. 实用技巧

  1. 多结果批量导出:只需在result_names列表中添加多个结果名称,如:result_names = ['result_Temperature', 'result_Stress', 'result_Displacement']
  2. 路径自定义:修改user_files_dir的定义可改变保存位置,例如直接保存到桌面:user_files_dir = os.path.join(os.path.expanduser("~"), "Desktop")
  3. 数据筛选:在读取control.cell(row, col).Text后可添加判断逻辑,只导出需要的数据列。

用户手动操作时,常通过以下方法,导出后处理对象表格控件内的数据。


当使用Python脚本时,通过如下方法,导出后处理对象表格控件内的数据。‍

以上就是本次分享的 ANSYS 瞬态数据导出新方法,核心优势在于无需复杂配置,直接读取界面表格数据,完美复刻手动操作的逻辑,却能节省大量重复工作时间 —— 尤其是需要批量导出多个结果、多次迭代分析的场景,把代码保存为脚本,一键运行就能搞定!

如果在使用过程中遇到问题(比如 Excel 互操作失败、结果对象找不到、路径报错等),欢迎在评论区留言具体报错信息,我会逐一回复解答。


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空