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

  • 主题发起人 主题发起人 thlt
  • 开始时间 开始时间
T

thlt

Unregistered / Unconfirmed
GUEST, unregistred user!
//请帮忙看看这段代码(很短的),关于设置Excel的列宽问题
//有结果请发Email给我,或直接贴在这里,谢谢! ahthc@163.com

我记得这段代码好象是“迷糊”朋友给我的,但是最近没有与他联系上。

//下面一段代码可以将查询的结果导入Excel,但是无论如何用程序的方式改变不了Excel的列宽(例如我要将第一行第一列的宽度设置为4),我在DFW上查了很多类似的代码都无效,请帮忙看看,谢谢。

procedure Tzhtj.Button1Click(Sender: TObject);
var
i,j,row,column:integer;

begin

Try
ExcelApplication1.Connect;
Except
MessageDlg('Excel 没有安装',mtError, [mbOk], 0);
Abort;
End;
ExcelApplication1.Visible[0]:=true;
ExcelApplication1.Caption:='Excel Not Istalled!';
ExcelApplication1.Workbooks.Add(Null,0);
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _Worksheet);

//ExcelWorksheet1.Columns[1].ColumnWidth:=4 ; //这样写无效,编译不通过
//编译时提示: Class does not have a default property
//( 种类没有一个默认的性质? 是这个意思吗?)

//ExcelApplication1.ExcelWorkbook1.ExcelWorksheet1.Columns[1].ColumnWidth:=4 ; //这样写也无效,编译不通过
//ActiveSheet.Column[1].ColumnsWidth := 5; //这样还是写无效,到底要怎么写呢?

query2.Open;
row:=1;
column:=1;
for j:= 0 to query2.FieldCount-1 do
begin
ExcelWorksheet1.Cells.Item[row,column]:=query2.fields[j].FieldName;
column:=column+1;
end;
row:=2;
While Not(query2.Eof) do
begin
column:=1;
for i:=1 to query2.FieldCount do
begin
ExcelWorksheet1.Cells.Item[row,column]:=query2.fields[i-1].AsString;
column:=column+1;
// ExcelWorksheet1.Cells.item[2,1].Value := '111'; //这样写有效,但是只能改变某一单元格的值,不能改变列宽
// ExcelWorksheet1.Cells[2,1].Value := '111'; //但是这样写无效,这是我在DFW上找的代码
end;
query2.Next;
row:=row+1;
end;
query2.first;

ExcelWorkbook1.Disconnect;
ExcelWorksheet1.Disconnect;
ExcelApplication1.DisConnect;

end;

 
//请帮忙看看这段代码(很短的),关于设置Excel的列宽问题
//有结果请发Email给我,或直接贴在这里,谢谢! ahthc@163.com

我记得这段代码好象是“迷糊”朋友给我的,但是最近没有与他联系上。

//下面一段代码可以将查询的结果导入Excel,但是无论如何用程序的方式改变不了Excel的列宽(例如我要将第一行第一列的宽度设置为4),我在DFW上查了很多类似的代码都无效,请帮忙看看,谢谢。

procedure Tzhtj.Button1Click(Sender: TObject);
var
i,j,row,column:integer;

begin

Try
ExcelApplication1.Connect;
Except
MessageDlg('Excel 没有安装',mtError, [mbOk], 0);
Abort;
End;
ExcelApplication1.Visible[0]:=true;
ExcelApplication1.Caption:='Excel Not Istalled!';
ExcelApplication1.Workbooks.Add(Null,0);
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _Worksheet);

//ExcelWorksheet1.Columns[1].ColumnWidth:=4 ; //这样写无效,编译不通过
//编译时提示: Class does not have a default property
//( 种类没有一个默认的性质? 是这个意思吗?)

//ExcelApplication1.ExcelWorkbook1.ExcelWorksheet1.Columns[1].ColumnWidth:=4 ; //这样写也无效,编译不通过
//ActiveSheet.Column[1].ColumnsWidth := 5; //这样还是写无效,到底要怎么写呢?

