【问题标题】:Why Delphi Excel OLE functions does not correspond to the specificiation?为什么 Delphi Excel OLE 功能不符合规范?
【发布时间】:2019-09-11 10:43:06
【问题描述】:

我正在尝试从 Delphi 代码以编程方式从一个 Excel 复制粘贴到另一个 Excel,扩展问题和源代码位于 Excel Copy-Paste from Delphi (OLE) with all the formatting?

可以使用 Excel 应用程序中的 2 个连续操作在 Excel 应用程序中复制粘贴列宽数据和格式,然后在 https://www.extendoffice.com/documents/excel/1867-excel-copy-column-width.html 之后:1) Paste Special... - Other Paste Options - Column Widths; 2)Paste Special... - Other Paste Options - All Using Source Theme.

Excel 规范 https://docs.microsoft.com/en-us/office/vba/api/excel.range.pastespecialhttps://docs.microsoft.com/en-us/office/vba/api/excel.xlpastetype 定义,这两个操作的相应代码是:

xlPasteColumnWidths     8   Copied column width is pasted.
xlPasteAllUsingSourceTheme  13  Everything will be pasted using the source theme.

所以,我的问题的解决方案应该是:

Sheet.Range['A1','CJ26'].PasteSpecial(8);
Sheet.Range['A1','CJ26'].PasteSpecial(13);

但这会产生非常奇怪的 excel - 不复制列宽,复制格式,但复制数据作为超链接。

Excel_TLB 表明常量确实是正确的:

type
  XlPasteType = TOleEnum;
const
  xlPasteAllUsingSourceTheme = $0000000D; //13
  xlPasteColumnWidths = $00000008; //8
  xlPasteValidation = $00000006;

所以,很明显,Delphi Excel OLE 不符合规范,即具有 Excel 规范或 Excel 库的东西已经坏了!怎么办?

我手动重复了这个复制粘贴序列并记录了 VB 宏 - 这个宏正是我要运行的 Delphi 代码:

Sub Macro1()
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
        , SkipBlanks:=False, Transpose:=False
    Range("E10").Select
    Application.CutCopyMode = False
End Sub

【问题讨论】:

  • 请注意,没有“Delphi Excel OLE”之类的东西。不像 Delphi 附带了一个用于操作 Excel 的庞大 Pascal 库——您直接与 Excel 自动化服务器对话(如果我没记错术语的话)。
  • 这里没有要求Delphi符合的规范,因为它只是通过Excel自己的自动化对象直接自动化Excel。 Delphi 对 Office 的 COM 支持只是对 MS 提供的基础 Office 对象的包装。它不会改变它们的功能。自己阅读源代码。如果常量定义正确(如您所指),并且它们直接通过 COM 传递给自动化对象(正如您在源代码中看到的那样),那么问题不在于 Delphi 不符合任何规范.哪里有 minimal reproducible example 来演示这个问题?
  • 在另一个问题中,您被要求尝试手动重复操作。如果您完全重复您的代码所做的事情,您将很快了解发生了什么。最重要的部分是代码正在启动 Excel 的第二个实例。
  • 不是,你粘贴的是同一个实例中记录的操作。您必须在 两个实例 中执行此操作 - 您会注意到没有选项可以随意粘贴。
  • 您必须从最重要的部分开始 - 启动两个单独的 Excel 实例 - 您可以轻松找到操作方法。从用户界面来看这并不简单,但这就是您的代码正在做的事情。

标签: excel delphi ole delphi-2009


【解决方案1】:

两次单独调用 CreateOleObject('Excel.Application');在 Delphi 代码中,这就是为什么粘贴没有按预期以编程方式工作的原因。我为 Excel.Application 的同一实例的单独工作簿调用了复制/粘贴,然后 PastSpecial(代码 8 和 13)按预期工作。这样就解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    相关资源
    最近更新 更多