rvt-to-excel

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

RVT to Excel Conversion

RVT转Excel转换

Business Case

业务场景

Problem Statement

问题描述

BIM data inside RVT files needs to be extracted for:
  • Processing multiple projects in batch
  • Integrating BIM data with analytics pipelines
  • Sharing structured data with stakeholders
  • Generating reports and quantity takeoffs
RVT文件中的BIM数据需要提取,以满足以下需求:
  • 批量处理多个项目
  • 将BIM数据集成到分析流水线
  • 向利益相关者共享结构化数据
  • 生成报表和工程量统计

Solution

解决方案

Convert RVT files to structured Excel databases for analysis and reporting.
将RVT文件转换为结构化Excel数据库,用于分析和报表生成。

Business Value

业务价值

  • Batch processing - Convert multiple projects
  • Data accessibility - Excel format for universal access
  • Pipeline integration - Feed data to BI tools, ML models
  • Structured output - Organized element data and properties
  • 批量处理 - 转换多个项目
  • 数据可访问性 - Excel格式支持通用访问
  • 流水线集成 - 为BI工具、机器学习模型提供数据
  • 结构化输出 - 组织化的构件数据和属性

Technical Implementation

技术实现

CLI Syntax

CLI 语法

bash
RvtExporter.exe <input_path> [export_mode] [options]
bash
RvtExporter.exe <input_path> [export_mode] [options]

Export Modes

导出模式

ModeCategoriesDescription
basic
309Essential structural elements
standard
724Standard BIM categories
complete
1209All Revit categories
custom
User-definedSpecific categories only
模式类别数量描述
basic
309核心结构构件
standard
724标准BIM类别
complete
1209所有Revit类别
custom
用户自定义仅特定类别

Options

可选参数

OptionDescription
bbox
Include bounding box coordinates
rooms
Include room associations
schedules
Export all schedules to sheets
sheets
Export sheets to PDF
参数描述
bbox
包含 bounding box 坐标
rooms
包含房间关联信息
schedules
将所有明细表导出为工作表
sheets
将图纸导出为PDF

Examples

示例

bash
undefined
bash
undefined

Basic export

Basic export

RvtExporter.exe "C:\Projects\Building.rvt" basic
RvtExporter.exe "C:\Projects\Building.rvt" basic

Complete with bounding boxes

Complete with bounding boxes

RvtExporter.exe "C:\Projects\Building.rvt" complete bbox
RvtExporter.exe "C:\Projects\Building.rvt" complete bbox

Full export with all options

Full export with all options

RvtExporter.exe "C:\Projects\Building.rvt" complete bbox rooms schedules sheets
RvtExporter.exe "C:\Projects\Building.rvt" complete bbox rooms schedules sheets

Batch processing

Batch processing

for /R "C:\Projects" %f in (*.rvt) do RvtExporter.exe "%f" standard bbox
undefined
for /R "C:\Projects" %f in (*.rvt) do RvtExporter.exe "%f" standard bbox
undefined

Python Integration

Python 集成

python
import subprocess
import pandas as pd
from pathlib import Path
from typing import List, Optional

