npoi读取excel_AutoCAD .NET 二次开发实例(13) 获取块参照坐标并输出到Excel

9a0ecf4cd0d35b861822ab61e510a950.png

# 0 引言

需求分析:

当需要在固定位置插入块或者是批量替换块时,可以通过获取块的坐标值,然后根据坐标位置进行插入块或者替换。

关键的第一步:就是获取块参照的坐标值。

结果:

90d294fff2c83dee93bf12ad1432ca0a.gif

# 1. 代码分析

逻辑:

1. 设置选择集过滤,根据块名称选择块。

2. 块参照(BlockReference)类自带的Position()方法输出坐标

3. 通过NPOI方式输出到Excel

这里做了一个Button按钮来进行交互操作

1954fe49d847e6d78cc1ee230cc5acc9.png

这里再啰嗦一下这个按钮添加的过程

找到工具性添加Button控件

0802040909a353240caf42bd5e942c1f.png

属性里面更改一下文本属性

680f8133d040f3a48c00dd1083b22539.png

然后双击控件 下面添加代码即可!(为你操碎了心)

设置选择集过滤,可以根据自己需求增加过滤条件,前面都说过怎么弄

fca15c3c60ee62c455a9e5857bea22ab.png

获取块参照坐标,用到的就是下面这个方法

dcea2a0184a8c46242efb7a50200ec40.png

b129176428eeb155875fd336528bd9e3.png

遍历所有的块参照,依次获取即可

接下来就是输出的过程了,还是跟之前一样,使用NOPI的方式进行Excel读写,Excel几种读写方式见:https://www.cnblogs.com/kenjiang/p/10790652.html

为什么用这个,之前也说过了,因为不需要Office环境,还快,有一点不好就是新建项目都要去下载NOPI相应的依赖包,挺麻烦的。

b389e7588398657ab66a26c8086a3e72.png

271d386e28809b7d99961ac9956613a9.png

写入的代码就不详细说了,毕竟出现第二次了。

完整代码:

 //存储读取坐标
 List<string> lstAddStr = new List<string>();  


 Database db = HostApplicationServices.WorkingDatabase;
 Document doc = Application.DocumentManager.MdiActiveDocument;
 SetFocus(doc.Window.Handle);       //选择完文件在切换焦点
 //锁定文档

 using (DocumentLock acLckDoc = doc.LockDocument())
 {

     //设置选择集过滤器选取块 比如图框
     TypedValue[] typeValue = new TypedValue[]
     {
         new TypedValue((int)DxfCode.BlockName,"TKA3(297X420)GZED_$2018.07") // 你自己的块名称
     };


     
     SelectionSet acSSet = this.SelectSsGet("GetSelection", null, typeValue);

     if (acSSet != null)
     {
         foreach (SelectedObject selObj in acSSet)
         {
             // 确认返回的是合法的SelectedObject对象  
             if (selObj != null) //
             {
                 //开始启动事物调整文字位置点和对齐点
                 using (Transaction trans = db.TransactionManager.StartTransaction())
                 {
                     BlockReference brf = trans.GetObject(selObj.ObjectId, OpenMode.ForWrite) as BlockReference;

                     lstAddStr.Add(brf.Position.ToString());//获取块参照的坐标
                 }
             }
         }
     }
 }


 //数据接下来输出到EXCEL表格
 IWorkbook wk = null;  //新建IWorkbook对象

 string localFilePath = "D:块参照坐标.xlsx";

 // 调用一个系统自带的保存文件对话框 写一个EXCEL
 SaveFileDialog saveFileDialog = new SaveFileDialog();   //新建winform自带保存文件对话框对象
 saveFileDialog.Filter = "Excel Office97-2003(*.xls)|*.xls|Excel Office2007及以上(*.xlsx)|*.xlsx";  //过滤只能存储的对象
 DialogResult result = saveFileDialog.ShowDialog();     //显示对话框
 localFilePath = saveFileDialog.FileName.ToString();
 //07版之前和之后创建方式不一样
 if (localFilePath.IndexOf(".xlsx") > 0) // 2007版
 {
     wk = new XSSFWorkbook();   //创建表格对象07版之后
 }
 else if (localFilePath.IndexOf(".xls") > 0) // 创建表格对象 2003版本
 {
     wk = new HSSFWorkbook();  //03版
 }
 //创建工作簿
 ISheet tb = wk.CreateSheet("输出坐标数据");
 for (int i = 0; i < lstAddStr.Count; i++)
 {
     ICell cell = tb.CreateRow(i).CreateCell(0);  //单元格对象 第i行第0列  cell 单元格对象
     cell.SetCellValue(lstAddStr[i]);//循环往单元格赋值               
 }


  //创建文件
 using (FileStream fs = File.OpenWrite(localFilePath)) //打开一个xls文件,如果没有则自行创建,如果存在myxls.xls文件则在创建是不要打开该文件!
 {
     wk.Write(fs);   //文件IO 创建EXCEL
     MessageBox.Show("已经成功输出块坐标^_^!");
     fs.Close();
 }

