为什么Delphi Excel OLE函数与规范不一致?
我正试图通过编程方式将粘贴从一个Excel复制到另一个Excel,从Delphi代码、extded问题和源代码中都有 使用Excel应用程序中的两个连续操作,可以复制粘贴Excel应用程序中的列宽和数据和格式:1)为什么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
粘贴特殊…-其他粘贴选项-列宽
;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实例开始—您可以轻松找到如何执行此操作。从用户界面来看,这并不简单,但这正是您的代码所做的。