Excel插件外部程序控制

本文介绍了如何使用Visual Studio开发Excel插件,包括创建外部程序、操作Excel对象的方法,并解决了常见问题如兼容多个版本的Office及插件加载失败的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对Excel插件的开发,目的是在工具栏中添加一个外部程序,点击这个外部程序,可以将当前的Sheet数据获取到并保存到另外一个sheet里面;主要注意两方面:

一、Excel插件外部程序建立向导,具体步骤是:

1.在 Microsoft Visual Studio .NET 的文件菜单上,单击新建,然后单击项目。
2.在新建项目对话框中,展开项目类型下的其他项目,选择扩展性项目,然后选择共享的外接程序模板。
3.键入 MyCOMAddin 作为该外接程序的名称,然后单击确定。
4.“扩展性向导”出现后,请按照下列步骤操作:
a. 在第 1 页,选择使用 Visual C# 创建外接程序,然后单击下一步。
b. 在第 2 页,选择下面的宿主应用程序,然后单击下一步:
Microsoft Word
Microsoft PowerPoint
Microsoft Outlook
Microsoft Excel
Microsoft Access
c. 在第 3 页上,输入该外接程序的名称和描述,然后单击下一步。

 

注意:该外接程序的名称和描述出现在 Office 应用程序的 COM 加载项对话框中。

 

d. 在第 4 页,选择所有可用的选项,然后单击下一步。
e. 单击完成。
5.

 

在项目菜单上,单击添加引用。单击组件列表中的 System.Windows.Forms.DLL,单击选择,然后单击确定。

引用要操作office对象,比如要操作excel,引用了Microsoft.Office.Interop.Excel,可以在微软的站点查找oxppia.exe文件下载,具体地址:http://download.microsoft.com/download/c/4/8/c4813cc0-a4d4-4bb4-b486-9cbd56f38235/oxppia.exe

Excel插件开发指导说明可以参考微软的网址:

http://support.microsoft.com/?kbid=302901

二、具体C#对Excel的操作:

1、如何获取到当前Excel、workbook、worksheet等:

                object o = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");

                Excel._Application app = o as Excel._Application;                Excel.Workbook workBook = app.ActiveWorkbook;//得到当前活动的excel文档

                Excel._Workbook wr = app.ActiveWorkbook;

               

                if (workBook == null)

                {

                    MessageBox.Show("No workbook is currently defined");

                }

                Excel.Worksheet xlsSheet;

                xlsSheet = (Excel.Worksheet)workBook.ActiveSheet;//得到当前Sheet

                m_iJ = xlsSheet.UsedRange.Rows.Count;//得到当前Sheet行数

2、各个属性值:

newWorksheet = (Excel.Worksheet)workBook.Worksheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);//新增一个Sheet

newWorksheet.Name = "导入MQC";//设置Sheet的名称

newWorksheet.get_Range("A1", Missing.Value).Value2 = "Path";//设置某个单元格的值

newWorksheet.Cells.Clear();//清除单元格里面的值

newWorksheet.Cells.Font.Size = "10";//设置单元格字体大小

 

问题1 Visual Studio 2005开发的Office插件无法在Office中运行

这个问题可能是由于没有安装KB908002中提到的prerequisite造成的,可以去下面的地址下载该文档中提到的补丁:http://support.microsoft.com/kb/908002

安装完成后,我们可以在Add-in的安装项目的prerequisites中找到一个新的组件。

问题2 如何制作兼容多个版本Office的Office Addin

通常情况下,我们编写的Add-in都是直接用向导生成的,且使用的是早期绑定技术(early binding)。但在许多需求中,我们需要制作一个能够兼容多个Office版本的Add-in,这时我们就不能使用早期绑定了,而应该使用后期绑定(late binding)。关于早期绑定和后期绑定的详细信息,请见http://word.mvps.org/FAQs/InterDev/EarlyvsLateBinding.htm

问题3 通常Addin设置保存在注册表的什么位置

以Office 2003 Word Add-in为例,通常会保存在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Office/Word/Addins中。

假设我们有一个名字为MyAddin1的Addin,那么它就会保存在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Office/Word/Addins/MyAddin1.Connect中。

对于Excel Add-in来说,也是类似的,通常保存在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Office/Excel/Addins中,依此类推。

在每个Add-in的设置属性中有一个重要的标志LoadBehavior,这个属性是保存在XXXX.Connect中的,类型为DWORD,这个值直接决定了Addin的启动模式,默认值为3表示Office应用程序一启动就运行,这个设置与我们在Addin向导中选择的"I would like my Add-in to load when the host application loads"是对应的。

问题4 当确定你的Add-in应该可以正确加载,但在启动时没有加载,这是怎么回事

