C# 使用 Interop 写入打开的 Excel 文件

标签 c# excel interop office-interop

我在这方面遇到了可笑的困难,但我需要能够使用 Interop 连接到一个打开的 excel 文件,然后写入该文件。

文件由外部进程打开,然后此应用程序稍后进入以写入工作簿。我可以让它打开一个文件并写入事件工作簿。但我找不到连接到以前的工作簿并编写的方法。

我一直在使用 Marshal.GetActiveObject,但我很快就会在打开多个文件的计算机上运行该应用程序,并且需要写入一个很可能不是事件文件的文件。

最佳答案

更新:

System.Runtime.InteropServices.Marshal.BindToMoniker可用于访问在 Excel 中打开的文件,或者如果尚未打开则打开它:

var wb = Marshal.BindToMoniker(@"C:\x.xlsx") as Microsoft.Office.Interop.Excel.Workbook; 

https://blogs.msdn.microsoft.com/eric_carter/2009/03/12/attaching-to-an-already-running-office-application-from-your-application-using-getactiveobject-or-bindtomoniker/


旧答案:

GetObject可以引用Microsoft.VisualBasic使用(如果需要它也可以打开文件):

object o = Microsoft.VisualBasic.Interaction.GetObject(@"C:\x.xlsx", "Excel.Application");
var wb = o as Microsoft.Office.Interop.Excel.Workbook; 
if (wb != null) 
{ 
    Microsoft.Office.Interop.Excel.Application xlApp = wb.Application;
    // your code 
}

通过检查 GetObject 源代码可能可以避免对 Microsoft.VisualBasic 的引用 https://github.com/Microsoft/referencesource/blob/master/Microsoft.VisualBasic/runtime/msvbalib/Interaction.vb#L1039

关于C# 使用 Interop 写入打开的 Excel 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42281119/

相关文章:

c# - 你能解释一下这个 Math.Log10 与 BigInteger.Log10 的行为吗?

c# - 类型 'iTextSharp.text.Document' 的值无法转换为 'System.IO.Stream'

c# 类型来处理相对和绝对 URI 和本地文件路径

vba - 循环遍历行并分离出每一行 "visit"

vba - UserForm.Top 值从已分配更改

windows-services - Powerpoint Interop 在 Windows 服务中失败,但在 Windows 窗体应用程序中工作正常

c# - 获取应用于通过 COM 接口(interface)公开的 C# 属性的帮助字符串属性

c# - 菜鸟C#问题

vba - 根据单元格值隐藏多行

c# - 如何将 C# 委托(delegate)函数传递给托管 C++ .Dll?