点上方蓝字关注我,一起愉快的学习吧,速速上车!
0 引言
CAD中的文本会设计到与外部文件的交互,需要输出到Excel或是txt中进行统计分析,关于C#读写Excel和txt的方式有多种,可自行查阅相关资料。
先上结果:
如何实现,请见下文!
1 输出到Excel
添加一个Windows窗体
添加两个按钮
可以在属性Text中设置窗口和控件的名称以及大小,这个自行去摸索,都是可视化界面操作的东西。
给按钮添加点击事件
写入代码
C#读取Excel的方式有多种(可参考:https://www.cnblogs.com/kenjiang/p/10790652.html)
这里使用NPOI的方式读写Excel
NPOI项目地址:https://github.com/tonyqus/npoi
在这方式读取Excel不需要安装Office,读取速度也很快,可以直接在Nuget下载,你可以准备下载好的dll,离线使用
有网就直接在Nuget下载,这样方便
安装即可
添加引用命名空间
using NPOI.SS.UserModel;using NPOI.HSSF.UserModel; using NPOI.XSSF.UserModel;
这下就可以开始将你需要输出的文本内容输出到Excel了
通过选择集过滤方式,选取多行文本,然后遍历每一个选择对象,将遍历结果添加至一个List中
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[1]; typeValue.SetValue(new TypedValue(0, "MTEXT"), 0); 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()) { MText myent = trans.GetObject(selObj.ObjectId, OpenMode.ForWrite) as MText; lstAddStr.Add(myent.Contents); } } } }
输出到Excel
IWorkbook wk = null; //新建IWorkbook对象string localFilePath = "D:\\TEST.xlsx";// 调用一个系统自带的保存文件对话框 写一个EXCELSaveFileDialog 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();}
2 输出到txt
将获取的多行文本输出到TxT
C# 读写txt文本的方案可参考:
https://www.cnblogs.com/stilldream/p/10044011.html
跟上面一样,选择集过滤选取后,输出到txt中
代码:
SaveFileDialog saveDlg = new SaveFileDialog();saveDlg.Title = "输出文本内容";saveDlg.Filter = "文本文件(*.txt)|*.txt";saveDlg.InitialDirectory = Path.GetDirectoryName(db.Filename);string fileName = Path.GetFileName(db.Filename);saveDlg.FileName = fileName.Substring(0, fileName.IndexOf('.'));DialogResult saveDlgRes = saveDlg.ShowDialog();if (saveDlgRes == DialogResult.OK){ string[] contents = new string[lstAddStr.Count]; for (int i = 0; i < lstAddStr.Count; i++) { contents[i] = lstAddStr[i].ToString(); } File.WriteAllLines(saveDlg.FileName, contents);}
最后在类文件中新建一个命令来调用写好的窗口程序,可以选择模态和非模态的方式
using Autodesk.AutoCAD.Runtime;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace _09_输出文本{ public class Class1 { [CommandMethod("CTE")] //CAD启动界面 public void CADTextExport(){ myForm myfrom = new myForm(); // Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(myfrom); //在CAD里头显示界面 模态显示 Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessDialog(myfrom); //在CAD里头显示界面 非模态显示 // myfrom.sh } }}
CAD里面通过命令就可以调用该窗口程序了
这里输出的是多行文本,如果想输出单行文本或者都输出,只需要在选择集过滤那里改一下即可。
完整代码自取地址:https://gitee.com/yuzhaokai/CADExampleDemo.git