C# C excel从C创建的工作表获取文档级别

C# C excel从C创建的工作表获取文档级别,c#,excel,controls,office-interop,comobject,C#,Excel,Controls,Office Interop,Comobject,我一直在尝试向动态创建的excel工作表添加组合框或任何表单控件。在c中创建excel工作簿项目时,我能够将组合框添加到excel工作表中,并且能够访问文档级工作表1中的Controls.AddComboBox函数,如下所示: 图1 这是指第1页 创建工作簿项目时,此代码工作正常,但在动态创建excel工作表时,如下所示: 图2 我无法进入工作表ws并获取controls.AddCombobox。将工作表Fig 2放入quickwatch表示该系统。将此对象放入另一个项目Fig 1返回值Exce

我一直在尝试向动态创建的excel工作表添加组合框或任何表单控件。在c中创建excel工作簿项目时,我能够将组合框添加到excel工作表中,并且能够访问文档级工作表1中的Controls.AddComboBox函数,如下所示: 图1

这是指第1页 创建工作簿项目时,此代码工作正常,但在动态创建excel工作表时,如下所示: 图2

我无法进入工作表ws并获取controls.AddCombobox。将工作表Fig 2放入quickwatch表示该系统。将此对象放入另一个项目Fig 1返回值ExcelWorkbook2.Sheet1。如何才能访问Controls.AddCombobox,它被转换为工作表数据库,用于c生成的工作表图2。谢谢

仅适用于Microsoft.Office.Tools.Excel命名空间的用户。在您的情况下,Sheet1是在设计时创建的主体项

在运行时创建的工作表

…不能包含任何主机控件或 Windows窗体控件

要在运行时在工作表上创建组合框,以处理C语言中的事件并避免VBA,请执行以下操作:

程序集引用: Microsoft.Vbe.Interop Microsoft.Vbe.Interop.dll Microsoft.Vbe.Interop.Forms Microsoft.Vbe.Interop.Forms.dll Microsoft.VisualBasic Microsoft.VisualBasic.dll

测试/工作代码:


请支持你的投票和评论。谢谢,Leo。

我没有太多地使用Microsoft.Office.Tools.Excel,但它似乎有一个很好的结构,类似于C中的常规控件。Interop据我所知,您在下面的代码中有一个完全不同的故事:它不遵循典型的.NET控件结构,而是VBA中的原始控件结构。例如,组合框与不同于标准.NET组合框的范围相关联。在遇到更具体的问题之前,也许您应该在MSDN中获得许多完整的工作代码,以便更好地理解这种新格式。我在VisualStudio中创建了一个工作簿项目,并能够将控件添加到单元格中,如图1所示。我正试图对c代码生成的Excel工作表图2执行相同的操作,但其中的工作表似乎有一些属性,可能是因为创建Excel工作表时我不在Excel工作表对象中。这是我在第一条注释中试图解释的内容:现在在第二条代码中,您正在处理Office Interop,规则不同的地方。我的建议是,你需要一个完整的工作代码来适应新的格式,它甚至没有考虑到组合框,否则你会因为不理解正在发生的事情而面临不断的问题。这里有一个指向完整工作代码的链接:。运行它,了解Interop的工作原理,并在您完全清楚所有这些想法后担心combobox。PS:一旦您的想法清楚,请记住,这种格式的combobox称为DropDown xlDropDown。我以前实际运行并构建过这段代码,我也使用了DropDown,DropDown与控件一样具有事件,他们有一个ddl.onaction=change事件,该事件会转到一个宏,我选择或想要使用一个组合框,因为我可以返回到c
namespace ExcelWorkbook2{
   public partial class Sheet1{
     private void Sheet1_Startup(object sender, System.EventArgs e){
       Microsoft.Office.Tools.Excel.Controls.ComboBox comboBox1  
          =this.Controls.AddComboBox(this.Range["A1", "A1"], "comboBox1");
          comboBox1.Items.Add("1 Item");
Application xlApp = new Application();
xlApp.Visible = true;
Workbook wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Worksheet ws = (Worksheet)wb.Worksheets[1];
using MSForms = Microsoft.Vbe.Interop.Forms;
using System.Windows.Forms;

...

// insert object shape
Excel.Shape cbo = ws.Shapes.AddOLEObject("Forms.ComboBox.1", Type.Missing, false, false, Type.Missing, Type.Missing, Type.Missing, 20, 1, 100, 20);
cbo.Name = cboName;

// bind it and wire it up
MSForms.ComboBox comboBox = (Microsoft.Vbe.Interop.Forms.ComboBox)Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(ws, null, cboName, new object[0], null, null, null);
comboBox.FontSize = 10;
comboBox.FontBold = true;
comboBox.Change += new MSForms.MdcComboEvents_ChangeEventHandler(comboBox_Changed);

// samle data
comboBox.AddItem("Stackoverflow");
comboBox.AddItem("Cool devs");

...

private void comboBox_Changed()
{
    System.Windows.Forms.MessageBox.Show("Selectiong Changed!");
}