ADN Club > Revit API
Как создать таблицу и экспортировать в Excel ?
wingsdraw:
Доброго времени, каким образом можно создать таблицу наполненную экземплярами одной категории и несколькими параметрами?
Пока только удалось собрать элементы нужной категории в коллектор.
--- Код - C# [Выбрать] --- Document doc = commandData.Application.ActiveUIDocument.Document;FilteredElementCollector collector = new FilteredElementCollector(doc); BuiltInCategory builtInCategory = BuiltInCategory.OST_Walls;ElementCategoryFilter elementCategoryFilter = new ElementCategoryFilter(builtInCategory); IList <Element> allElements = collector.WherePasses(elementCategoryFilter).WhereElementIsNotElementType().ToElements(); List<Parameter> ElemWidthList = new List<Parameter>(); foreach (Element e in AllWalls) { ElemWidthList.Add(e.LookupParameter("Width")); }
Александр Игнатович:
Конечно, можно, существует много библиотек, в т.ч. бесплатных для работы с Excel. На вскидку, EPPlus (4.* версии), ClosedXML или стандартный (правда, довольно низкоуровневый) DocumentFormatOpenXML
wingsdraw:
Большое спасибо за рекомендации, остановился на EPPlus. Ты сам какую предпочитаешь? Говорят Closed XML наиболее эффективный, что по этому поводу думаешь?
Для всех, кто наткнулся на тему, вот как выглядит код с использованием данной библиотеки.
--- Код - C# [Выбрать] ---ExcelPackage.LicenseContext = LicenseContext.NonCommercial; Document doc = commandData.Application.ActiveUIDocument.Document; //Коллектор FilteredElementCollector collector = new FilteredElementCollector(doc); IList<Element> _elementsDB = collector.OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType().ToElements(); ICollection<ElementId> _elementsIds = collector.OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType().ToElementIds(); List<double> _pHeight = new List<double>(); foreach (Element e in _elementsDB) { if (e.LookupParameter("Неприсоединенная высота") != null) { _pHeight.Add(UnitUtils.ConvertFromInternalUnits(e.LookupParameter("Неприсоединенная высота").AsDouble(), DisplayUnitType.DUT_MILLIMETERS)); } else { continue; } } //Эксель ExcelPackage package = new ExcelPackage(); ExcelWorksheet ws = package.Workbook.Worksheets.Add("Sheet"); var file = new FileInfo(@"D:\Walls.xlsx"); using (ExcelRange Rng = ws.Cells["A1:E2"]) { ExcelTable table = ws.Tables.Add(Rng, "Table"); table.Columns[0].Name = "Name"; table.Columns[1].Name = "ID"; table.Columns[2].Name = "Height"; } int col = 1; for (int row = 2; row - 1 <= _elementsDB.Count; row++) { ws.Cells[row, col].Value = _elementsDB[row - 2].Name; } int col2 = 2; for (int row = 2; row - 1 <= _elementsIds.Count; row++) { ws.Cells[row, col2].Value = _elementsIds.ElementAt(row - 2); } int col3 = 3; for (int row = 2; row - 1 <= _elementsIds.Count; row++) { ws.Cells[row, col3].Value = _pHeight[row - 2]; } package.SaveAs(new FileInfo(file.ToString()));
Александр Игнатович:
Мне EPPlus больше по нраву, ClosedXML чуть более высокоуровневая обертка над DocumentFormatOpenXML, местами глючная. Из её плюсов - ребята заморочились с шириной столбцов, дело в том, что Excel очень неочевидно управляет шириной столбцов, они ни разу не такие, как если открыть xlsx архиватором и посмотреть внутренние xml-ки (и не просто какой-то коэффициент). Есть сценарии, где это важно, поэтому, в общем, использую обе либы + для одного из проектов собранную из слегка модифицированных исходников ClosedXML.
wingsdraw:
Ок! Пока стоит задача выгружать элементы с определенными параметрами, но буду иметь в виду указанные особенности. Благодаря тому, что ты указал "(4.* версии)" после EPPlus я смог устранить проблему "***.cs Not found" (Debugger could not locate the source file ***) во время режима отладки. Все перепробовал, оказалось нужно было просто опуститься на версию ниже. Получается новейшие версии не сочетаются с Revit? Казалось бы 5.7.* должна быть наиболее адаптирована для всего, но нет.
Навигация
Перейти к полной версии