Как создать таблицу и экспортировать в Excel ?

Автор Тема: Как создать таблицу и экспортировать в Excel ?  (Прочитано 3187 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн wingsdrawАвтор темы

  • ADN OPEN
  • Сообщений: 23
  • Карма: 0
Доброго времени, каким образом можно создать таблицу наполненную экземплярами одной категории и несколькими параметрами?
Пока только удалось собрать элементы нужной категории в коллектор.

 
Код - 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.  

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Конечно, можно, существует много библиотек, в т.ч. бесплатных для работы с Excel. На вскидку, EPPlus (4.* версии), ClosedXML или стандартный (правда, довольно низкоуровневый) DocumentFormatOpenXML

Оффлайн wingsdrawАвтор темы

  • ADN OPEN
  • Сообщений: 23
  • Карма: 0
Большое спасибо за рекомендации, остановился на 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()));

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Мне EPPlus больше по нраву, ClosedXML чуть более высокоуровневая обертка над DocumentFormatOpenXML, местами глючная. Из её плюсов - ребята заморочились с шириной столбцов, дело в том, что Excel очень неочевидно управляет шириной столбцов, они ни разу не такие, как если открыть xlsx архиватором и посмотреть внутренние xml-ки (и не просто какой-то коэффициент). Есть сценарии, где это важно, поэтому, в общем, использую обе либы + для одного из проектов собранную из слегка модифицированных исходников ClosedXML.

Оффлайн wingsdrawАвтор темы

  • ADN OPEN
  • Сообщений: 23
  • Карма: 0
Ок! Пока стоит задача выгружать элементы с определенными параметрами, но буду иметь в виду указанные особенности. Благодаря тому, что ты указал "(4.* версии)" после EPPlus я смог устранить проблему "***.cs Not found" (Debugger could not locate the source file ***) во время режима отладки. Все перепробовал, оказалось нужно было просто опуститься на версию ниже. Получается новейшие версии не сочетаются с Revit? Казалось бы 5.7.* должна быть наиболее адаптирована для всего, но нет.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
5.* не пробовал, там у ребят изменилась лицензия, 4.* свободная, начиная с пятой - надо покупать :-)