【发布时间】: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。