请帮忙看看这段代码(很短的),关于设置Excel的列宽问题,在各位朋友的帮助下,问题已经解决。 ( 积分: 50 )

  • 主题发起人 主题发起人 thlt
  • 开始时间 开始时间
to sid033 朋友:

Variants.pas 我到哪里去找?
 
to sgs125 朋友:

你那里两种方法都通过了?是不是我用的D5而你用的D6或D7?或者我D5少装了什么东西?
这下我彻底彻底晕了!!!
 
我的是d7呵呵
 
呵呵,我用的是D6所以没问题。你用D5应该不需要Uses variants吧?我试试D5
 
以下程序在D5下测试通过,而且可以更改列宽
//uses comobj;
var
excel,book,sheet:Variant;
begin
excel:=createoleobject('Excel.Application');
excel.visible:=true;
book:=excel.workbooks.open('d:/监控摄像机表.xls');
sheet:=excel.activesheet;
sheet.columns[1].columnwidth:=200;
end;
 
to Sid033:
你機器上那麽多版本的Delphi?
我用的是D7
 
当然,以前我机器上D2,D3,D4都有。现在是D5,D6都有。
我也不想啊,不过没办法,要生存啊。嘻嘻。项目需要用D5就用D5,
需要D6就用D6,要用VB就VB,PB就PB。。呵呵 。
 
to sid033 朋友:
编译是通过了,可是运行时提示错误,拒绝执行:
Exception EClassNotFound in module PROLECT1.EXE at 0000CA22.
Class TExcelApplicatn not found.

我装了Excel的3个控件也不行。
问题到底出在哪里呢?
 
book:=excel.workbooks.open('d:/监控摄像机表.xls');
你1的路徑對了沒有?
實在不行就用OpenDialog吧
 
to sid033 朋友:

受到你们的启发,我在最先的那段代码中加了一句:
var
ExcelWorkSheet1:Variant;

这次编译通过了,但是运行程序时出现警告对话框:
Method 'ColumnsWidth' not supported by automation object.
(意思好象是:“方式'ColumnsWidth'不支持自动控制对象”,不知道翻译的对不对?)

结果没有导出任何数据到Excel中。

天哪?到底怎么回事啊?我现在就装D7试试看。

顺便问一下,
var ExcelWorkSheet1:Variant;
到底定义ExcelWorkSheet1是一种什么类型的变量啊?我怎么从来没有见过?哪里有这方面的资料?
 
to xiaolinj79 朋友:

路径的问题我肯定会注意了,不是这方面的问题,谢谢提醒!
 
采用XF的方法对

Columns("A:A").Select //并不是不能设置某一列的宽度,而是要先选中此列
Selection.ColumnWidth = 20 //选中整列之后,设置宽度

我在D7中试过.给你一个源码,EMAIL?
 
procedure TForm1.Button3Click(Sender: TObject);
var
ExcelApp: Variant;
i:integer;
begin
ExcelApp := CreateOleObject( 'Excel.Application' );
ExcelApp.Visible := True;
ExcelApp.Caption := '测试控制Excel';
ExcelApp.WorkBooks.Add;
// 下面这行是选择当前工作簿
// ExcelApp.Sheets['Sheet1'].Select;

for i:=1 to 10 do
ExcelApp.Cells[i,1].Value:='第'+IntToStr(i)+'行';

ExcelApp.Columns[1].ColumnWidth := 19.75;

end;
 
试试看这个:
MyExcelWorkSheet.Cells.Item[2,1].columnwidth:=20; //设置列框为20
我在d7里面试过是可以用的,注意前面use窗体里面要手动输入excel97和comctrls好像。
 
to 搂猪:是columnwidth不是columnswidth呀
 
建议你采用一种方式,不要用两种方式混合着用。这样会把你搞混的。
要么全部用Delphi导入的Excel的东东,要么全部用Variant来自己生成。
看上面你说的话就说明你已经搞不清了。
留个MSN:strongwillling@hotmail.com
有兴趣就和我交流一下
 
to all:

