用delphi操作Excel,如何复制单元格区域? ( 积分: 100 )

  • 主题发起人 主题发起人 zjwyyh
  • 开始时间 开始时间
Z

zjwyyh

Unregistered / Unconfirmed
GUEST, unregistred user!
请问:
如果使用动态创建ole对象的方法来复制,很简单。如下的代码就完成了。
ExcelApp := CreateOleObject( 'Excel.Application' );
ExcelApp.WorkBooks.Open( 'c:/head.xls' );
ExcelApp.WorkSheets[2].Range[ 'A1:P2' ].Copy;
ExcelApp.WorkSheets[11].Range[ 'A1' ].PasteSpecial;
if not ExcelApp.ActiveWorkBook.Saved then
ExcelApp.ActiveWorkBook.save;
ExcelApp.quit;

但是,使用delphi6自带的server组件中的ExcelApplication控件,如何实现在一个Excel文件中把一张工作表中的一部分区域复制到另一张工作表中?
 
请问:
如果使用动态创建ole对象的方法来复制,很简单。如下的代码就完成了。
ExcelApp := CreateOleObject( 'Excel.Application' );
ExcelApp.WorkBooks.Open( 'c:/head.xls' );
ExcelApp.WorkSheets[2].Range[ 'A1:P2' ].Copy;
ExcelApp.WorkSheets[11].Range[ 'A1' ].PasteSpecial;
if not ExcelApp.ActiveWorkBook.Saved then
ExcelApp.ActiveWorkBook.save;
ExcelApp.quit;

但是,使用delphi6自带的server组件中的ExcelApplication控件,如何实现在一个Excel文件中把一张工作表中的一部分区域复制到另一张工作表中?
 
结合TExeclWorkSheet和TExeclWorkBook控件

从Ole的代码里面也可以看出来
 
不行啊。我试过,但不知道该怎么传参数。总是报错。
能不能给出代码呀?
谢谢!
 
咋没人回答呀????
 
楼主你把你的代码贴出来,要不大家不知道哪里错了,
 
没法贴,我现在都不知道,该用什么函数。请任意写一段代码只要使用delphi自带的server组件实现sheet间区域复制就可以了。
谢谢!
 
ExcelApp := CreateOleObject( 'Excel.Application' );
这个是TExeclApplication

ExcelApp.WorkBooks.Open( 'c:/head.xls' );
这个是TExeclWorkBook

ExcelApp.WorkSheets[2].Range[ 'A1:P2' ].Copy;
ExcelApp.WorkSheets[11].Range[ 'A1' ].PasteSpecial;
这个是TExeclWorkSheet


if not ExcelApp.ActiveWorkBook.Saved then
ExcelApp.ActiveWorkBook.save;
ExcelApp.quit;

然后
ExcelApplication1.Worksheets;
ExcelWorkbook1.Worksheets;
就是对应的集合了
另外可以去Delphi的Ocx目录下面的Servers看你delphi这几个控件的代码,看看和上面的有什么区别
 
用Range的Copy方法就行。
不过Range的Copy方法执行效率不高,而且要占用操作系统的剪贴板资源(当你的程序在执行时,Ctrl-v和Ctrl-c等操作可能产生混乱),更要命的是它不能多线程并发执行,当多个客户端请求生成报表时就要排队等待了。我就是被这些问题困扰了很久,最后被迫转到FastReport去了。
 
关键是如果使用动态创建的方法,copy和past方法不需要传递任何参数。而当使用delphi自带的server组件中的 ExcelWorkSheet时,copy和past要带很多参数。而这些参数不知道该写什么。
//取当前活动工作表的前一天,将表头复制过来
ExcelWorksheet2.ConnectTo(ExcelApplication1.Worksheets['sheet1'] as _Worksheet);
//拷贝指定区域:
ExcelWorksheet2.Range['A1','P2'].copy(????);//填什么?
//从A1位置开始粘贴:
ExcelWorksheet1.Range.PasteSpecial(????);//填什么?
 
ExcelWorksheet2.Range['A1','P2'].copy(????);//填什么?
可以是空的,填写EmptyParam就可以了

//从A1位置开始粘贴:
ExcelWorksheet1.Range.PasteSpecial(????);//填什么?

expression.PasteSpecial(Paste, Operation, SkipBlanks, Transpose)

expression 必需。该表达式返回一个 Range 对象。

Paste XlPasteType 类型,可选。指定要粘贴的区域部分。

XlPasteType 可为以下 XlPasteType 常量之一。
xlPasteAll 默认值
xlPasteAllExceptBorders
xlPasteColumnWidths
xlPasteComments
xlPasteFormats
xlPasteFormulas
xlPasteFormulasAndNumberFormats
xlPasteValidation
xlPasteValues
xlPasteValuesAndNumberFormats

Operation XlPasteSpecialOperation 类型,可选。指定粘贴操作。

XlPasteSpecialOperation 可为以下 XlPasteSpecialOperation 常量之一。
xlPasteSpecialOperationAdd
xlPasteSpecialOperationDivide
xlPasteSpecialOperationMultiply
xlPasteSpecialOperationNone 默认值
xlPasteSpecialOperationSubtract

SkipBlanks Variant 类型,可选。若为 True,则不将剪贴板上区域中的空白单元格粘贴到目标区域中。默认值为 False。

Transpose Variant 类型,可选。若为 True,则粘贴区域时转置行和列。默认值为 False。

所有可选的操作都可以用EmptyParam代替,详细资料参考Execl的帮助
 
先谢谢老兄了,请看如下的过程
procedure Tmainform.copy_head;//将昨天的表头复制过来。
var
lastday:integer;
begin
ExcelWorksheet1.ConnectTo(ExcelApplication1.ActiveSheet as _Worksheet); //目的sheet
//取当前活动工作表的前一天,将表头复制过来
lastday:=strtoint(ExcelWorksheet1.Name)-1;
ExcelWorksheet2.ConnectTo(ExcelApplication1.Worksheets[lastday] as _Worksheet);
//拷贝指定区域:
ExcelWorksheet2.Range['A1','P2'].copy(EmptyParam);
//从A1位置开始粘贴:
ExcelWorksheet1.Range['A1','A1'].PasteSpecial(xlPasteAll,EmptyParam,EmptyParam,EmptyParam);//这样不行,报错。
//后来,我是用下面的方法解决的。
//ExcelWorksheet1.Range['A1','A1'].Select;
//ExcelWorksheet1.PasteSpecial;
end;

问题是解决了。但为什么用ExcelWorksheet1.Range['A1','A1'].PasteSpecial(xlPasteAll,EmptyParam,EmptyParam,EmptyParam);这样的语句不行呢?
谢谢!!!
 
呵呵,你也不说为什么不行,xlPasteAll是系统常量,需要引用Execl2000单元

const
xlPasteAll = $FFFFEFF8;
 
不行。跟不赋值xlPsteAll变量时报错一样:“Could not convert variant of type(Error) into type(integer)”
另外,我想既然是系统变量,当然默认应该已赋了值。
烦请老兄再测试一下。谢谢!
 
ExcelWorksheet1.Range['A1','A1'].PasteSpecial(EmptyParam,EmptyParam,EmptyParam,EmptyParam);//这样不行,报错。

这样呢,没看明白为什么错,好像也没哪里做了转换了
 
后退
顶部