如果一个Add-in因为某些原因在启动时加载失败,Office应用程序会自动把LoadBehavior改成8,这表示仅在需要加载时才加载该Add-in,而不是在Office启动时。所以这时可以到与该Add-in对应的注册表项中检查一下LoadBehavior值是否正确,如果为8,一定把它改成3。

AutoCAD 提供了多种方式供外部程序进行控制或自动化操作,这主要通过其开放的应用程序接口(API)和脚本支持实现。以下是一些常见的方法: ### 1. 使用 AutoLISP 脚本 AutoLISP 是一种嵌入式编程语言,专门用于 AutoCAD 的定制和自动化。它允许用户编写脚本来执行一系列命令,从而简化重复性任务。AutoLISP 脚本可以通过 `load` 函数加载并运行。 例如,以下是一个简单的 AutoLISP 程序,用于绘制一条直线: ```lisp (defun c:drawline () (command "_line" (list 0 0) (list 10 10) "") ) ``` 将上述代码保存为 `.lsp` 文件,然后在 AutoCAD 中使用 `load` 命令加载该文件,并通过输入 `drawline` 来执行该脚本。 ### 2. 使用 .NET API AutoCAD 提供了基于 .NET 的 API,支持使用 C#、VB.NET 等语言进行开发。通过这些 API,开发者可以创建功能强大的插件来扩展 AutoCAD 的功能。要使用 .NET API 进行开发,需要安装 AutoCAD 的软件开发工具包(SDK)。 以下是一个使用 C# 编写的简单示例,用于在 AutoCAD 中创建一条直线: ```csharp using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; [assembly: CommandClass(typeof(AutoCADPlugin.MyCommands))] namespace AutoCADPlugin { public class MyCommands { [CommandMethod("DrawLine")] public void DrawLine() { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite); Line line = new Line(new Point3d(0, 0, 0), new Point3d(10, 10, 0)); btr.AppendEntity(line); tr.AddNewlyCreatedDBObject(line, true); tr.Commit(); } } } } ``` ### 3. 使用 COM API AutoCAD 还提供了 COM(Component Object Model)接口,允许使用 Python、VBA 等语言进行自动化操作。通过 COM 接口,外部程序可以直接与 AutoCAD 进行交互,执行命令、获取数据等。 以下是一个使用 Python 和 `pywin32` 库通过 COM 接口与 AutoCAD 进行交互的示例: ```python import win32com.client # 创建 AutoCAD 应用程序对象 acad = win32com.client.Dispatch("AutoCAD.Application") doc = acad.ActiveDocument model_space = doc.ModelSpace # 定义直线的起点和终点 start_point = [0, 0, 0] end_point = [10, 10, 0] # 在模型空间中添加一条直线 line = model_space.AddLine(start_point, end_point) line.Update() ``` ### 4. 使用 ActiveX Automation AutoCAD 支持 ActiveX Automation,这意味着可以通过其他应用程序(如 Excel 或 Word)来控制 AutoCAD。例如,可以使用 VBA 在 Excel 中编写代码,调用 AutoCAD 的命令和对象。 以下是一个使用 VBA 在 Excel控制 AutoCAD 的示例: ```vba Sub DrawLine() Dim acadApp As Object Set acadApp = CreateObject("AutoCAD.Application") Dim doc As Object Set doc = acadApp.ActiveDocument Dim modelSpace As Object Set modelSpace = doc.ModelSpace Dim startPoint(0 To 2) As Double startPoint(0) = 0 startPoint(1) = 0 startPoint(2) = 0 Dim endPoint(0 To 2) As Double endPoint(0) = 10 endPoint(1) = 10 endPoint(2) = 0 Dim line As Object Set line = modelSpace.AddLine(startPoint, endPoint) line.Update End Sub ``` ### 5. 使用脚本文件 AutoCAD 还支持通过脚本文件(`.scr`)进行自动化操作。脚本文件包含一系列 AutoCAD 命令,可以在 AutoCAD 中直接运行。脚本文件可以通过文本编辑器创建,并通过 `script` 命令加载。 例如,以下是一个简单的脚本文件内容,用于绘制一条直线: ``` _line 0,0 10,10 ``` 将上述内容保存为 `drawline.scr` 文件,然后在 AutoCAD 中输入 `script` 命令,选择该文件并运行。 ### 6. 使用第三方工具和库 除了上述方法外,还可以使用一些第三方工具和库来简化 AutoCAD 的自动化操作。例如,`pyautocad` 是一个 Python 库,提供了更简洁的接口来与 AutoCAD 进行交互。 以下是一个使用 `pyautocad` 库的示例: ```python from pyautocad import Autocad, APoint acad = Autocad() doc = acad.doc model_space = doc.ModelSpace start_point = APoint(0, 0) end_point = APoint(10, 10) line = model_space.AddLine(start_point, end_point) line.Update() ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值