class RevitExporter:
    def __init__(self, exporter_path: str = "RvtExporter.exe"):
        self.exporter = Path(exporter_path)
        if not self.exporter.exists():
            raise FileNotFoundError(f"RvtExporter not found: {exporter_path}")

    def convert(self, rvt_file: str, mode: str = "complete",
                options: List[str] = None) -> Path:
        """Convert Revit file to Excel."""
        rvt_path = Path(rvt_file)
        if not rvt_path.exists():
            raise FileNotFoundError(f"Revit file not found: {rvt_file}")

        cmd = [str(self.exporter), str(rvt_path), mode]
        if options:
            cmd.extend(options)

        result = subprocess.run(cmd, capture_output=True, text=True)

        if result.returncode != 0:
            raise RuntimeError(f"Export failed: {result.stderr}")

        # Output file is same name with .xlsx extension
        output_file = rvt_path.with_suffix('.xlsx')
        return output_file

    def batch_convert(self, folder: str, mode: str = "standard",
                      pattern: str = "*.rvt") -> List[Path]:
        """Convert all Revit files in folder."""
        folder_path = Path(folder)
        converted = []

        for rvt_file in folder_path.glob(pattern):
            try:
                output = self.convert(str(rvt_file), mode)
                converted.append(output)
                print(f"Converted: {rvt_file.name}")
            except Exception as e:
                print(f"Failed: {rvt_file.name} - {e}")

        return converted

    def read_elements(self, xlsx_file: str) -> pd.DataFrame:
        """Read converted Excel as DataFrame."""
        return pd.read_excel(xlsx_file, sheet_name="Elements")

    def get_quantities(self, xlsx_file: str,
                       group_by: str = "Category") -> pd.DataFrame:
        """Get quantity summary grouped by category."""
        df = self.read_elements(xlsx_file)

        # Group and count
        summary = df.groupby(group_by).agg({
            'ElementId': 'count',
            'Area': 'sum',
            'Volume': 'sum'
        }).reset_index()

        summary.columns = [group_by, 'Count', 'Total_Area', 'Total_Volume']
        return summary
python
import subprocess
import pandas as pd
from pathlib import Path
from typing import List, Optional

class RevitExporter:
    def __init__(self, exporter_path: str = "RvtExporter.exe"):
        self.exporter = Path(exporter_path)
        if not self.exporter.exists():
            raise FileNotFoundError(f"RvtExporter not found: {exporter_path}")

    def convert(self, rvt_file: str, mode: str = "complete",
                options: List[str] = None) -> Path:
        """Convert Revit file to Excel."""
        rvt_path = Path(rvt_file)
        if not rvt_path.exists():
            raise FileNotFoundError(f"Revit file not found: {rvt_file}")

        cmd = [str(self.exporter), str(rvt_path), mode]
        if options:
            cmd.extend(options)

        result = subprocess.run(cmd, capture_output=True, text=True)

        if result.returncode != 0:
            raise RuntimeError(f"Export failed: {result.stderr}")

        # Output file is same name with .xlsx extension
        output_file = rvt_path.with_suffix('.xlsx')
        return output_file

    def batch_convert(self, folder: str, mode: str = "standard",
                      pattern: str = "*.rvt") -> List[Path]:
        """Convert all Revit files in folder."""
        folder_path = Path(folder)
        converted = []

        for rvt_file in folder_path.glob(pattern):
            try:
                output = self.convert(str(rvt_file), mode)
                converted.append(output)
                print(f"Converted: {rvt_file.name}")
            except Exception as e:
                print(f"Failed: {rvt_file.name} - {e}")

        return converted

    def read_elements(self, xlsx_file: str) -> pd.DataFrame:
        """Read converted Excel as DataFrame."""
        return pd.read_excel(xlsx_file, sheet_name="Elements")

    def get_quantities(self, xlsx_file: str,
                       group_by: str = "Category") -> pd.DataFrame:
        """Get quantity summary grouped by category."""
        df = self.read_elements(xlsx_file)

        # Group and count
        summary = df.groupby(group_by).agg({
            'ElementId': 'count',
            'Area': 'sum',
            'Volume': 'sum'
        }).reset_index()

        summary.columns = [group_by, 'Count', 'Total_Area', 'Total_Volume']
        return summary

Output Structure

输出结构

Excel Sheets

Excel工作表

SheetContent
ElementsAll BIM elements with properties
CategoriesElement categories summary
LevelsBuilding levels
MaterialsMaterial definitions
ParametersShared parameters
工作表内容
Elements所有带属性的BIM构件
Categories构件类别汇总
Levels建筑楼层
Materials材质定义
Parameters共享参数

