excel-to-rvt
Import Excel data into RVT projects. Update element parameters, create schedules, and sync external data sources.
git clone --depth 1 https://github.com/datadrivenconstruction/DDC_Skills_for_AI_Agents_in_Construction /tmp/excel-to-rvt && cp -r /tmp/excel-to-rvt/1_DDC_Toolkit/CAD-Converters/excel-to-rvt ~/.claude/skills/excel-to-rvtSKILL.md
# Excel to RVT Import
> **Note:** RVT is the file format. Examples may reference Autodesk® Revit® APIs. Autodesk and Revit are registered trademarks of Autodesk, Inc.
## Business Case
### Problem Statement
External data (costs, specifications, classifications) lives in Excel but needs to update Revit:
- Cost estimates need to link to model elements
- Classification codes need assignment
- Custom parameters need population
- Manual entry is slow and error-prone
### Solution
Automated import of Excel data into Revit using the DDC ImportExcelToRevit tool and Dynamo workflows.
### Business Value
- **Automation** - Batch update thousands of parameters
- **Accuracy** - Eliminate manual data entry errors
- **Sync** - Keep external data in sync with model
- **Flexibility** - Update any writable parameter
## Technical Implementation
### Methods
1. **ImportExcelToRevit CLI** - Direct command-line update
2. **Dynamo Script** - Visual programming approach
3. **Revit API** - Full programmatic control
### ImportExcelToRevit CLI
```bash
ImportExcelToRevit.exe <model.rvt> <data.xlsx> [options]
```
| Option | Description |
|--------|-------------|
| `-sheet` | Excel sheet name |
| `-idcol` | Element ID column |
| `-mapping` | Parameter mapping file |
### Python Implementation
```python
import subprocess
import pandas as pd
from pathlib import Path
from typing import Dict, Any, List, Optional, Tuple
from dataclasses import dataclass
import json
@dataclass
class ImportResult:
"""Result of Excel import to Revit."""
elements_processed: int
elements_updated: int
elements_failed: int
parameters_updated: int
errors: List[str]
class ExcelToRevitImporter:
"""Import Excel data into Revit models."""
def __init__(self, tool_path: str = "ImportExcelToRevit.exe"):
self.tool_path = Path(tool_path)
def import_data(self, revit_file: str,
excel_file: str,
sheet_name: str = "Elements",
id_column: str = "ElementId",
parameter_mapping: Dict[str, str] = None) -> ImportResult:
"""Import Excel data into Revit."""
# Build command
cmd = [
str(self.tool_path),
revit_file,
excel_file,
"-sheet", sheet_name,
"-idcol", id_column
]
# Add mapping file if provided
if parameter_mapping:
mapping_file = self._create_mapping_file(parameter_mapping)
cmd.extend(["-mapping", mapping_file])
# Execute
result = subprocess.run(cmd, capture_output=True, text=True)
# Parse result (format depends on tool)
return self._parse_result(result)
def _create_mapping_file(self, mapping: Dict[str, str]) -> str:
"""Create temporary mapping file."""
mapping_path = Path("temp_mapping.json")
with open(mapping_path, 'w') as f:
json.dump(mapping, f)
return str(mapping_path)
def _parse_result(self, result: subprocess.CompletedProcess) -> ImportResult:
"""Parse CLI result."""
# This is placeholder - actual parsing depends on tool output
if result.returncode == 0:
return ImportResult(
elements_processed=0,
elements_updated=0,
elements_failed=0,
parameters_updated=0,
errors=[]
)
else:
return ImportResult(
elements_processed=0,
elements_updated=0,
elements_failed=0,
parameters_updated=0,
errors=[result.stderr]
)
class DynamoScriptGenerator:
"""Generate Dynamo scripts for Revit data import."""
def generate_parameter_update_script(self,
mappings: Dict[str, str],
excel_path: str,
output_path: str) -> str:
"""Generate Dynamo Python script for parameter updates."""
mappings_json = json.dumps(mappings)
script = f'''
# Dynamo Python Script - Excel to Revit Parameter Update
# Generated by DDC
import clr
import sys
sys.path.append(r'C:\\Program Files (x86)\\IronPython 2.7\\Lib')
clr.AddReference('RevitAPI')
clr.AddReference('RevitServices')
clr.AddReference('Microsoft.Office.Interop.Excel')
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
from Autodesk.Revit.DB import *
import Microsoft.Office.Interop.Excel as Excel
# Configuration
excel_path = r'{excel_path}'
mappings = {mappings_json}
# Open Excel
excel_app = Excel.ApplicationClass()
excel_app.Visible = False
workbook = excel_app.Workbooks.Open(excel_path)
worksheet = workbook.Worksheets[1]
# Get Revit document
doc = DocumentManager.Instance.CurrentDBDocument
# Read Excel data
used_range = worksheet.UsedRange
rows = used_range.Rows.Count
cols = used_range.Columns.Count
# Find column indices
headers = {{}}
for col in range(1, cols + 1):
header = str(worksheet.Cells[1, col].Value2 or '')
headers[header] = col
# Process rows
TransactionManager.Instance.EnsureInTransaction(doc)
updated_count = 0
error_count = 0
for row in range(2, rows + 1):
try:
# Get element ID
element_id_col = headers.get('ElementId', 1)
element_id = int(worksheet.Cells[row, element_id_col].Value2 or 0)
element = doc.GetElement(ElementId(element_id))
if not element:
continue
# Update mapped parameters
for excel_col, revit_param in mappings.items():
if excel_col in headers:
col_idx = headers[excel_col]
value = worksheet.Cells[row, col_idx].Value2
if value is not None:
param = element.LookupParameter(revit_param)
if param and not param.IsReadOnly:Generate automated daily progress reports from site data. Track work completed, labor hours, equipment usage, and weather conditions.
Analyze labor productivity from site data. Compare planned vs actual, identify trends, benchmark against industry standards.
Create interactive KPI dashboards for construction projects. Track schedule, cost, quality, and safety metrics in real-time.
Detect and analyze geometric clashes in BIM models. Identify MEP, structural, and architectural conflicts before construction.
Classify BIM elements using AI and standard classification systems. Map elements to UniFormat, MasterFormat, OmniClass, and CWICR codes.
Generate comprehensive BIM model validation reports. Check data quality, completeness, and compliance with standards.
Calculate CO2 emissions and carbon footprint from BIM model data. Analyze embodied carbon by material, element, and building system.
Extract quantities from IFC/Revit models for quantity takeoff. Uses DDC converters to get element counts, areas, volumes, lengths with grouping and reporting.