有关Delphi控制Excel的问题。 (200分)

  • 主题发起人 主题发起人 puyd
  • 开始时间 开始时间
P

puyd

Unregistered / Unconfirmed
GUEST, unregistred user!
兄弟我最近在学习使用ExcelApplication控制EXCEL时发生如下问题,希望各位不吝赐教:
1、基本上所有的范例都这样启动Excel:
ExcelApplication.Connect;
ExcelApplication.Visible[0]:=True;
参照ExcelApplication的原码,发现Visible[]的参数是lcid(整型),表示当前启动
的EXCEL的ID号,但我发现如果程序启动之前已存在一个Excel的话,这个值就要取1,如果
之前有多个EXCEL进程,则LCID的取值更难确定。
请教:如何确定当前EXCEL的 lcid ?

2、Excel关闭以后,ExcelApplication必须释放此连接,释放方法一般为:
ExcelApplication.DisConnect;
ExcelApplication.Quit;
但问题是这段程序放在什么地方?开始我把他们放在ExcelApplication.OnDeactivate
事件里。这样的话,当Excel关闭时,里有活动的WorkBook的话就能激发此事件,但如果
关闭Excel前先关闭所有的WorkBook,或者干脆不建WorkBook直接关闭空的Excel,根本就
不会激发此事件,也不会释放连接。这样,当第二次连接时就会有问题。
请教:如何正确释放ExcelApplication的连接?

3、有什么办法控制Excel的菜单吗?比如屏蔽“Save”、“New”等菜单项?

4、寻求有关ExcelApplication等VCL控件的更深层次的范例和资料。(一般的范例实际
都不能正常使用,Excel的方法和属性列表我也都能找到,但这些VCL控件怎样才能正确
使用?希望能有更实际的范例)
 
兄弟们,帮个忙,我可以再加分
 
老兄,我前段时间作了一个有关Excel和Word的程序,后来控制Word方面比较多一些。以下是
我整理的有关控制Excel的原程序,希望能给你提供一些思路。
7、控制EXCEL
全面控制 Excel
首先创建 Excel 对象,使用ComObj:
var ExcelID: Variant;
ExcelID := CreateOleObject( 'Excel.Application' );
1) 显示当前窗口:
ExcelID.Visible := True;
2) 更改 Excel 标题栏:
ExcelID.Caption := '应用程序调用 Microsoft Excel';
3) 添加新工作簿:
ExcelID.WorkBooks.Add;
4) 打开已存在的工作簿:
ExcelID.WorkBooks.Open( 'C:/Excel/Demo.xls' );
5) 设置第2个工作表为活动工作表:
ExcelID.WorkSheets[2].Activate;

ExcelID.WorksSheets[ 'Sheet2' ].Activate;
6) 给单元格赋值:
ExcelID.Cells[1,4].Value := '第一行第四列';
7) 设置指定列的宽度(单位:字符个数),以第一列为例:
ExcelID.ActiveSheet.Columns[1].ColumnsWidth := 5;
8) 设置指定行的高度(单位:磅)(1磅=0.035厘米),以第二行为例:
ExcelID.ActiveSheet.Rows[2].RowHeight := 1/0.035; // 1厘米
9) 在第8行之前插入分页符:
ExcelID.WorkSheets[1].Rows[8].PageBreak := 1;
10) 在第8列之前删除分页符:
ExcelID.ActiveSheet.Columns[4].PageBreak := 0;
11) 指定边框线宽度:
ExcelID.ActiveSheet.Range[ 'B3:D4' ].Borders[2].Weight := 3;
1-左 2-右 3-顶 4-底 5-斜( / ) 6-斜( / )
12) 清除第一行第四列单元格公式:
ExcelID.ActiveSheet.Cells[1,4].ClearContents;
13) 设置第一行字体属性:
ExcelID.ActiveSheet.Rows[1].Font.Name := '隶书';
ExcelID.ActiveSheet.Rows[1].Font.Color := clBlue;
ExcelID.ActiveSheet.Rows[1].Font.Bold := True;
ExcelID.ActiveSheet.Rows[1].Font.UnderLine := True;
14) 进行页面设置:
a.页眉:
ExcelID.ActiveSheet.PageSetup.CenterHeader := '报表演示';
b.页脚:
ExcelID.ActiveSheet.PageSetup.CenterFooter := '第&P页';
c.页眉到顶端边距2cm:
ExcelID.ActiveSheet.PageSetup.HeaderMargin := 2/0.035;
d.页脚到底端边距3cm:
ExcelID.ActiveSheet.PageSetup.HeaderMargin := 3/0.035;
e.顶边距2cm:
ExcelID.ActiveSheet.PageSetup.TopMargin := 2/0.035;
f.底边距2cm:
ExcelID.ActiveSheet.PageSetup.BottomMargin := 2/0.035;
g.左边距2cm:
ExcelID.ActiveSheet.PageSetup.LeftMargin := 2/0.035;
h.右边距2cm:
ExcelID.ActiveSheet.PageSetup.RightMargin := 2/0.035;
i.页面水平居中:
ExcelID.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035;
j.页面垂直居中:
ExcelID.ActiveSheet.PageSetup.CenterVertically := 2/0.035;
k.打印单元格网线:
ExcelID.ActiveSheet.PageSetup.PrintGridLines := True;
15) 拷贝操作:
a.拷贝整个工作表:
ExcelID.ActiveSheet.Used.Range.Copy;
b.拷贝指定区域:
ExcelID.ActiveSheet.Range[ 'A1:E2' ].Copy;
c.从A1位置开始粘贴:
ExcelID.ActiveSheet.Range.[ 'A1' ].PasteSpecial;
d.从文件尾部开始粘贴:
ExcelID.ActiveSheet.Range.PasteSpecial;
16) 插入一行或一列:
a. ExcelID.ActiveSheet.Rows[2].Insert;
b. ExcelID.ActiveSheet.Columns[1].Insert;
17) 删除一行或一列:
a. ExcelID.ActiveSheet.Rows[2].Delete;
b. ExcelID.ActiveSheet.Columns[1].Delete;
18) 打印预览工作表:
ExcelID.ActiveSheet.PrintPreview;
19) 打印输出工作表:
ExcelID.ActiveSheet.PrintOut;
20) 工作表保存:
if not ExcelID.ActiveWorkBook.Saved then
ExcelID.ActiveSheet.PrintPreview;
21) 工作表另存为:
ExcelID.SaveAs( 'C:/Excel/Demo1.xls' );
22) 放弃存盘:
ExcelID.ActiveWorkBook.Saved := True;
23) 关闭工作簿:
ExcelID.WorkBooks.Close;
24) 退出 Excel:
ExcelID.Quit;

