2017-03-07 41 views
1

如何将值添加到使用C#的活动工作簿的Excel单元?我是新来VSTO C#,不能找到适合我的解决方案...C#将内容添加到Excel工作表

这是我的代码(从这个问题Write to cell in excel using c#):

using Excel = Microsoft.Office.Interop.Excel; 

namespace ExcelSDRAddIn 
{ 
    public partial class UserControlSDR : UserControl 
    { 
     public UserControlSDR() 
     { 
      InitializeComponent(); 
     } 

     private void btnTemplate_Click(object sender, EventArgs e) 
     { 
      Excel.Worksheet ws = (Excel.Worksheet)(sender as Workbook).ActiveSheet; 
      ws.Cells[1, 1] = "Value"; 
     } 
    } 
} 

运行它,我得到下面的异常后在这条线Excel.Worksheet ws = (Excel.Worksheet)(sender as Workbook).ActiveSheet;

型“System.NullReferenceException”的异常出现在ExcelSDRAddIn.dll但在用户代码中没有处理

附加信息:未将对象引用设置为对象的实例。

也试图与此:

dynamic excelType = Type.GetTypeFromProgID("Excel.Application"); 
    excelType.Visible = true; 
    excelType.Workbooks.Add(); 
    dynamic workSheet = excelType.ActiveSheet; 

    workSheet.Cells[1, 1] = "Names"; 
    workSheet.Cells[1, 2] = "Age"; 

,并返回:

型 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' 的异常出现在System.Core.dll但没有在用户代码中处理

附加信息:'System.Reflection.TypeInfo'不包含'Visible'的定义

失败又如:

Microsoft.Office.Interop.Excel.Application oXL; 
Microsoft.Office.Interop.Excel._Workbook oWB; 
Microsoft.Office.Interop.Excel._Worksheet oSheet; 
... 
var Excel = new Excel.Application(); 
oXL = new Microsoft.Office.Interop.Excel.Application(); 
oWB = oXL.ActiveWorkbook; 
oSheet = oWB.ActiveSheet; 
oSheet.Cells[1, 1] = "Value"; 
+0

什么是发送者的到来在为运行时类型?从您发布的内容看来,发件人似乎不是工作簿类型,因此当您尝试将其转换为工作簿或发件人为空时,其值为空。 – Jinish

+0

此外,你可能要检查的一篇文章,我写与Office交互,而无需使用互操作:https://jinishbhardwaj.wordpress.com/2016/06/21/com-interop-without-referencing-com-assemblies-using-dynamic -c/ – Jinish

+0

我检查了文章,并添加代码,但仍然无法正常工作......看到更新的问题 – Valip

回答

3

访问的工作簿中的情况下,你使用:

Globals.ThisAddIn.Application.Workbooks... 

MSDN编号:Programming VSTO Add-Ins

下面的代码示例演示如何使用应用领域在VSTO添加 - 创建一个新的工作簿在Microsoft Office Excel中。此示例旨在从ThisAddIn类运行。

Excel.Workbook newWorkbook = this.Application.Workbooks.Add(System.Type.Missing); 

从ThisAddIn类以外做同样的事情,使用全局对象访问ThisAddIn类。有关Globals对象的更多信息,请参阅Office项目中对象的全局访问。

Excel.Workbook newWorkbook = Globals.ThisAddIn.Application.Workbooks.Add(System.Type.Missing); 

编辑:您需要使用此代码来获取活动工作

Excel.Worksheet ws = (Excel.Worksheet)Globals.ThisAddin.Application.ActiveSheet; 
+0

如何在不创建新工作簿的情况下实现这一目标?我需要使用活动工作簿 – Valip

+1

见我的编辑** Excel.Worksheet WS =(Excel.Worksheet)Globals.ThisAddin.Application.ActiveSheet; ** –

+0

如若此代码'ws.Cells [1,2] =“值” ;'工作?是的,它终于起作用了! – Valip

0

从你的方法名btnTemplate_Click我敢打赌,你正在使用按钮来调用这个函数。所以在这种情况下发件人是Button而不是Workbook。当您尝试解除发件人为Workbook时,您将收到null,并在尝试访问ActiveSheet属性时收到NullReferenceException

请再次阅读链接参考文献中的问题。它指出:

I created a visual studio excel workbook project which contains ThisWorkbook class

我不知道该怎么类看起来像,但我认为这就是方法private void ThisWorkbook_Startup(object sender, System.EventArgs e)应该被钩到某种`Startup事件的地方。

+0

你是对的。我试图在用户控件按下按钮时将一些内容添加到活动工作表中......如果您通过一个工作示例发布解决方案,它将帮助我很多 – Valip

+0

对不起,不,这不是要求建立完整解决方案的地方。在这里,您可以寻求帮助来解决您的问题,但没有人会发布所有解决方案。 – Reniuz