我在这方面遇到了可笑的困难,但我需要能够使用 Interop 连接到一个打开的 excel 文件,然后写入该文件。
文件由外部进程打开,然后此应用程序稍后进入以写入工作簿。我可以让它打开一个文件并写入事件工作簿。但我找不到连接到以前的工作簿并编写的方法。
我一直在使用 Marshal.GetActiveObject
,但我很快就会在打开多个文件的计算机上运行该应用程序,并且需要写入一个很可能不是事件文件的文件。
最佳答案
更新:
System.Runtime.InteropServices.Marshal.BindToMoniker
可用于访问在 Excel 中打开的文件,或者如果尚未打开则打开它:
var wb = Marshal.BindToMoniker(@"C:\x.xlsx") as Microsoft.Office.Interop.Excel.Workbook;
旧答案:
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/