Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Delphi Excel OLE函数与规范不一致?_Excel_Delphi_Ole_Delphi 2009 - Fatal编程技术网

为什么Delphi Excel OLE函数与规范不一致?

为什么Delphi Excel OLE函数与规范不一致?,excel,delphi,ole,delphi-2009,Excel,Delphi,Ole,Delphi 2009,我正试图通过编程方式将粘贴从一个Excel复制到另一个Excel,从Delphi代码、extded问题和源代码中都有 使用Excel应用程序中的两个连续操作,可以复制粘贴Excel应用程序中的列宽和数据和格式:1)粘贴特殊…-其他粘贴选项-列宽;2) 粘贴特殊…-其他粘贴选项-全部使用源主题 Excel规范和定义,这两个操作的相应代码为: xlPasteColumnWidths 8 Copied column width is pasted. xlPasteAllUsingSourc

我正试图通过编程方式将粘贴从一个Excel复制到另一个Excel,从Delphi代码、extded问题和源代码中都有

使用Excel应用程序中的两个连续操作,可以复制粘贴Excel应用程序中的列宽数据和格式:1)
粘贴特殊…-其他粘贴选项-列宽
;2)
粘贴特殊…-其他粘贴选项-全部使用源主题

Excel规范和定义,这两个操作的相应代码为:

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

CreateOleObject('Excel.Application')的两个单独调用;在Delphi中生成了代码,这就是为什么粘贴没有按预期以编程方式工作。对于同一个Excel.Application实例的单独工作簿调用I copy/paste,然后PastSpecial(代码为8和13)按预期工作。这就解决了问题。

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