刚装了D7,还是没用啊,编译时又提示另外一个pas文件中下面这样的语句错误:
CopyFile(pchar('./语文.db'),pchar('./allkm.db'),False);

提示的信息是: Unsafe type 'PChar' (不安全的类型?)
系统拒绝编译。

更晕。。。

问题没有最终解决,期待中。。。。。。
 
to caelsw 朋友:

你那段代码在D5下也有效,但是它是重新打开一个Excel,而我那段代码已经打开了一个Excel,所以你那段代码直接控制不了我那个已经打开的工作表。不知道有没有哪位朋友能想出一个办法来。我用了 // ExcelApp.Sheets['Sheet1'].Select; 也无效。

有幸的是,我通过修改我那段代码的方法让它去适应你那段代码,数据导出了,Excel的列宽也能控制了,不过我可就惨了点,因为当初那段程序是别人给我的,我整个程序中许多地方要导出Excel表所以有N个地方都用了前面我那段代码,没办法,只好推倒重来了。

唉,有没有更简单的法子呢?请发我Email: ahthc@163.com

我把标题修改一下就散分吧,谢谢各位了!
 
晕了,程序中那么多地方有相同的代码?
重构吧
 
刚刚自己找到完美解决方案,不需要推倒重来了。(其实还是 xf-wangyi 的 Cells 办法)
都是给那个该死的字母s搞的,差点晕死我!

其实 sid033 在下面的帖子中已经提醒我了,只是我没有看出来,以为它是提醒别人的。
(来自:sid033, 时间:2005-2-16 16:28:04, ID:2990607
to 搂猪:是columnwidth不是columnswidth呀 )

谁知道“搂猪”就是指“楼主”我呀!

columnswidth 里多出的那个s是我在DFW其它地方找帖子时“复制”产生的,不知道被哪个家伙害惨了!这里的 XiaoLing79 朋友也犯了我同样的错误,害人不浅!

我反复看了各位的帖子,总结为控制Excel的方法不外乎两种:
方法一: 用 ExcelWookSheet的 Cells.Item[i,j] 属性控制;
方法二: 用 createoleobject('Excel.Application') 的 Variant 属性控制;
(不知道这么说法对不对,我只知道怎么用,具体原理我不清楚)

(来自:xf-wangyi, 时间:2005-2-16 1:28:57, ID:2990034)
现在去掉那个该死的s再试,xf-wangyi朋友上面的那个帖子已经完满解决了我的问题,
只需要把
Fexcelworksheet.Cells.Item[1, 1].ColumnWidth := 20; //列宽
这句中的 Fexcelworksheet 换成我程序中相应的 ExcelWorksheet1 就 OK 了!

用方法一的有两位朋友:xf-wangyi 和 wildrose_sorhero ;
用方法二有三位朋友:XiaoLing79,sid033 和 caelsw ;

感谢sgs125朋友帮我调试,他的成功坚定了我解决这个问题的信心。
还要感谢另外几个朋友—> 刘麻子,fphuang 和 jianguobu 帮我顶这个帖子。

遗憾的是,我迟迟还没有结帖的原因是我仍在调试 XF.Lian 朋友介绍的那个用VBA代码解决的办法(可惜到目前为止没有成功,不知道是这位朋友说的太简单了还是我太菜了?):
(来自:XF.Lian, 时间:2005-2-15 23:08:42, ID:2989989
Columns("A:A").Select //并不是不能设置某一列的宽度,而是要先选中此列
Selection.ColumnWidth = 20 //选中整列之后,设置宽度 )
而 caelsw 朋友也说采用XF的方法对,且在D7中试过.愿意给我一个源码。EMAIL?
可是我没有收到caelsw 朋友的 Email。

在Excel中,我会用宏,知道VBA代码,可是不知道往Delphi里帖时要怎么修改一下,不会是直接帖吧,那样编译通不过或者不生效啊!哪位高手能指点一下吗?

不管怎样,遗憾有一点,但是问题总算圆满解决了,再次感谢各位的回帖,可惜分太少了,我都不好意思分了。
 
后退
顶部