You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用EPPlus导出Revit元素名称到Excel的问题求解

问题1:直接遍历赋值仅输出类型名

错误原因

  • 循环内将整个_elementsDB元素集合赋值给单元格,单元格会自动调用对象的ToString()方法,因此输出类名Autodesk.Revit.DB.Wall
  • 循环未匹配元素下标,没有取出对应行的单个元素对象

修正代码

int col = 1;
// 循环边界调整,避免遗漏最后一个元素
for (int row = 2; row <= _elementsDB.Count + 1; row++)
{                
    // 元素集合下标从0开始,对应行号偏移为row-2
    ws.Cells[row, col].Value = _elementsDB[row - 2].Name;
}

问题2:元素名称存入数组/列表失败

错误原因

语法使用错误:直接将字符串赋值给数组/列表变量本身,而非向数组/列表中添加元素。数组需要按索引赋值,列表需要调用Add()方法添加元素。

修正代码

数组实现

FilteredElementCollector collector = new FilteredElementCollector(doc);
IList<Element> _elementsDB = collector.OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType().ToElements();

// 初始化和元素数量等长的数组
string[] _elementsNameArr = new string[_elementsDB.Count];
for(int i = 0; i < _elementsDB.Count; i++)
{
    _elementsNameArr[i] = _elementsDB[i].Name;
}

列表实现

List<string> _elementsNameList = new List<string>();
foreach (Element e in _elementsDB)
{
    // 调用Add方法添加元素
    _elementsNameList.Add(e.Name);
}

问题3:SortedList抛出重复键异常

错误原因

SortedList的键具有唯一性约束,而Revit中允许同类别下有多个重名元素,插入同名元素的名称作为键时就会触发重复键异常。

修正方案

方案1:插入前判断键是否存在,重复则自行处理

SortedList<string, Element> _elementNameSorted = new SortedList<string, Element>();
foreach (Element e in _elementsDB)
{
    if (!_elementNameSorted.ContainsKey(e.Name))
    {
        _elementNameSorted.Add(e.Name, e);
    }
    // 也可以自定义重复逻辑,比如覆盖已有值、拼接序号后缀等
}

方案2:使用带唯一标识的键,从根源避免重复

可以把全局唯一的元素ID拼接到键中:

SortedList<string, Element> _elementNameSorted = new SortedList<string, Element>();
foreach (Element e in _elementsDB)
{
    string uniqueKey = $"{e.Name}_{e.Id}";
    _elementNameSorted.Add(uniqueKey, e);
}

如果不需要键唯一的特性,也可以直接用List<KeyValuePair<string, Element>>替代SortedList。

内容的提问来源于stack exchange,提问作者fysharp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:18:02