使用剪贴板时出现Spreadsheetgear错误

时间:2011-11-17 16:39:11

标签: .net excel c#-2.0 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文件切换两行。

1 个答案:

答案 0 :(得分:2)

您可以使用IRange.Copy(...)方法代替WorkbookView.Cut / Paste。此方法在SpreadsheetGear内部执行复制例程,而不使用Windows剪贴板,因此可以避免任何问题,例如您在此处看到的问题。另外,您不需要所有Select方法调用来浏览工作表。

显而易见的问题是,这是一个 copy 例程,而不是 cut 例程,它们以各种方式表现不同:

  • 复制显然使源范围不受影响; cut从源范围中删除值和格式。您可以通过在调用IRange.Copy()之后通过IRange.Clear()清除源范围来解决此问题。
  • 更巧妙的是,如果您的源范围包含公式或命名范围,则在使用copy而不是cut时,这些公式中的引用以及命名范围可能会以不同的方式修复。关于这一点没什么可做的,因为这只是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();