
如果你的工作涉及材料数据管理、仿真材料参数整理或者需要定期把 Granta MI 里的材料属性批量导出来交给 CAE 工程师、写进报告、录入其他系统那 Scripting Toolkit 是一个绕不开的官方工具。它不是第三方爬虫也不是 Excel 插件而是 ANSYS Granta MI 自带的脚本接口用代码方式完成登录、查询、读取材料记录、导出数据这一整套流程。这篇文章重点回答这几个问题Scripting Toolkit 能做什么、部署需要什么环境、连接 Granta MI 需要哪些前置条件、导出数据的典型步骤是什么、批量任务怎么组织、遇到连接失败或导出乱码怎么排查。如果你正准备从 Granta MI 里导数据或者想把手动导出操作脚本化这篇文章可以直接作为操作清单来用。需要提前说明的是Granta MI 是商用系统不同企业部署的版本、服务器地址、认证方式差别很大。文中代码会给出通用流程模板具体类名、方法名、安装包名需要以你本机安装的 Toolkit 版本和官方文档为准。1. 核心能力速览能力项说明项目类型材料数据管理系统的官方脚本 SDK所属产品ANSYS Granta MI核心能力连接 Granta MI 服务器、查询材料数据库、读取记录与属性、导出数据文件支持语言Python、.NET以官方发布版本为准可导出格式Excel、CSV、JSON 等按版本能力支持批量能力支持遍历记录集、分页查询、多表导出是否支持 API 化可以封装成本地 Python 服务或定时任务硬件要求不需要 GPU普通 PC 或服务器即可依赖环境Python 3.x 或 .NET 环境、网络可访问 Granta MI ServiceLayer启动方式命令行脚本、定时任务、Web API 封装授权要求需要 Granta MI 许可账号及对应数据权限从材料看Scripting Toolkit 解决的核心问题是把“人工在 Granta MI 客户端里翻数据库、选表、勾属性、点导出”的手工操作替换成“脚本一次执行、批量处理、可定时运行”的自动化流程。这对材料工程师、仿真工程师和数据管理员都很有价值。2. 适用场景与使用边界2.1 适合谁用材料研发工程师需要把 Granta MI 里的材料性能数据批量导出做对比分析。仿真工程师需要把材料弹性模量、屈服强度、热导率等参数导入 CAE 软件。数据管理员需要在 Granta MI 与公司内部数据库、文件服务器之间做数据同步。质量与合规人员需要定期导出版本化的材料数据用于归档、审核。2.2 能解决什么问题手工导数据要打开客户端脚本方式一次跑完。查询条件复制粘贴容易错脚本固定查询条件结果一致。多张表、多条记录重复导出脚本循环处理不用反复操作。数据要进下游系统时脚本可以按目标系统要求的格式输出。2.3 不适合什么场景不适合对 Granta MI 数据结构完全不了解的新手。脚本会写查询条件但查错表、查错属性导出的数据无法直接使用。不适合绕过权限控制导数据。Scripting Toolkit 并不能突破服务器权限账号能看什么脚本才能导什么。不适合没有 Granta MI 企业授权的情况。它是商业软件配套工具工作需要获得公司许可。2.4 合规与安全边界Granta MI 中的材料数据通常涉及企业研发信息导出前需要确认当前账号是否具备目标数据库、表、记录的读取权限。导出的文件是否包含敏感研发数据存放位置是否符合公司数据安全规范。如果导出内容包含供应商材料牌号、客户定制数据使用边界需要提前确认。3. 环境准备与前置条件在写导出脚本之前先检查以下四项。3.1 Granta MI 服务器信息向管理员确认这些信息信息项说明服务器地址例如https://granta.example.com/mi_servicelayer认证方式基础账号密码 / Windows 域认证 / 单点登录可用数据库例如MaterialData目标表例如Metals、Polymers账号权限是否具备目标表的读取权限没有服务器地址和账号脚本无从发起连接。3.2 网络连通性在部署脚本的机器上先确认网络能访问 Granta MI ServiceLayer 地址。# 测试地址是否可访问示例地址请替换为真实地址 curl -I https://granta.example.com/mi_servicelayer如果返回 401、403说明服务可达但需要认证如果超时检查网络策略和防火墙。3.3 Python 环境Scripting Toolkit 的 Python 版本通常要求 Python 3 环境。可以用以下命令确认当前版本python --version pip --version如果电脑上有多个 Python 环境建议为 Granta MI 导出脚本单独创建虚拟环境避免依赖混乱。# 创建并激活虚拟环境Windows 示例 python -m venv granta_env granta_env\Scripts\activate3.4 Scripting Toolkit 安装包安装方式取决于你的 Toolikit 来源官方发布的可pip install的包。企业内部提供的离线安装包例如.whl文件。公司内部环境的自定义封装包。安装完成后建议确认包已正确安装pip list | findstr -i granta如果没有输出内容说明包未安装或包名不含 “granta” 关键词需要以实际包名为准。4. 安装部署与启动方式4.1 安装示例以下命令为通用模板实际包名和文件路径需要按你所获取的安装包调整。# 方式一如果官方发布到 PyPI 且网络可达 pip install 官方包名 # 方式二企业内离线包 pip install ./release/granta_scripting_toolkit-1.0.0-py3-none-any.whl这里要特别提醒不同版本的 Scripting Toolkit 命名差异较大千万不要照抄网上旧代码里的包名直接安装。优先以官方文档为准或找公司 Granta MI 管理员要安装资料。4.2 启动方式Scripting Toolkit 不是一个 Web 服务它是以库的形式被你的 Python 脚本调用。所以“启动”指的是执行一个export_data.py这样的脚本。python export_data.py如果你的场景需要接口化可以在这个导入脚本外层封装 Flask/FastAPI 服务。但本文重点先讲清楚“连接 查询 导出”这条主链。4.3 验证安装写一个最小脚本先确认模块能导入# check_install.py # 示例确认 Scripting Toolkit 模块可以导入 # 模块名以实际安装包为准如果导入失败会抛出异常 try: # 这里替换为你安装包的实际模块名 # import grantami_scripting_toolkit as toolkit print(Toolkit import OK) except ImportError as e: print(Import failed:, e)能打印Toolkit import OK说明依赖环境基本可用下一步开始连接服务器。5. 连接服务器与基础查询5.1 连接流程Scripting Toolkit 的典型连接流程如下创建连接对象。传入服务器地址、账号、密码。登录并获取会话。列出当前账号可访问的数据库。选定数据库和表。# 连接流程伪代码模板 # 真实类名、方法名以官方文档为准 server_url https://granta.example.com/mi_servicelayer username your-username password your-password # 创建连接并登录 # server ServerApi(server_url, usernameusername, passwordpassword) # session server.login() # 获取数据库列表 # databases session.get_database_list() # for db in databases: # print(db.name) # 选择目标数据库 # database session.get_database(MaterialData) # 获取该数据库下的表 # tables database.get_table_list() # for table in tables: # print(table.name)这段代码的价值是帮你理解流程先连接再选库再看表。实际开发时你把注释部分替换成所装版本的真实 API 即可。5.2 基础查询Granta MI 中的数据结构可以简单理解为数据库材料数据的容器。表一类材料的集合比如Metals、Polymers。记录一条具体材料记录。属性记录里的字段比如屈服强度、弹性模量。查询的核心是根据条件筛选出需要导出的记录集。# 查询记录伪代码模板 # records session.find_records( # databaseMaterialData, # tableMetals, # filterMaterialFamily Steel # ) # for record in records: # print(record.record_guid, record.name)记录导出的基础单位是record。脚本后续要做的就是遍历这些记录读取需要的属性再写入导出文件。6. 导出数据的典型流程6.1 导出前要确定什么在写导出脚本前先问清楚以下问题导出哪张表筛选条件是什么需要哪些属性输出什么格式文件按什么规则命名输出目录在哪里这些问题不明确脚本写出来很容易导错数据。6.2 导出到 CSV 通用框架CSV 是工程领域最通用的格式适合程序再处理。下面的代码不依赖 Granta 具体 API它是一个可复用的 CSV 写入框架数据源部分由真实查询结果替换。# export_to_csv.py 将 Granta MI 查询结果导出为 CSV 的通用框架 import csv from pathlib import Path def write_records_to_csv(records, output_csv: str) - None: 将记录集写入 CSV 文件 records: 查询得到的记录对象列表 output_csv: 输出文件路径 output_path Path(output_csv) output_path.parent.mkdir(parentsTrue, exist_okTrue) with open(output_path, w, newline, encodingutf-8-sig) as f: writer csv.writer(f) writer.writerow([RecordGUID, Name, PropertyName, Value, Unit]) for record in records: # TODO: 将 record 的属性列表替换成实际 API 的读取方式 for attr in record.attributes: writer.writerow([ record.record_guid, record.name, attr.name, attr.value, attr.unit_symbol, ]) print(f导出完成: {output_path})这里使用utf-8-sig编码是为了让生成的 CSV 用 Excel 打开时中文不乱码。如果你的数据主要给程序解析也可以用utf-8或gbk但最稳妥的是utf-8-sig。6.3 导出到 Excel如果脚本环境里安装了pandas和openpyxl也可以把记录集统一转成 DataFrame再导成 Excel。# export_to_excel.py 思路示意 # import pandas as pd # 先构造列表数据 rows [] # for record in records: # rows.append({ # RecordGUID: record.record_guid, # Name: record.name, # PropertyName: attr.name, # Value: attr.value, # Unit: attr.unit_symbol, # }) # df pd.DataFrame(rows) # df.to_excel(export.xlsx, indexFalse)Excel 适合给人看CSV 适合给程序看JSON 适合对接 API。按目标场景选择输出格式。6.4 保存单位与元数据导出材料数据时光有数值没有单位是没有意义的。Scripting Toolkit 返回的属性值通常会带上单位符号。导出时建议保留以下信息属性名称。数值。单位符号。属性所属的记录。记录的 GUID 或唯一标识方便回溯到源数据。保存 GUID 非常重要。如果你导出的数据后续被修改、再导入或者被人质疑一致性GUID 是核对源记录的关键。7. 批量导出与任务管理7.1 多表批量导出实际工作中经常需要一次导出多张表。可以把表名放在配置里循环处理。# batch_export.py 思路示意 # tables_to_export [Metals, Polymers, Ceramics] # for table_name in tables_to_export: # records session.find_all_records(databaseMaterialData, tabletable_name) # output_file fexport_{table_name}.csv # write_records_to_csv(records, output_file)7.2 大记录集分页处理如果一张表有几万条记录一次性拉取会占用大量内存也可能触发服务器超时。稳妥的做法是分页查询# 分页查询思路示意 # PAGE_SIZE 500 # offset 0 # while True: # page_records session.find_records_paged( # databaseMaterialData, # tableMetals, # filterMaterialFamily Steel, # startoffset, # page_sizePAGE_SIZE, # ) # if not page_records: # break # write_records_to_csv(page_records, fsteel_part_{offset}.csv) # offset PAGE_SIZE7.3 定时导出如果导出任务是周期性的比如每月导一次材料数据快照可以配合系统调度工具运行Windows任务计划程序。Linuxcron。企业内部平台Airflow、Tempo、DolphinScheduler。定时任务脚本建议增加日志记录# 日志记录示例 import logging logging.basicConfig( filenameexport.log, levellogging.INFO, format%(asctime)s %(levelname)s %(message)s, ) logging.info(导出任务开始) # 执行导出 logging.info(导出任务结束)7.4 失败重试批量导出时网络抖动、服务器临时不可用、权限变更都可能导致单批任务失败。一种通用的做法是失败后等待几秒重试最多重试三次仍然失败则记录日志并继续下一批。# 重试思路示意 import time def run_with_retry(func, retries: int 3, delay: int 5): for attempt in range(1, retries 1): try: return func() except Exception as e: print(f第 {attempt} 次失败: {e}) if attempt retries: time.sleep(delay) else: raise8. 常见问题与排查方法8.1 问题排查总表问题现象可能原因排查方式解决方案连接超时服务器地址错误或网络不通检查地址、curl 测试联系管理员确认 ServiceLayer 地址登录失败账号密码错误、权限不足用 Granta MI 客户端测试登录重置密码或申请权限数据库列表为空账号无任何数据库权限查看账号授权提交权限申请查询结果为空筛选条件写错在客户端里手动查一遍调整 filter 条件导出中文乱码编码不一致用文本编辑器查看文件字节使用 utf-8-sig 编码导出数据缺少主键/记录标识导出字段未包含 GUID确认导出属性列表增加 RecordGUID 字段大表导出内存溢出一次性拉取记录过多监控脚本内存占用改分页导出定时任务不执行调度配置错误手动执行脚本确认是否正常修正调度任务导出速度慢属性过多、记录过多观察单批导出耗时减少属性数量、分表处理下游系统读不了导出文件字段结构不匹配对照目标系统模板调整输出列名和格式8.2 重点排查细节连接超时。用 curl 或浏览器直接访问服务器地址确认服务层可达。如果客户端能访问但脚本不能访问重点检查脚本运行机器的网络策略、代理设置和系统时间。乱码问题。Granta MI 里本身存的是 Unicode 数据乱码通常出现在写文件环节。CSV 导出写文件时注意open()的encoding参数建议统一用utf-8-sig。缺少主键问题。很多数据库导出场景都会遇到“没有主键 ID”这个问题。Granta MI 中每条记录都有唯一的记录 GUID导出时务必把这个字段带出来否则后续做增量同步、数据核对会非常困难。权限问题。Scripting Toolkit 不是绕过权限的工具。账号没有读取权限脚本查不到数据。如果查得到数据库但查不到表优先找数据管理员确认账号授权范围。9. 最佳实践与使用建议9.1 先小后大第一次跑脚本先限定一个很小的数据集比如只查 10 条记录确认输出字段、单位、命名都符合预期再放开全量查询。# 小范围测试思路 # records session.find_records( # databaseMaterialData, # tableMetals, # filterMaterialFamily Steel AND Name Steel 1045, # )9.2 配置与代码分离把服务器地址、账号、数据库名、表名、输出目录放进配置文件不要硬编码在代码里。# config.json 示例 { server_url: https://granta.example.com/mi_servicelayer, database: MaterialData, tables: [Metals, Polymers], output_dir: ./exports, page_size: 500, encoding: utf-8-sig }# 读取配置 import json with open(config.json, r, encodingutf-8) as f: config json.load(f)9.3 密码不要硬编码生产环境不要直接把密码写在脚本里。可以考虑使用环境变量。使用系统凭据管理器。使用内部密钥管理服务。# 从环境变量读取密码 import os password os.environ.get(GRANTA_PASSWORD, ) if not password: raise RuntimeError(请设置 GRANTA_PASSWORD 环境变量)9.4 输出目录规范建议每次导出生成一个带时间戳的目录避免文件覆盖。# 目录命名规范示例 from datetime import datetime timestamp datetime.now().strftime(%Y%m%d_%H%M%S) output_dir fexports/{timestamp}9.5 保留最小可运行脚本无论项目多复杂保留一个最小可运行脚本只做“连接 查一张表 导出 10 条记录”。这样环境出问题时能快速定位是环境问题还是业务脚本问题。9.6 合规提醒涉及材料数据导出尤其是对外提供数据或上传到第三方平台时一定要确认数据是否允许导出、是否包含未公开的研发信息、是否涉及供应商和客户数据保密协议。导出文件要设置合适的文件权限不要长期放在公共共享目录。10. 总结与下一步使用 Granta MI Scripting Toolkit 导出数据核心路径是“连接服务器 → 选择数据库和表 → 查询记录 → 遍历属性 → 写导出文件”。这件事本身不复杂但工程落地时要注意四点API 版本差异、账号权限、编码处理和记录唯一标识。建议第一次尝试时先做一个小规模验证拿到服务器地址和测试账号。安装 Toolkit 包跑通最小连接脚本。查询一张测试表导出 10 条记录到 CSV。确认字段、单位、中文编码都正常。再逐步扩展到批量、定时和 API 封装。最容易踩的坑是照抄网上旧代码。Granta MI 版本更新后连接类名、方法名、查询写法都可能变化。最可靠的做法是翻开你本机官方文档或企业内部手册用最小脚本逐行验证。后续可以继续扩展的方向包括把导出脚本封装成 Web API供其他系统按需调用把 Granta MI 导出与仿真前处理工具对接把导出任务接入企业数据平台实现材料数据快照自动归档。只要第一步的“连接 导出”跑通后续自动化改造就有了稳定基础。