功能更新
This commit is contained in:
211
RevitAddins/MainViewModel.cs
Normal file
211
RevitAddins/MainViewModel.cs
Normal file
@@ -0,0 +1,211 @@
|
||||
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user