Сообщество программистов Autodesk в СНГ

ADN Club => Revit API => Тема начата: wingsdraw от 09-10-2021, 12:24:52

Название: Как создать таблицу и экспортировать в Excel ?
Отправлено: wingsdraw от 09-10-2021, 12:24:52
Доброго времени, каким образом можно создать таблицу наполненную экземплярами одной категории и несколькими параметрами?
Пока только удалось собрать элементы нужной категории в коллектор.

 
Код - C# [Выбрать]
  1.  
  2.  
  3. Document doc = commandData.Application.ActiveUIDocument.Document;
  4. FilteredElementCollector collector = new FilteredElementCollector(doc);            
  5. BuiltInCategory builtInCategory = BuiltInCategory.OST_Walls;
  6. ElementCategoryFilter elementCategoryFilter = new ElementCategoryFilter(builtInCategory);            
  7. IList <Element> allElements = collector.WherePasses(elementCategoryFilter).WhereElementIsNotElementType().ToElements();
  8.            
  9. List<Parameter> ElemWidthList = new List<Parameter>();
  10.            
  11. foreach (Element e in AllWalls)
  12.             {              
  13.                ElemWidthList.Add(e.LookupParameter("Width"));  
  14.              }
  15.  
  16.  
Название: Re: Как создать таблицу и экспортировать в Excel ?
Отправлено: Александр Игнатович от 09-10-2021, 12:37:26
Конечно, можно, существует много библиотек, в т.ч. бесплатных для работы с Excel. На вскидку, EPPlus (4.* версии), ClosedXML или стандартный (правда, довольно низкоуровневый) DocumentFormatOpenXML
Название: Re: Как создать таблицу и экспортировать в Excel ?
Отправлено: wingsdraw от 14-10-2021, 16:55:47
Большое спасибо за рекомендации, остановился на EPPlus. Ты сам какую предпочитаешь? Говорят Closed XML наиболее эффективный, что по этому поводу думаешь?
Для всех, кто наткнулся на тему, вот как выглядит код с использованием данной библиотеки.

Код - C# [Выбрать]
  1. ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
  2.             Document doc = commandData.Application.ActiveUIDocument.Document;
  3.  
  4.             //Коллектор
  5.             FilteredElementCollector collector = new FilteredElementCollector(doc);
  6.             IList<Element> _elementsDB = collector.OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType().ToElements();
  7.             ICollection<ElementId> _elementsIds = collector.OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType().ToElementIds();        
  8.  
  9.             List<double> _pHeight = new List<double>();
  10.  
  11.             foreach (Element e in _elementsDB)
  12.             {
  13.                 if (e.LookupParameter("Неприсоединенная высота") != null)
  14.                 {
  15.                     _pHeight.Add(UnitUtils.ConvertFromInternalUnits(e.LookupParameter("Неприсоединенная высота").AsDouble(), DisplayUnitType.DUT_MILLIMETERS));
  16.                 }
  17.                 else
  18.                 {
  19.                     continue;
  20.                 }
  21.  
  22.             }
  23.             //Эксель
  24.             ExcelPackage package = new ExcelPackage();
  25.             ExcelWorksheet ws = package.Workbook.Worksheets.Add("Sheet");
  26.             var file = new FileInfo(@"D:\Walls.xlsx");
  27.  
  28.             using (ExcelRange Rng = ws.Cells["A1:E2"])
  29.             {                
  30.                 ExcelTable table = ws.Tables.Add(Rng, "Table");
  31.                 table.Columns[0].Name = "Name";
  32.                 table.Columns[1].Name = "ID";
  33.                 table.Columns[2].Name = "Height";
  34.             }
  35.            
  36.             int col = 1;
  37.             for (int row = 2; row - 1 <= _elementsDB.Count; row++)
  38.             {
  39.                 ws.Cells[row, col].Value = _elementsDB[row - 2].Name;
  40.             }
  41.  
  42.             int col2 = 2;
  43.             for (int row = 2; row - 1 <= _elementsIds.Count; row++)
  44.             {
  45.                 ws.Cells[row, col2].Value = _elementsIds.ElementAt(row - 2);
  46.             }
  47.  
  48.             int col3 = 3;
  49.             for (int row = 2; row - 1 <= _elementsIds.Count; row++)
  50.             {
  51.                 ws.Cells[row, col3].Value = _pHeight[row - 2];
  52.             }
  53.  
  54.             package.SaveAs(new FileInfo(file.ToString()));
Название: Re: Как создать таблицу и экспортировать в Excel ?
Отправлено: Александр Игнатович от 14-10-2021, 17:04:53
Мне EPPlus больше по нраву, ClosedXML чуть более высокоуровневая обертка над DocumentFormatOpenXML, местами глючная. Из её плюсов - ребята заморочились с шириной столбцов, дело в том, что Excel очень неочевидно управляет шириной столбцов, они ни разу не такие, как если открыть xlsx архиватором и посмотреть внутренние xml-ки (и не просто какой-то коэффициент). Есть сценарии, где это важно, поэтому, в общем, использую обе либы + для одного из проектов собранную из слегка модифицированных исходников ClosedXML.
Название: Re: Как создать таблицу и экспортировать в Excel ?
Отправлено: wingsdraw от 19-10-2021, 12:21:51
Ок! Пока стоит задача выгружать элементы с определенными параметрами, но буду иметь в виду указанные особенности. Благодаря тому, что ты указал "(4.* версии)" после EPPlus я смог устранить проблему "***.cs Not found" (Debugger could not locate the source file ***) во время режима отладки. Все перепробовал, оказалось нужно было просто опуститься на версию ниже. Получается новейшие версии не сочетаются с Revit? Казалось бы 5.7.* должна быть наиболее адаптирована для всего, но нет.
Название: Re: Как создать таблицу и экспортировать в Excel ?
Отправлено: Александр Игнатович от 19-10-2021, 12:34:44
5.* не пробовал, там у ребят изменилась лицензия, 4.* свободная, начиная с пятой - надо покупать :-)