Winform拖放到Excel中

我想从我的winform拖放到Excel中。 例如,在Winform中按住button(或DataGridView中的一行),然后将其拖放到Excel单元格中,将执行一些操作或将一些数据写入Excel单元格。

我正在谈论的是winform和Excel之间的拖放,而不是winform组件之间的拖放。

我记得曾经看过一个例子,但在Google上找不到。

更新:按照Avantol13的回答,

我们如何提取发送给Excel的对象? 在这个例子中,将string写入单元格是一种诡计,然后检查单元格的内容以执行进一步的操作。 也许类似于DragDrop事件,我们可以提取从e.Data.GetData(e.Data.GetFormats()[0])发送的数据

此外,使用Application_SheetChange知道这个drop事件会导致它循环为Application_SheetChange – >修改单元格的代码(如下例所示)(删除单元格并写入新的内容) – >再次触发Application_SheetChange等。

提前致谢。

Sean Sexton就如何将数据从WPF窗口拖放到Excel 提供了一个很好的例子 。 我已经修改了他的例子,以便它可以与WinForms一起使用。 尝试这个:

 private void control_MouseDown(object sender, MouseEventArgs e) { List<string> stringItems = new List<string>() { "Value1", "Value2", "Value3" }; //Separate all values with tabs string someValues = string.Join("\t", stringItems); DataObject data = new DataObject(DataFormats.Text, someValues); DoDragDrop(data, DragDropEffects.Copy); } 

根据Avantol13的build议,我想出了一个办法。

当Excel表单被修改时,挂钩Excel_Drop事件

 Application.SheetChange += new AppEvents_SheetChangeEventHandler(Excel_Drop); 

对于启动拖动的button:

 private void _Button1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { DragDropEffects dde1 = DoDragDrop("Action1", DragDropEffects.All); } } 

另一个button将发送“Action2”作为标志。

 private void Excel_Drop(object dropObj, Range target) { String dragData = Convert.ToString(target.Value2); if (dragData.Equals("Action1")) { Application.SheetChange -= Excel_Drop; DoAction1(); Application.SheetChange += Excel_Drop; return; } if (dragData.Equals("Action2")) { Application.SheetChange -= Excel_Drop; DoAction2(); Application.SheetChange += Excel_Drop; return; } } 

为了解决循环问题:下降事件触发Excel_drop – >其中调用DoActionx(),再次修改表 – >轮stream重新启动Excel_drop ,我阻止事件。

然而,基于这种使用文本标志的方法仍然有几个缺点:

  1. 在winform组件之间拖动时,我不能发送除文本之外的任何东西作为拖动对象。 因此,我需要让文本标志发送,删除它,并采取我的行动。 除了黑客之外,我无法validation“只有当单元格为空时才执行操作”,因为这个单元格无论如何都会覆盖掉我的单元格。 任何build议是受欢迎的。

  2. 我们如何能发送任何东西作为拖动对象?