3

在我的应用程序中,我使用电子表格工具来处理 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 文件中切换两行。

4

1 回答 1

2

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

明显的问题是这是一个复制例程而不是剪切例程,它们的行为在很多方面彼此不同:

  • 复制显然保持源范围不变;cut 从源范围中删除值和格式。您可以在调用 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();
于 2011-11-17T22:12:38.517 回答