怎样在Delphi程序中控制一些Excel的功能?300分!!!(300分)

  • 主题发起人 主题发起人 xiakaijun
  • 开始时间 开始时间
X

xiakaijun

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用Delphi实现OLE自动化来完全控制Excel,既Excel中能够完成的编辑
工作,用Delphi程序都可实现。下面有一些程序:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics,
comobj, Controls, Forms, Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
v:variant;
sheet:variant;
i:integer;
begin
//////////////create the Excel object and add a workbook named
/////////////////////////////'chinese'
v:=createoleobject('Excel.Application');
v.visible:=true;
v.workbooks.add(-4167);
v.workbooks[1].sheets[1].name:='chinese';
sheet:=v.workbooks[1].sheets['chinese'];
///////////in the chinese workbook , add some data
for i:=1 to 18 do
sheet.cells[i,1]:=i*2;
///////////////invalid some Menus and tools
for i:=2 to 8 do
V.MenuBars[xlworksheet].Menus.enabled:=false;
for i:=1 to 4 do
V.Toolbars.visible:=false;

end;

end.



   我在上面的程序中控制了一些Excel的功能,如菜单和工具栏的无效,我
有一些功能不会控制,请教诸位:

  (1)如何在单元格中实现自动换行,既Excel中的 ‘格式/单元格。。/对齐/文本控制 ’中选‘自动换行’复选框所实现的功能。

  (2)上面程序能无效Menusbar 中的Menu,如‘文件’‘编辑’等,但
我仅想无效‘文件’下的‘保存’项(MenuItem),how?

(3)how to invalid the shortcutMenus ?
  
 注: 我在类型库中查找所要的功能如:workbooks,Menubars,visible..
在Delphi中用‘open'打开office 下 MsExcel8.olb 文件既可查找。

如能回答不胜感激!!!(xiakaijun@263.net)
 
可否通过给excel发送WM_KEYDOWN, WM_SYSCOMMAND等模拟您在excel中按下了键使之执行相应
操作?
 
1. 我在Excel中录制了一段宏,如下,可以类推如何实现自动换行.
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = True '应该是这里了,其他几个是并列的选择项
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.MergeCells = False
End With
至于Selection是Excel中的对象,看一看帮助中的Microsoft Excel Visual
Basic 帮助;非常详细.

2. 3. 我再看看吧!呵呵,得分心急呀!
 
你查看一下Excel VBA的帮助文件, 那里面有全部Excel OLE对象的属性/方法的说明. 你在Excel中查看帮助目录, 里面有一项 " Microsoft Excel Visual Basic"
参考, 如果没有找到,说明你的Excel 97在安装时, 没有选此项进行安装, 此帮助文件默认是不安装的. 在用Office 97的setup ,添加一下. 你就可以查看VBA对象了.

'Excel.Application' 就相当于 Application对象 .

 
你的三个问题, 查看下列几个对象.
(1)
Range 对象
Style 对象

(2)
CommandBars 集合对象

CommandBar 对象, (菜单就是一种CommandBar对象)

CommandBars.findControl 方法

CommandBars.Controls属性

对于你的第2个问题, 下列命令便可搞定.
V.CommandBars[1].Controls[1].Controls[4].Enabled = False

你也可以在Help中用索引查询"菜单", 你会得到你想要的.

(3) 查询"快捷菜单" . 快捷菜单也是一种CommandBar对象.

 
建议采用导入TypeLibrary的方法.
在类型库中有各个对象,方法的详细信息,还有简短帮助
最重要的是可以在编译时检查语法错误以及使用Code Insight

而且,程序的表现会有所提高
如果你使用IDispatch接口,这一点可以得到更好体现,因为这时使用的是
VTable方式调用函数
 
Hello thank you for answering my question.
seakey had answered my second question succefully: (V.CommandBars[1].Controls[1].Controls[4].Enabled = False )
I want your answer just like seakey's answer about the second
question (as:'V.CommandBars[1].Controls[1].Controls[4].Enabled = False '
Excel_TLB 我用过,在实现如上功能上是一样的(暂时不谈其他优点) ,都要在Excel类型库中找有关 属性/方法 如:commandBars,controls,Application, Range.
我在程序中控制了大多Excel的功能,以上几点,还请。。。。。。。
 
Excel_TLB是没有多大作用的, (只是在代码书写时有帮助)
关键在于对Excel各个对象属性/方法的了解,
按我的建议, 你还是查看 Excel 中Visual Basic For Excel 的帮助吧.
了解对象结构才能正确使用.
对于你的第一个问题.
for i:=1 to 18 do
sheet.cells[i,1].WrapText = True ;
// ~~~~~~~~~~~~~~~~~ -- Range对象
你还是查一下Range对象吧. Range对象在Excel中有若干中表示的方法.

至于第三个问题, 还没有发现如何使用快捷菜单对象. :((
 
seasky:你好!
你又成功的回答了我的second question, thank you!!
你说的‘Excel 中Visual Basic For Excel 的帮助’我查找过。不过Excel 中Visual Basic For Excel (VBA)与 TypeLibrary中的属性/方法 不完全一致
for example:按VBA 我的问题:
‘(2)上面程序能无效Menusbar 中的Menu,如‘文件’‘编辑’等,但我仅想无效‘文件’下的‘保存’项(MenuItem),how?‘
应如如此answer: " V.menuBars(BatName).menus(menuName).menuItems(
ItemName).enabled:=false "
but it's not right.
所有的对象、属性、方法都要以 TypeLibrary中的为准。
因为数量太多,有些很难下手,故请诸位帮忙。


seasky :You had answered my two questions ,I will give you 200(分)at least.but I want to wait for while,just after I know the third question' answer ....
 
>V.menuBars(BatName).menus(menuName).menuItems(
ItemName).enabled:=false

你写menuBars(BatName) , 这样的话, delphi 会把它当作函数, 并
不会将它当作数组的下标访问。

应该这样子写
V.menuBars[BatName].menus[menuName].menuItems[
ItemName].enabled:=false

不过这样好像依然有问题, :((

 
本想有个圆满的结果,现在还有<3>问。。。。
算了,SeaSky gets 250 marks.
ninglliu,redcat,Another_eyes :请不要嫌少,大伙都分点,皆大欢喜!
 

Similar threads

S
回复
0
查看
906
SUNSTONE的Delphi笔记
S
S
回复
0
查看
884
SUNSTONE的Delphi笔记
S
后退
顶部