当前位置:首页>python>《HM Python 进化论Vol.8》扔掉 COM 接口!用 Pandas 两行代码秒杀 Excel

《HM Python 进化论Vol.8》扔掉 COM 接口!用 Pandas 两行代码秒杀 Excel

  • 2026-09-28 23:23:34
《HM Python 进化论Vol.8》扔掉 COM 接口!用 Pandas 两行代码秒杀 Excel

做仿真最烦的是什么?不是画网格,而是“搬运数据”。 老板给你一个 Excel 写的材料表,让你建 100 个 Material;或者让你统计模型里所有 Component 的质量和重心,填回 Excel 表里。 在 Tcl 里,你需要几十行代码去初始化 COM 对象,还得小心翼翼地处理单元格坐标。 今天,我们将请出 Python 数据处理库的王者 —— Pandas。它能把 Excel 表直接“吞”进内存,处理完后再“吐”出来,全程只需几秒钟。

1. 痛点:笨拙的 Tcl COM

以前用 Tcl 操作 Excel,你感觉自己像是在远程操控一台抓娃娃机。 你必须写:

application.GetCell(1, 1)

一旦 Excel 卡死,你的脚本也跟着挂掉。而且速度极慢,写入 1000 行数据能让你去喝杯咖啡回来还没写完。

Python 的 Pandas 方式: 它把 Excel 看作一个DataFrame(数据框)。 你可以把它想象成一个“内存里的超级 Excel”。一旦读进去,所有的筛选、排序、计算都在内存瞬间完成,最后再一次性存盘。

2. 读取:一键导入材料库

假设你有一个 materials.xlsx,里面有 Name, E, Nu, Rho 四列。

import pandas as pd
import hm
import hm.entities as ent

# 1. 读取 Excel (只需一行代码!)
# df 就是那个“内存里的 Excel”
df = pd.read_excel("D:/project/materials.xlsx")

print(f"成功读取 {len(df)} 种材料")

# 2. 遍历每一行,创建材料
# iterrows() 允许你逐行访问数据
model = hm.Model()
for index, row in df.iterrows():
   # 创建材料 (假设 create_mat 是我们封装好的函数)
   mat = ent.Material(model, name=row['Name'])
   mat.E = row['E']
   mat.Nu = row['Nu']
   mat.Rho = row['Rho']
   
print("所有材料创建完毕!")

没有 open,没有 close,没有 COM 对象。干净利落。

3.写入:生成 BOM 表 (Bill of Materials)

这是更常见的场景。我们需要统计模型里所有部件的信息,导出给设计部门。

关键技巧:先存列表,再转 Pandas不要在循环里写 Excel,那样太慢。

  1. 把数据存成 Python 字典列表 (List of Dicts)。

  2. 把列表转成 Pandas DataFrame。

  3. 保存为 Excel。

# 1. 准备一个空列表
data_list = []
comps = hm.Collection(model, ent.Component)

# 2. 收集数据 (这一步还在 HyperMesh 里)
for comp in comps:
   # 把单个部件的信息打包成一个字典
   info = {
       "ID": comp.id,
       "Name": comp.name,
       "Color": comp.color,
       "Element_Count": len(comp.elements) # 假设这是我们要统计的
   }
   data_list.append(info)

# 3. 转换为 Pandas DataFrame
df_result = pd.DataFrame(data_list)

# 4. 导出 Excel (又是一行代码!)
# index=False 表示不要那一列自动生成的序号
df_result.to_excel("D:/project/Model_BOM.xlsx", index=False)

4.高级操作:数据透视与筛选

既然数据进了 Pandas,你就不需要在 Excel 里做透视表了,Python 更快。

# 需求:找出所有单元数量大于 1000 的红色部件

# 1. 筛选 (Filtering)
# 语法直观:df[条件]
big_comps = df_result[df_result['Element_Count'] > 1000]

# 2. 统计 (Statistics)
# 按颜色分组统计平均单元数
avg_by_color = df_result.groupby('Color')['Element_Count'].mean()

print(avg_by_color)

结语

数据 IO 是自动化的“最后一公里”。 使用 Pandas,你不仅是在操作 Excel,你是在进行数据科学处理。

  1. Read: pd.read_excel 瞬间读取。

  2. Process: 利用 DataFrame 进行筛选、统计。

  3. Write: to_excel 一键导出。 掌握了这一期,你就打通了 HyperMesh 与外部世界的任督二脉。


👉 下期预告:

现在的脚本已经功能强大、界面美观、还能读写数据。但它还只是躺在你硬盘里的一个 .py 文件。 怎么把它变成 HyperMesh 界面上一个固定的按钮?怎么做成一个工具条 (Ribbon) 分发给全组同事使用? 下一期,我们将进入 《部署篇:自定义你的工具栏》,教你把脚本“安装”进 HyperMesh,打造专属的工作环境!

公众号

知识星球

扫码关注

科趣范,让科研更简单

小红书

抖音

最新文章

随机文章