当使用剪贴板时,Spreadsheetgear错误

在我的应用程序中,我使用spreadsheetgear来处理Excel文件。 我使用下面的代码:

//move incorrect to aux incorrectLine.Select(); //select the line to be moved wbkView.Cut(); auxLine.Select(); wbkView.Paste(); //move correct to incorrect correctLine.Select(); //select the line to be moved wbkView.Cut(); incorrectLine.Select(); wbkView.Paste(); //move aux to correct auxLine.Select(); //select the line to be moved wbkView.Cut(); correctLine.Select(); wbkView.Paste(); 

我不时收到以下错误:

 Requested Clipboard operation did not succeed. 

与StrackTrace:

 at System.Windows.Forms.Clipboard.ThrowIfFailed(Int32 hr) 

ErrorCode = -2147221040

据我所知,如果剪贴板被其他进程使用,是有问题的,所以我想知道是否存在另一种模式,从Excel文件切换两行而不使用剪贴板。

您可能能够使用IRange.Copy(…)方法而不是WorkbookView.Cut / Paste。 此方法在SpreadsheetGear内部执行复制例程,而不使用Windows剪贴板,因此可避免出现像在此处看到的问题。 另外,您不需要所有这些Select方法调用来浏览工作表。

显而易见的问题是这是一个复制例程,而不是一个剪切例程,它们在各种方式上performance出不同的行为:

  • 复制明显地保持源范围不变; 剪切删除源范围的值和格式。 你可以通过在调用IRange.Copy()之后通过IRange.Clear()清除源范围来解决这个问题。
  • 更为巧妙的是,如果源范围包含公式或命名范围,则在使用复制而不是剪切时,这些公式和命名范围内的引用可能会以不同的方式修复。 由于这只是Excel的工作方式,SpreadsheetGear遵循Excel在这些事情上的领先地位,所以没什么可以做的。 当然,如果你的源范围只是简单的值而没有命名的范围,这不是一个问题。

把它放在一起,你的代码可能如下所示:

 // move incorrect to aux incorrectLine.Copy(auxLine); incorrectLine.Clear(); // move correct to incorrect correctLine.Copy(incorrectLine); correctLine.Clear(); // move aux to correct auxLine.Copy(correctLine); auxLine.Clear();