Element Columns

构件列

ColumnTypeDescription
ElementIdintUnique Revit ID
CategorystringElement category
FamilystringFamily name
TypestringType name
LevelstringAssociated level
AreafloatSurface area (m²)
VolumefloatVolume (m³)
BBox_MinX/Y/ZfloatBounding box min
BBox_MaxX/Y/ZfloatBounding box max
列名类型描述
ElementId整数唯一Revit ID
Category字符串构件类别
Family字符串族名称
Type字符串类型名称
Level字符串关联楼层
Area浮点数表面积(平方米)
Volume浮点数体积(立方米)
BBox_MinX/Y/Z浮点数Bounding box最小值
BBox_MaxX/Y/Z浮点数Bounding box最大值

Usage Example

使用示例

python
undefined
python
undefined

Initialize exporter

Initialize exporter

exporter = RevitExporter("C:/Tools/RvtExporter.exe")
exporter = RevitExporter("C:/Tools/RvtExporter.exe")

Convert single file

Convert single file

xlsx = exporter.convert("C:/Projects/Office.rvt", "complete", ["bbox", "rooms"])
xlsx = exporter.convert("C:/Projects/Office.rvt", "complete", ["bbox", "rooms"])

Read and analyze

Read and analyze

df = exporter.read_elements(str(xlsx)) print(f"Total elements: {len(df)}")
df = exporter.read_elements(str(xlsx)) print(f"Total elements: {len(df)}")

Quantity summary

Quantity summary

quantities = exporter.get_quantities(str(xlsx)) print(quantities)
quantities = exporter.get_quantities(str(xlsx)) print(quantities)

Export to CSV for further processing

Export to CSV for further processing

df.to_csv("elements.csv", index=False)
undefined
df.to_csv("elements.csv", index=False)
undefined

Integration with DDC Pipeline

与DDC流水线集成

python
undefined
python
undefined

Full pipeline: Revit → Excel → Cost Estimate

Full pipeline: Revit → Excel → Cost Estimate

from semantic_search import CWICRSemanticSearch
from semantic_search import CWICRSemanticSearch

1. Convert Revit

1. Convert Revit

exporter = RevitExporter() xlsx = exporter.convert("project.rvt", "complete", ["bbox"])
exporter = RevitExporter() xlsx = exporter.convert("project.rvt", "complete", ["bbox"])

2. Extract quantities

2. Extract quantities

df = exporter.read_elements(str(xlsx)) quantities = df.groupby('Category')['Volume'].sum().to_dict()
df = exporter.read_elements(str(xlsx)) quantities = df.groupby('Category')['Volume'].sum().to_dict()

3. Search CWICR for pricing

3. Search CWICR for pricing

search = CWICRSemanticSearch() costs = {} for category, volume in quantities.items(): results = search.search_work_items(category, limit=5) if not results.empty: avg_price = results['unit_price'].mean() costs[category] = volume * avg_price
print(f"Total estimate: ${sum(costs.values()):,.2f}")
undefined
search = CWICRSemanticSearch() costs = {} for category, volume in quantities.items(): results = search.search_work_items(category, limit=5) if not results.empty: avg_price = results['unit_price'].mean() costs[category] = volume * avg_price
print(f"Total estimate: ${sum(costs.values()):,.2f}")
undefined

Best Practices

最佳实践

  1. Use appropriate mode -
    basic
    for quick analysis,
    complete
    for full data
  2. Include bbox - Required for spatial analysis and visualization
  3. Batch carefully - Large files may take time; process overnight
  4. Validate output - Check element counts against Revit schedules
  1. 选择合适的模式 -
    basic
    用于快速分析,
    complete
    用于完整数据
  2. 包含bbox - 空间分析和可视化必需
  3. 谨慎批量处理 - 大文件可能耗时,建议夜间处理
  4. 验证输出 - 对照Revit明细表检查构件数量

Resources

资源