通过Excel打开WinForm

我有一个操作Excel文件的WinForm。 现在它是一个.exe ,它有一个硬编码的文件加载或创build方法(仅用于testing)。 我需要能够通过Excel文件打开.exe文件,然后将该文件(可能作为发件人通过某个事件?)添加到窗体进行操作。

下面是一个如何将Excel文件加载到表单中的例子。

 public Excel.Application EXCEL_FILE; public frmMain() { InitializeComponent(); this.EXCEL_FILE = new Excel.Application(); this.EXCEL_FILE.SheetSelectionChange += new Excel.AppEvents_SheetSelectionChangeEventHandler(activeCellChanged); ExcelHandling.LoadExcelFile(); } public static void LoadExcelFile() { frmMain._frmMain.EXCEL_FILE.Workbooks.Open(@"F:\dsa.xlsx", 0, false, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); frmMain._frmMain.EXCEL_FILE.Visible = true; } 

总结我需要build立的工作stream程是:打开一些Excel文件 – >调用WinForm(通过加载项或其他东西?) – >加载调用WinForm的Excel文件。

您可以从Excel文件启动C#-Exe,并通过VBA传递excel文件的文件名,如下所示:

 Sub StartCSharpExe() Shell "<full path to your exe-file> " + ActiveWorkbook.FullName, 1 Application.Quit //optional to close Excel End Sub 

然后你可以读取你的C#程序中的excel文件的文件名作为命令参数,如下所示:

  private void GetCommands() { String[] arrCommands = Environment.GetCommandLineArgs(); foreach (String command in arrCommands) { MessageBox.Show(command); // just for debugging purpose / if you'd like to see all parameters // get the excel-file-name and open it... } } 

也许excel文件是只读的,因为它可能仍然是开放的,我没有testing它,
但这将是一条路。

我将在这里发布我的完整解决scheme,因为我认为这可能对人们有用。
您将使用以下代码作为user1567896build议调用Excel中的表单:

 Sub StartCSharpExe() Shell "<full path to your exe-file> " + ActiveWorkbook.FullName, 1 Application.Quit //optional to close Excel End Sub 

然后,将Excel文件保存为Excel加载项文件(.xla)。
之后(在Excel中),进入Developer Tab->Add-ins->[browse to your .xla file]->OK
然后,您可以通过以下方式将该加载项添加到Quick Access Toolbar
File->Options->Quick Access Toolbar->[Choose commands from:]Macros->YourAddin.xla

c#方法应该看起来像这样,并在表单初始化中调用:

 using Excel = Microsoft.Office.Interop.Excel; public static void LoadExcelFile() { Excel.Application EXCEL_FILE = new Excel.Application(); EXCEL_FILE = (Excel.Application)Marshal.GetActiveObject("Excel.Application"); } 

注:我已经testing了几个窗口打开, GetActiveObject("Excel.Application")总是返回通过Excel调用WinForm的那个。

希望这可以帮助。