7、控制EXCEL
全面控制 Excel
首先创建 Excel 对象,使用ComObj:
var ExcelID: Variant;
ExcelID := CreateOleObject( 'Excel.Application' );
1) 显示当前窗口:
ExcelID.Visible := True;
2) 更改 Excel 标题栏:
ExcelID.Caption := '应用程序调用 Microsoft Excel';
3) 添加新工作簿:
ExcelID.WorkBooks.Add;
4) 打开已存在的工作簿:
ExcelID.WorkBooks.Open( 'C:/Excel/Demo.xls' );
5) 设置第2个工作表为活动工作表:
ExcelID.WorkSheets[2].Activate;

ExcelID.WorksSheets[ 'Sheet2' ].Activate;
6) 给单元格赋值:
ExcelID.Cells[1,4].Value := '第一行第四列';
7) 设置指定列的宽度(单位:字符个数),以第一列为例:
ExcelID.ActiveSheet.Columns[1].ColumnsWidth := 5;
8) 设置指定行的高度(单位:磅)(1磅=0.035厘米),以第二行为例:
ExcelID.ActiveSheet.Rows[2].RowHeight := 1/0.035; // 1厘米
9) 在第8行之前插入分页符:
ExcelID.WorkSheets[1].Rows[8].PageBreak := 1;
10) 在第8列之前删除分页符:
ExcelID.ActiveSheet.Columns[4].PageBreak := 0;
11) 指定边框线宽度:
ExcelID.ActiveSheet.Range[ 'B3:D4' ].Borders[2].Weight := 3;
1-左 2-右 3-顶 4-底 5-斜( / ) 6-斜( / )
12) 清除第一行第四列单元格公式:
ExcelID.ActiveSheet.Cells[1,4].ClearContents;
13) 设置第一行字体属性:
ExcelID.ActiveSheet.Rows[1].Font.Name := '隶书';
ExcelID.ActiveSheet.Rows[1].Font.Color := clBlue;
ExcelID.ActiveSheet.Rows[1].Font.Bold := True;
ExcelID.ActiveSheet.Rows[1].Font.UnderLine := True;
14) 进行页面设置:
a.页眉:
ExcelID.ActiveSheet.PageSetup.CenterHeader := '报表演示';
b.页脚:
ExcelID.ActiveSheet.PageSetup.CenterFooter := '第&P页';
c.页眉到顶端边距2cm:
ExcelID.ActiveSheet.PageSetup.HeaderMargin := 2/0.035;
d.页脚到底端边距3cm:
ExcelID.ActiveSheet.PageSetup.HeaderMargin := 3/0.035;
e.顶边距2cm:
ExcelID.ActiveSheet.PageSetup.TopMargin := 2/0.035;
f.底边距2cm:
ExcelID.ActiveSheet.PageSetup.BottomMargin := 2/0.035;
g.左边距2cm:
ExcelID.ActiveSheet.PageSetup.LeftMargin := 2/0.035;
h.右边距2cm:
ExcelID.ActiveSheet.PageSetup.RightMargin := 2/0.035;
i.页面水平居中:
ExcelID.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035;
j.页面垂直居中:
ExcelID.ActiveSheet.PageSetup.CenterVertically := 2/0.035;
k.打印单元格网线:
ExcelID.ActiveSheet.PageSetup.PrintGridLines := True;
15) 拷贝操作:
a.拷贝整个工作表:
ExcelID.ActiveSheet.Used.Range.Copy;
b.拷贝指定区域:
ExcelID.ActiveSheet.Range[ 'A1:E2' ].Copy;
c.从A1位置开始粘贴:
ExcelID.ActiveSheet.Range.[ 'A1' ].PasteSpecial;
d.从文件尾部开始粘贴:
ExcelID.ActiveSheet.Range.PasteSpecial;
16) 插入一行或一列:
a. ExcelID.ActiveSheet.Rows[2].Insert;
b. ExcelID.ActiveSheet.Columns[1].Insert;
17) 删除一行或一列:
a. ExcelID.ActiveSheet.Rows[2].Delete;
b. ExcelID.ActiveSheet.Columns[1].Delete;
18) 打印预览工作表:
ExcelID.ActiveSheet.PrintPreview;
19) 打印输出工作表:
ExcelID.ActiveSheet.PrintOut;
20) 工作表保存:
if not ExcelID.ActiveWorkBook.Saved then
ExcelID.ActiveSheet.PrintPreview;
21) 工作表另存为:
ExcelID.SaveAs( 'C:/Excel/Demo1.xls' );
22) 放弃存盘:
ExcelID.ActiveWorkBook.Saved := True;
23) 关闭工作簿:
ExcelID.WorkBooks.Close;
24) 退出 Excel:
ExcelID.Quit;
 
