C#将内容添加到Excel工作表

时间:2017-03-07 12:19:51

标签: c# excel vsto

如何使用C#向活动工作簿的Excel单元格添加值?我是VSTO C#的新手,无法找到适合我的解决方案......

这是我的代码(来自此问题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;上收到以下异常:

  

ExcelSDRAddIn.dll中发生了'System.NullReferenceException'类型的异常,但未在用户代码中处理

     

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

也试过这个:

    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";

并返回:

  

System.Core.dll中出现“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”类型的异常,但未在用户代码中处理

     

其他信息:'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";

2 个答案:

答案 0 :(得分:3)

要访问方案中的工作簿,请使用:

  Globals.ThisAddIn.Application.Workbooks...

MSDN参考:Programming VSTO Add-Ins

以下代码示例演示如何使用“应用程序”字段在Microsoft Office Excel的VSTO加载项中创建新工作簿。此示例旨在从ThisAddIn类运行。

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

要从ThisAddIn类外部执行相同的操作,请使用Globals对象访问ThisAddIn类。有关Globals对象的详细信息,请参阅Office项目中对对象的全局访问。

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

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

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

答案 1 :(得分:0)

从您的方法名称btnTemplate_Click我打赌您使用按钮来调用此功能。因此,在这种情况下,发件人是Button而不是Workbook。当您尝试将发件人撤消到Workbook时,您将获得空,并且在尝试访问NullReferenceException媒体资源时获得ActiveSheet

请再次阅读您的链接参考中的问题。它声明:

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

我不确定该类是怎么样的,但我认为这是方法private void ThisWorkbook_Startup(object sender, System.EventArgs e)应该挂钩某种`Startup事件的地方。