通过Excel打开WinForm

时间:2014-02-26 11:20:47

标签: c# .net winforms excel vba

我有一个操纵Excel文件的WinForm。现在它是.exe,它具有硬编码文件加载或创建方法(仅用于测试)。我需要能够通过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;
}

总结我需要建立的工作流程是:打开一些Excel文件 - >调用WinForm(通过插件或其他东西?) - >将调用WinForm的Excel文件加载到其中。

2 个答案:

答案 0 :(得分:3)

您可以从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#-Program中读取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文件是只读的,因为它可能仍然是打开的,我还没有测试过,
但这将是最佳选择。

答案 1 :(得分:0)

我要在这里发布我的完整解决方案,因为我认为它可能对人们有用。
您将使用此代码在user1567896建议的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");
}

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

希望这会有所帮助。