【问题标题】:C# add content to Excel WorksheetC# 向 Excel 工作表添加内容
【发布时间】:2017-03-07 21:22:23
【问题描述】:

如何使用 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”不包含“可见”的定义

另一个失败的例子:

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

【问题讨论】:

  • 发件人的运行时类型是什么?从您发布的内容来看,发件人似乎不是工作簿类型,因此当您尝试将其转换为工作簿时它为空,或者发件人作为空值进入。
  • 另外,您可能想查看我写的一篇文章,以便在不使用 Interop 的情况下与 Office 进行交互:jinishbhardwaj.wordpress.com/2016/06/21/…
  • 我检查了文章并添加了代码,但仍然不起作用...查看更新的问题
  • 我建议您不要使用 Interop,而是使用适用于 Excel 的优秀 NuGet 包之一,例如 ClosedXml:nuget.org/packages/ClosedXML
  • @OriNachum 我会回来做一个受保护的 QA。

标签: c# excel vsto


【解决方案1】:

要在您使用的场景中访问工作簿:

  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;

【讨论】:

  • 如何在不创建新工作簿的情况下实现这一目标?我需要使用活动的工作簿
  • 查看我的编辑 Excel.Worksheet ws = (Excel.Worksheet)Globals.ThisAddin.Application.ActiveSheet;
  • ws.Get_Range.. 你可以谷歌这个东西
  • 是的,现在我得到了剩下的。谢谢!
  • 谢谢,最后一件事,Vsto 很慢!要获得良好的速度,请参阅stackoverflow.com/questions/356371/… 并查找 VSTOContrib
【解决方案2】:

从你的方法名称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) 应该与某种“启动事件”挂钩的地方。

【讨论】:

  • 你是对的。当我按下用户控件中的按钮时,我正在尝试向活动工作表添加一些内容...如果您发布带有工作示例的解决方案,这将对我有很大帮助
  • 对不起,没有。这不是要求为您构建完整解决方案的地方。在这里您可以寻求帮助以解决您的问题,但没有人会发布所有解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多