/// <summary>
        /// 获取选择集
        /// </summary>
        /// <param name="selectStr">选择方式</param>
        /// <param name="point3dCollection">选择点集合</param>
        /// <param name="typedValue">过滤参数</param>
        /// <returns></returns>
        public SelectionSet SelectSsGet(string selectStr, Point3dCollection point3dCollection, TypedValue[] typedValue)
        {
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            // 将过滤条件赋值给SelectionFilter对象
            SelectionFilter selfilter = null;
            if (typedValue != null)
            {
                selfilter = new SelectionFilter(typedValue);
            }
            // 请求在图形区域选择对象
            PromptSelectionResult psr;
            if (selectStr == "GetSelection")  // 提示用户从图形文件中选取对象
            {
                psr = ed.GetSelection(selfilter);
            }
            else if (selectStr == "SelectAll") //选择当前空间内所有未锁定及未冻结的对象
            {
                psr = ed.SelectAll(selfilter);
            }
            else if (selectStr == "SelectCrossingPolygon") //选择由给定点定义的多边形内的所有对象以及与多边形相交的对象。多边形可以是任意形状,但不能与自己交叉或接触。
            {
                psr = ed.SelectCrossingPolygon(point3dCollection, selfilter);
            }
            // 选择与选择围栏相交的所有对象。围栏选择与多边形选择类似,所不同的是围栏不是封闭的, 围栏同样不能与自己相交
            else if (selectStr == "SelectFence")
            {
                psr = ed.SelectFence(point3dCollection, selfilter);
            }
            // 选择完全框入由点定义的多边形内的对象。多边形可以是任意形状,但不能与自己交叉或接触
            else if (selectStr == "SelectWindowPolygon")
            {
                psr = ed.SelectWindowPolygon(point3dCollection, selfilter);
            }
            else if (selectStr == "SelectCrossingWindow")  //选择由两个点定义的窗口内的对象以及与窗口相交的对象
            {
                Point3d point1 = point3dCollection[0];
                Point3d point2 = point3dCollection[1];
                psr = ed.SelectCrossingWindow(point1, point2, selfilter);
            }
            else if (selectStr == "SelectWindow") // 选择完全框入由两个点定义的矩形内的所有对象。
            {
                Point3d point1 = point3dCollection[0];
                Point3d point2 = point3dCollection[1];
                psr = ed.SelectCrossingWindow(point1, point2, selfilter);
            }
            else
            {
                return null;
            }

            // 如果提示状态OK,表示对象已选
            if (psr.Status == PromptStatus.OK)
            {
                SelectionSet sSet = psr.Value;
                ed.WriteMessage("Number of objects selected: " + sSet.Count.ToString() + "n");// 打印选择对象数量
                return sSet;
            }
            else
            {
                // 打印选择对象数量
                ed.WriteMessage("Number of objects selected 0 n");
                return null;
            }
        }

今天就到这了!

原文请关注公众号:数据智能笔记

http://weixin.qq.com/r/L0yosLHE2uylrfXT9xk9 (二维码自动识别)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用NPOI读取Excel文件,您需要先使用NuGet包管理器安装NPOI。然后,您可以使用以下代码读取Excel文件中的所有数据并将其添加到扩展记录中: ``` using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.EditorInput; public void ImportExcelToExtensionData(string filePath) { //打开Excel文件 FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read); XSSFWorkbook workbook = new XSSFWorkbook(stream); ISheet sheet = workbook.GetSheetAt(0); //获取AutoCAD当前文档的数据库和编辑器 Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; using (Transaction tr = db.TransactionManager.StartTransaction()) { try { //打开实体 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(ObjectId.FromHandle(acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite)), OpenMode.ForWrite)); //循环遍历Excel表格中的每一行 for (int i = sheet.FirstRowNum; i <= sheet.LastRowNum; i++) { IRow row = sheet.GetRow(i); //循环遍历每一行中的每一列 for (int j = row.FirstCellNum; j < row.LastCellNum; j++) { ICell cell = row.GetCell(j); //将单元格的数据添加到扩展记录中 if (cell != null) { string data = cell.ToString(); ResultBuffer rb = new ResultBuffer(); rb.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, "MyApp")); rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, data)); Xrecord xRec = new Xrecord(); xRec.Data = rb; btr.AppendEntity(xRec); tr.AddNewlyCreatedDBObject(xRec, true); } } } //提交事务 tr.Commit(); } catch (Exception ex) { //回滚事务 tr.Rollback(); ed.WriteMessage("Error: " + ex.Message); } } } ``` 这将在AutoCAD中添加扩展记录,其中包含Excel文件中的所有数据。请注意,需要将“MyApp”替换为您要使用的应用程序的名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值