query2.Open;
row:=1;
column:=1;
for j:= 0 to query2.FieldCount-1 do
begin
ExcelWorksheet1.Cells.Item[row,column]:=query2.fields[j].FieldName;
column:=column+1;
end;
row:=2;
While Not(query2.Eof) do
begin
column:=1;
for i:=1 to query2.FieldCount do
begin
ExcelWorksheet1.Cells.Item[row,column]:=query2.fields[i-1].AsString;
column:=column+1;
// ExcelWorksheet1.Cells.item[2,1].Value := '111'; //这样写有效,但是只能改变某一单元格的值,不能改变列宽
// ExcelWorksheet1.Cells[2,1].Value := '111'; //但是这样写无效,这是我在DFW上找的代码
end;
query2.Next;
row:=row+1;
end;
query2.first;

ExcelWorkbook1.Disconnect;
ExcelWorksheet1.Disconnect;
ExcelApplication1.DisConnect;

end;

 
这个问题真的不懂, 期待其他富翁解答。:-)
 
Columns("A:A").Select //并不是不能设置某一列的宽度,而是要先选中此列
Selection.ColumnWidth = 20 //选中整列之后,设置宽度

^_^ VBA的语法,不是DElphi的 !
 
to XF.Lian:

谢谢你的回复!
你说的我还是不大明白,你能不能在我上面那段代码中插入一段可以改变一个指定列(例如第1列)的列宽的代码?
 
帮你提前吧,不是太会
 
我也不懂。
 
问题没有解决,期待中。。。
 
好像以前设置过单元格的字体,数字格式,居中什么的
我来找找看如何设置列宽
 
Fexcelworksheet.Cells.Item[1, 1].Borders.LineStyle :=
xlContinuous; ///边框
Fexcelworksheet.Cells.Item[1, 1].Font.Name := '宋体'; ///字体
Fexcelworksheet.Cells.Item[1, 1].Font.Size := 9;
Fexcelworksheet.Cells.Item[1, 1].ColumnWidth := 20; //列宽


代码没试过
 
to xf-wangyi:
下列代码
ExcelWorksheet1.Cells.item[1,1].ColumnsWidth := 5; //编译能通过
编译通过,但是在运行程序时出现警告对话框:
Method 'ColumnsWidth' not supported by automation object.
(意思好象是:“方式'ColumnsWidth'不支持自动控制对象”,不知道翻译的对不对?)

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

但是下列代码编译通过运行也有效:
ExcelWorksheet1.Cells.item[1,1].Font.Size := 18; //设置字号

我估计是可以设置一个指定单元格的字号,但是不能设置一个指定单元格的列宽,要么就设置整列的列宽,但是用什么语句设置呢?
 
怎么只有看的没有回帖的,郁闷。。。。。。
是分少了?还是太难了?还是我太菜了?
我会用Excel的宏,知道VBA代码,可是帖到Delphi里不是编译通不过就是不生效啊!
 
例子:
unit Unit1;

interface

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

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
MyExcel, MyWorkbook:Variant;
begin
MyExcel := CreateOleObject('Excel.Application');
MyExcel.Visible := true;
MyWorkbook := MyExcel.Workbooks.Open('e:/book1.xls');
MyExcel.ActiveSheet.Columns[1].ColumnsWidth := 5;
MyExcel.ActiveCell.FormulaR1C1 := 'sssssss';
end;

end.
 
ExcelApplication1.ActiveCell.ColumnWidth := 20;
用这个样是可以的columns的声明好像是只读的,具体你可以看看原代码
 
to xiaolinj79 朋友:

MyExcel.ActiveSheet.Columns[1].ColumnsWidth := 5;
上面这句编译通不过呀,我再直接用你的代码试试。
 
他那个是Variant类型的所以可以直接这么写,你用的是控件呵呵
 
編譯肯定可以通過啦
你加了
Uses
ComObj

 
to sgs125 和 xiaolinj79 朋友:

编译通不过,提示缺少Variants单元文件。
在uses里去掉Variants后编译竟然通过了,但是运行时程序提示非法操作,拒绝执行。
 
控制Excel、word我不喜欢用Delphi导入的几个控件,而是喜欢用Xiaolinj79的方法用variant或是olevariant。而且代码我喜欢用Excel或是Word录制宏,然后再copy到delphi中,可管用了。
 
晕。。我这里调试通过的。。。汗~2个方法都通过。。。
 
后退
顶部