Files
RevitArchive/RevitAddins/MainViewModel.cs
2026-02-23 14:58:05 +08:00

211 lines
9.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using EPPlus.Core.Extensions;
using OfficeOpenXml;
using OfficeOpenXml.Style;
namespace RevitAddins
{
public partial class MainViewModel : ObservableObject
{
private readonly Autodesk.Revit.ApplicationServices.Application application;
[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(ExportExcelCommand))]
private FileInfo selectedFileInfo;
[ObservableProperty]
private Dictionary<string, FileInfo> excelTemplates;
public MainViewModel(Autodesk.Revit.ApplicationServices.Application application)
{
this.ExcelTemplates = new Dictionary<string, FileInfo>();
if (Directory.Exists(Path.Combine(GlobalVariables.DirAssembly, "Templates")))
{
DirectoryInfo directoryInfo = new DirectoryInfo(Path.Combine(GlobalVariables.DirAssembly, "Templates"));
var files = directoryInfo.GetFiles("*.xlsx");
foreach (var item in files)
{
ExcelTemplates.Add(item.Name, item);
}
}
this.application = application;
}
private bool CanExport()
{
if (SelectedFileInfo == null)
{
return false;
}
return true;
}
[RelayCommand(CanExecute = nameof(CanExport))]
private void ExportExcel()
{
StringBuilder sb = new StringBuilder();
//选择文件夹,并获取文件夹内的所有*.rvt文件
var folderDialog = new FolderBrowserDialog() { Multiselect = false };
if (folderDialog.ShowDialog() == false)
{
return;
}
var path = folderDialog.SelectedPath;
if (Directory.Exists(path))
{
DirectoryInfo directoryInfo = new DirectoryInfo(path);
var files = directoryInfo.GetFiles("*.rvt");
foreach (var file in files)
{
Document document = null;
try
{
document = application.OpenDocumentFile(file.FullName);
var groups = document.OfParentModelCollector().WhereElementIsNotElementType()
.GroupBy(e => e.GetParameters("深圳构件标识").FirstOrDefault().AsString());
var targetExcelPath = Path.Combine(path, Path.GetFileNameWithoutExtension(document.PathName) + ".xlsx");
var fileInfo = SelectedFileInfo.CopyTo(targetExcelPath, true);
using var pkg = new ExcelPackage(fileInfo);
var sheetToDel = new List<ExcelWorksheet>();
foreach (var worksheet in pkg.Workbook.Worksheets)
{
var elements = groups.FirstOrDefault(g => g.Key == worksheet.Name)?.ToList();
if (worksheet.Name == "房间")
{
elements = [.. document.OfCollector().OfCategory(BuiltInCategory.OST_Rooms).Cast<Room>().Where(r => r.Area > 0)];
}
if (elements == null || elements.Count == 0)
{
sheetToDel.Add(worksheet);
continue;
}
// 获取到第三行的所有单元格的值,转成列号和值的字典
var range = worksheet.Cells[3, 1, 3, worksheet.Dimension.End.Column];
var values = new Dictionary<int, string>();
foreach (var cell in range)
{
if (cell.Value != null)
{
values[cell.Start.Column] = cell.Text;
}
}
for (var i = 0; i < elements.Count; i++)
{
var element = elements[i];
var row = 4 + i;
foreach (var item in values)
{
var parameter = element.GetParameters(item.Value)?.FirstOrDefault(p => p.HasValue);
if (parameter != null)
{
string value = string.Empty;
switch (parameter.StorageType)
{
case StorageType.None:
break;
case StorageType.Integer:
value = parameter.AsInteger().ToString();
break;
case StorageType.Double:
value = parameter.AsValueString();
break;
case StorageType.String:
//Revit数据库存储的值
var str = parameter.AsString();
if (string.IsNullOrEmpty(str))
{
//用户可见的前端显示,如根据单位设置而显示的值
value = parameter.AsValueString();
}
else
{
value = str;
}
break;
case StorageType.ElementId:
value = parameter.AsElementId().ToString();
break;
}
worksheet.Cells[row, item.Key].Value = value;
//单元格宽度自适应
worksheet.Cells[row, item.Key].AutoFitColumns();
//单元格样式,边框线,水平居中
worksheet.Cells[row, item.Key].Style.Border.BorderAround(ExcelBorderStyle.Thin);
worksheet.Cells[row, item.Key].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
}
//else
//{
// MessageBox.Show($"参数{item}不存在!", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
//}
}
}
}
foreach (var item in sheetToDel)
{
pkg.Workbook.Worksheets.Delete(item);
}
pkg.Save();
if (document != null)
{
document.Close(false);
}
//var package = Items
// .ToWorksheet("参数表")
// .WithConfiguration(cfg => cfg.WithColumnConfiguration(c => c.AutoFit()))
// .ToExcelPackage();
}
catch (Exception ex)
{
if (document != null)
{
document.Close(false);
}
sb.AppendLine(ex.Message);
sb.AppendLine(ex.StackTrace);
}
}
if (sb.Length > 0)
{
MessageBox.Show(sb.ToString());
}
var result = MessageBox.Show(
"是否打开文件夹?",
"提示",
MessageBoxButton.YesNo,
MessageBoxImage.Question);
if (result == MessageBoxResult.Yes)
{
Process.Start(path);
}
}
}
}
}