xBIM 基础15 IFC导出Excel报表
IFC导出Excel空间报表文件
本篇将向您展示从IFC文件读取数据所需的一些概念。它使用IFC4接口,适用于IFC2x3和IFC4型号。要创建Excel文件,我们使用NPOI。在这个例子中你只需要 xBIM Essentials 组件。包含样本数据的所有代码均可在此处获得。
此示例的结果如下所示:
您将需要以下using
声明:
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using Xbim.Ifc;
using Xbim.Ifc4.Interfaces;
主要功能如下:
//从模板初始化NPOI工作簿
var workbook = new XSSFWorkbook("template.xlsx");
var sheet = workbook.GetSheet("Spaces");//用单位创建漂亮的数字格式。 现实中需要更多的关心的是单位。
//我们只知道我们现在的模型有空间面积以立方米和空间体积为单位
//请注意从Revit导出的原始数据是错误的,因为数据量比应该大1000倍。
//在这个例子中,数据是使用xBIM修复的。
var areaFormat = workbook.CreateDataFormat();
var areaFormatId = areaFormat.GetFormat("# ##0.00 [$m²]");
var areaStyle = workbook.CreateCellStyle();
areaStyle.DataFormat = areaFormatId;
var volumeFormat = workbook.CreateDataFormat();
var volumeFormatId = volumeFormat.GetFormat("# ##0.00 [$m³]");
var volumeStyle = workbook.CreateCellStyle();
volumeStyle.DataFormat = volumeFormatId;
//打开IFC模型。 不会改变模型中的任何东西,所以我们可以把编辑器的信息保留下来。
using (var model = IfcStore.Open("SampleHouse.ifc"))
{
//获取模型中的所有空间.
//需要 ToList() 方便使用 Foreach
var spaces = model.Instances.OfType<IIfcSpace>().ToList();
//设置报表标题
sheet.GetRow().GetCell()
.SetCellValue($"Space Report ({spaces.Count} spaces)");
foreach (var space in spaces)
{
//写报表数据
WriteSpaceRow(space, sheet, areaStyle, volumeStyle);
}
}
//保存 报表
using (var stream = File.Create("spaces.xlsx"))
{
workbook.Write(stream);
stream.Close();
}
//打开保存的EXCEL 文件
Process.Start("spaces.xlsx");
此代码使用以下函数从IFC读取数据并为每个空间写入一行
private static void WriteSpaceRow(IIfcSpace space, ISheet sheet, ICellStyle areaStyle, ICellStyle volumeStyle)
{
var row = sheet.CreateRow(sheet.LastRowNum + ); var name = space.Name;
row.CreateCell().SetCellValue(name); var floor = GetFloor(space);
row.CreateCell().SetCellValue(floor?.Name); var area = GetArea(space);
if (area != null)
{
var cell = row.CreateCell();
cell.CellStyle = areaStyle; // 如果来自属性而不是数量,那么僵不能保证它是数字
if (area.UnderlyingSystemType == typeof(double))
cell.SetCellValue((double)(area.Value));
else
cell.SetCellValue(area.ToString());
} var volume = GetVolume(space);
if (volume != null)
{
var cell = row.CreateCell();
cell.CellStyle = volumeStyle; // 如果来自属性而不是数量,那么将不能保证它是数字
if (volume.UnderlyingSystemType == typeof(double))
cell.SetCellValue((double)(volume.Value));
else
cell.SetCellValue(volume.ToString());
}
}
要获得包含空间的楼层,您需要执行此操作:
private static IIfcBuildingStorey GetFloor(IIfcSpace space)
{
return
//获取所有对象化的关系,这些关系将按此空间进行分解
space.Decomposes //选择分解的对象(这些对象可能是其他空间或建筑楼层)
.Select(r => r.RelatingObject) //仅获取楼层
.OfType<IIfcBuildingStorey>() //获取第一个
.FirstOrDefault();
}
IFC包含数据基础结构,用于存储与产品及其类型相关的任意数据。这种基础设施相当复杂。存储数据的两种主要方式是数量或属性。数量是明确的,它们包含的值的类型,其中属性可以包含许多不同的数据类型作为值。对于面积和体积,如果定义了数量,则最好从数量中获取值
private static IIfcValue GetArea(IIfcProduct product)
{
//尝试先从数量中获取
var area =
//获取可以定义属性和数量集的所有关系
product.IsDefinedBy
//在所有属性和数量集之间搜索。
//您可能还希望按名称搜索特定数量
.SelectMany(r => r.RelatingPropertyDefinition.PropertySetDefinitions)
//数量集合
.OfType<IIfcElementQuantity>()
//从数量集获取所有数量
.SelectMany(qset => qset.Quantities)
//我们只对面积感兴趣
.OfType<IIfcQuantityArea>()
//我们将采取第一个。显然有一个以上的面积属性
//所以, 要检查的名称。但是,我们将保持它简单的这个例子。
.FirstOrDefault()?
.AreaValue;
if (area != null)
return area;
//从属性中获取值
return GetProperty(product, "Area");
} private static IIfcValue GetVolume(IIfcProduct product)
{
var volume = product.IsDefinedBy
.SelectMany(r => r.RelatingPropertyDefinition.PropertySetDefinitions)
.OfType<IIfcElementQuantity>()
.SelectMany(qset => qset.Quantities)
.OfType<IIfcQuantityVolume>()
.FirstOrDefault()?.VolumeValue;
if (volume != null)
return volume;
return GetProperty(product, "Volume");
}
更常见的属性在属性集中搜索
private static IIfcValue GetProperty(IIfcProduct product, string name)
{
return
//获取可以定义属性和数量集的所有关系
product.IsDefinedBy
//在所有属性和数量集之间搜索。您可能还希望在特定属性集中搜索
.SelectMany(r => r.RelatingPropertyDefinition.PropertySetDefinitions)
//在这种情况下, 只考虑属性集。
.OfType<IIfcPropertySet>()
//从所有属性集中获取所有属性
.SelectMany(pset => pset.HasProperties)
//只允许考虑单个值属性。还有枚举属性,
//表属性、引用属性、复杂属性和其他
.OfType<IIfcPropertySingleValue>()
.Where(p =>
string.Equals(p.Name, name, System.StringComparison.OrdinalIgnoreCase) ||
p.Name.ToString().ToLower().Contains(name.ToLower()))
.FirstOrDefault()?.NominalValue;
}
xBIM 基础15 IFC导出Excel报表的更多相关文章
- xBIM IFC 输出 Excel 报表
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- 从数据库中导出excel报表
通常需要将后台数据库中的数据集或者是其他列表等导出excel 报表,这里主要引用了Apose.cells dll 类库, (1)直接上主要代码: protected void txtExport_Cl ...
- poi导出Excel报表多表头双层表头、合并单元格
效果图: controller层方法: /** * * 导出Excel报表 * @param request * @return * */ @ ...
- java导出excel报表
1.java导出excel报表: package cn.jcenterhome.util; import java.io.OutputStream;import java.util.List;impo ...
- Java使用POI实现数据导出excel报表
Java使用POI实现数据导出excel报表 在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅 ...
- 根据模板导出Excel报表并生成多个Sheet页
因为最近用报表导出比较多,所有就提成了一个工具类,本工具类使用的场景为 根据提供的模板来导出Excel报表 并且可根据提供的模板Sheet页进行复制 从而实现多个Sheet页的需求, 使用本工具类时 ...
- 根据模板导出Excel报表并复制模板生成多个Sheet页
因为最近用报表导出比较多,所有就提成了一个工具类,本工具类使用的场景为 根据提供的模板来导出Excel报表 并且可根据提供的模板Sheet页进行复制 从而实现多个Sheet页的需求, 使用本工具类时 ...
- Atitit.导出excel报表的设计与实现java .net php 总
Atitit.导出excel报表的设计与实现java .net php 总结 1. 导出报表 表格的设计要素1 1.1. 支持通用list<Map>转换1 1.2. 对于空列是否输出1 1 ...
- Atitit.导出excel报表的设计与实现java .net php 总结
Atitit.导出excel报表的设计与实现java .net php 总结 1. 导出报表 表格的设计要素1 1.1. 支持通用list<Map>转换1 1.2. 对于空列是否输出1 1 ...
随机推荐
- hdoj--1272--小希的迷宫(并查集)
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- notepad++ 插件推荐——快速定位文件
介绍Notepad++的文章很多,我这里就不赘述了.简言之,是一个轻便的文本编辑工具.结合丰富的插件,可以实现很多功能,可以成为一个轻量级的IDE,用来做脚本开发非常合适. 这里介绍几个插件可以用来进 ...
- 用户命令切换-命令su
命令su格式为su [-] username su su - su test su root
- docker中出现容器未运行无法进入容器的操作
- springMVC、mybatis实现的登录页面(maven)
首先项目结构 pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:// ...
- webform 下使用autofac
官网介绍: http://docs.autofac.org/en/latest/integration/webforms.html#quick-start HTTP 错误 500.22 - Inter ...
- Redis学习笔记(八) 基本命令:SortedSet操作
原文链接:http://doc.redisfans.com/sorted_set/index.html SortedSet的数据结构类似于Set,不同的是Sorted中的每个成员都分配了一个值(Sco ...
- 前端面试---常见的web安全及防护原理
一.常见的web安全及防护原理 1.sql注入原理 就是通过把sql命令插入到web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 防护,总的来说有以下几点: 1. ...
- PhotoZoom的工具栏 图片放大不失真
使用PhotoZoom能够对数码图片无损放大,备受设计师和业内人员的青睐,它的出现时一场技术的革新,新颖的技术,简单的界面,优化的算法,使得它可以对图片进行放大而没有锯齿,不会失真.本文为您一起来认识 ...
- Java Mail解决标题乱码问题
在Java实现发送邮件功能时,直接使用 message.setSubject(subject) 的方式设置标题,在本地测试发送邮件的中文标题可以正常显示,但是将项目部署到服务器后,发送邮件的中文标题就 ...