那段说明我都有,可解决不了我的问题。[:(]
 
2、Excel关闭以后,ExcelApplication必须释放此连接,释放方法一般为:
ExcelApplication.DisConnect;
ExcelApplication.Quit;
但问题是这段程序放在什么地方?开始我把他们放在ExcelApplication.OnDeactivate
事件里。这样的话,当Excel关闭时,里有活动的WorkBook的话就能激发此事件,但如果
关闭Excel前先关闭所有的WorkBook,或者干脆不建WorkBook直接关闭空的Excel,根本就
不会激发此事件,也不会释放连接。这样,当第二次连接时就会有问题。
请教:如何正确释放ExcelApplication的连接?

如果设打开的Excel是可见的,在打开Excel后就应该执行disconnet,打开的Excel由用户来关闭啊。
如果打开的Excel是不可见的,则在对Excel操作完毕后执行disconnect。
另外,可以看看Excel有关编程方面的帮助,或其他DFW的帖子。再试试吧,应该没有什么问题。


 
老兄,Disconnect执行的时候如果Excel在运行就会关闭Excel。
另外,Excel运行是非模态的,如果一运行就DisConnect,就等于直接关闭了。
同样的道理,ExcelApplication.Connect执行后打开了Excel就继续往下走了
我就是想找到有什么方法知道Excel被关闭了,帮我再试试吧。
 
你这个问题确实很有深度!
不错,确实,Delphi导入Excel或者说Office系列后做了许多其他的工作。
有些也许是为了方便,但是很多真的无端的增加了很多麻烦。
1、输入参数,必须全部输入,这在VBA里面本来有很多都是可以省略的。
2、输入的参数,很多编程了var类型的,本来是一个常量,而这里必须定义一个变量与之对应
真的比较麻烦。
对于你的问题,第一个,我没有实验出来,我传入任何数值都可以正常启动Excel。
弄的我不知道哪一个是对的。
另外,一般情况下,Execl在系统中只存在一个,就是说如果系统已经启动了一个Excel,那么使用
connect的时候,它会自动连接这个Excel,并不是打开新的Excel,从这点上来说使用0是对的。
2、你的问题是如何在关闭Excel的时候得到通知,这个很难,具体可参考
http://www.delphibbs.com/delphibbs/dispq.asp?lid=737517
DragonPC_???,给出了比较好建议。
3、这个问题基本可以,你不妨首先生成相应的VBA代码,然后再转换成Delphi代码。只是时间问题
4、这种资料目前比较少,其实说白了,也没有什么太深奥的。很多都是需要自己仔细摸索的。
 
谢谢两位。我想了个另类的方法,不知是否可行:
可否先连结Excel但不设Visible为True,然后在后台生成Excel文档,接着关闭Excel,再
用shell的方式open那个文档。但这样位处理一个文档就要两次打开Excel,是不是......
[?]
 
如果我已经打开了别的 Excel文件呢?
你就会将人家给Close掉的。
 
ExcelApplication有一个属性,一般设RunningOrNew,即每次都重新打开一个Excel进程,
和已有的Excel无关,但它的ID就不一定是0了,而且如果不由ExcelApplication.DisConnect
和ExcelApplication.Quit关闭的话它会一直在进程中.
 
如果你程序打开了一个Excel,我再手工打开一个Excel文件,那么我用的是你打开的Excel,你怎么办?
 
很麻烦,所以要屏蔽某些菜单和功能。否则只能这样凑合一下,当我的程序创建的Book失去
焦点,就关闭Excel.
不过,如果是用Shell方式打开的Excel,程序就不管了,就当作另外一个任务了。
 
多人接受答案了。
 
后退
顶部