我需要用C#完成一个应用程序。
现在我想获得一个控制Excel文件的函数来获取数据。
我使用getActiveObject("Excel.Application")
,但这没有任何回报。我无法在VS2008中使用Excel.Application
,而是使用Microsoft.Office.Interop.Excel.Application
。
还有另一种方法吗?
Microsoft.Office.Interop.Excel.Application e = (Microsoft.Office.Interop.Excel.Application)Marshal.GetActiveObject("Excel.Application");
答案 0 :(得分:3)
经过大约半天的游戏,我终于想出了如何使这项工作,所以你可以锁定excel的开放副本。我的用户一直在抱怨有太多的Excel实例打开。
以下是我为使其发挥作用所做的一小部分:
_Application excelApp;
try
{
excelApp = (_Application)Marshal.GetActiveObject("Excel.Application");
}
catch(Exception)
{
// this is important. If Excel is not running, GetActiveObject will throw
// an exception
excelApp = null;
}
if( excelApp == null )
{
excelApp = new ApplicationClass();
}
我一直在追逐这一段时间,最后有时间蹲下来想出来。
答案 1 :(得分:1)
为了能够将Excel对象模型称为“Excel”,您可以通过命名空间(或文档)顶部的using
语句创建别名,如下所示:
using Excel = Microsoft.Office.Interop.Excel;
此后,您可以参考Excel.Application
而不是冗长的Microsoft.Office.Interop.Excel.Application
。
至于你对Marshal.GetActiveObject的调用失败的原因,我不能肯定地说。几点想法:
(1)您确定已经存在正在运行的Excel实例吗?如果没有,则创建一个新的Excel应用程序:
Excel.Application xlApp = new Excel.Application();
(2)如果肯定有一个Excel应用程序已经运行,那么如果Excel应用程序从未失去焦点,则Excel实例可能尚未添加到运行对象表(ROT)中。有关详细信息,请参阅:Visual C# .NET Error Attaching to Running Instance of Office Application。我相信Marshal.GetActiveObject方法应该在这种情况下抛出异常 - 不要悄悄地返回null - 但这似乎仍然可能相关。
我希望这会有所帮助......
麦克
答案 2 :(得分:1)
请参阅以下链接中给出的MS KB ...
答案 3 :(得分:1)
我还一直在使用命名空间使用Excel Addins
using Excel=Microsoft.Interop.Office.Excel;
代替上面的代码,使用Microsoft.Interop.Office.Excel,以了解更多信息。
using System.IO;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Serialization;
using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.Office.Interop.Excel;
using static MMCAPP2010.Profile;
using System.Runtime.InteropServices;
namespace MMCAPP2010
{
public class ExcelTemplateLoad
{
public void DeserializeObject(string filename)
{
Excel.Application instance;
Workbook wb = null;
try
{
//getting the current running instance of an excel application
instance = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
}
catch
{
instance = new Excel.Application();
}
//opening the template
wb = instance.Workbooks.Open(@"C:\Users\U1152927\Downloads\sample.xltx");