动态生成EXCEL,列的宽度设置怎么做?单元格中字符居中如何设置?(50分)

  • 主题发起人 主题发起人 citybug_ch
  • 开始时间 开始时间
C

citybug_ch

Unregistered / Unconfirmed
GUEST, unregistred user!
按照在大富翁中一个帖子的方法动态生成EXCEL,但是设置列的宽度不能通过编译。程序如下:
procedure TfrmZeroBasicInfo.bPrintClick(Sender: TObject);
var
ExcelApp:Variant;
ExcelWorkBook: Variant;
ExcelWorkSheet:Variant;
X1: olevariant;
begin
try
ExcelApp:=UnAssigned;
ExcelApp:=CreateOleObject('Excel.Application');
except
showmessage('请检查系统是否已经安装了EXCEL');
Exit;
end;
ExcelApp.WorkBooks.Add;
ExcelApp.WorKSheets[1].Activate;
ExcelApp.ActiveSheet.columns[1].ColumnsWidth:=500;
ExcelApp.ActiveSheet.Columns[1].Align:=center;
ExcelApp.ActiveSheet.Range['A1','E1'].Merge(X1);
ExcelApp.ActiveSheet.Rows[1].Font.Size:=14;
ExcelApp.ActiveSheet.Rows[1].Font.Bold:=True;
ExcelApp.Cells[1,1].Value:='社区基本情况';

ExcelApp.Visible:=True;
ExcelApp.ActiveSheet.PrintPreview;
//ExcelWorkBook.close;
ExcelApp.Quit;
//ExcelWorkSheet:=UnAssigned;
//ExcelWorkBook:=UnAssigned;
ExcelApp:=UnAssigned;
end;

请问:如何设置列的宽度和单元格中字符居中?能否设置单元格的格式呢?
 
应可以吧,录个宏看看...
 
OleContainer1.CreateObject('Excel.Sheet',false);
u1:=OleContainer1.OleObject.application.Activesheet;
range:=OleContainer1.OleObject.application.Range[u1.cells[1,1],u1.cells[200,200]];
range.select;
range.columnwidth:=1.2;//宽
range.rowheight:=6.0;//高
range.HorizontalAlignment:=3;//居中
range.VerticalAlignment:=2;//居中
 
比如象我上面的程序,我合并单元后成为X1,能不能利用这个变量做行高、居中的设置。
再有,列的宽度是不是也可以利用这个X1变量呢?
 
Myworkbook.Windows[1].WindowState:=2; //Excel表格最大化
Myworkbook.Worksheets[1].RANGE['A1:L1'].MergeCells:=TRUE;
Myworkbook.Worksheets[1].Cells[1,1].Value:=FormatDateTime('yyyy年mm月dd號',DateP1.Date);
Myworkbook.Worksheets[1].Rows[1].Font.Bold:=True;
Myworkbook.Worksheets[1].Rows[1].Font.size:=14;
Myworkbook.Worksheets[1].rows[2].font.size:=9;
Myworkbook.Worksheets[1].range['A1','A1'].HorizontalAlignment:=3;
Myworkbook.Worksheets[1].range['A1','A1'].VerticalAlignment:=2;
 
你用OLE自动化服务器速度比较慢,其实这样都是通过VBA代码实现的。我听别人说过,在DELPHI里做一个容器,然后再直接使用VBA编程,速度非常快。大家可以尝试一下。具体的我没有实现过,我有空再一起研究一下这个问题。
 
v:= CreateOleObject('Excel.Application');
v.Visible :=True;
v.Workbooks.Add;//新建EXCEL文件
v.Workbooks[1].WorkSheets[1].Name := '指标体系';
Sheet:= v.Workbooks[1].WorkSheets[1];

//**********
...............................
Sheet.Columns['A:A'].ColumnWidth := 16;
Sheet.Columns['B:B'].ColumnWidth := 16;
Sheet.Columns['C:C'].ColumnWidth := 40;

我就这样设置的,关于居中问题,我没有试出来,关注!
 
顺便问一下:
在EXCEL中画单元格线怎么画?
 
Sheet.Columns['A:A'].ColumnWidth := 16;//列宽
Sheet.range['A:A'].Borders.LineStyle:=1;//单元格添加边框
Sheet.Columns['B:B'].ColumnWidth := 16;
Sheet.range['B:B'].Borders.LineStyle:=1;
Sheet.Columns['C:C'].ColumnWidth := 40;
Sheet.range['C:C'].Borders.LineStyle:=1;
 
在DELPHI里做一个容器,然后再直接使用VBA编程,速度非常快。????????????
 
找到了,最彻底的方法!
delphi的project-〉import type library中选择Microsoft Excel 11.0 object library[version 1.5],然后create unit生成单元文件,在你的uses里面引用他,就可以了
比如居中
Sheet.range['A:Z'].Rows.HorizontalAlignment:=xlCenter;
Sheet.range['A:Z'].Rows.VerticalAlignment:=xlCenter;
 
再问:合并单元格,我需要根据计算结果来合并单元格,如何合并?
使用字母太困难,超过26个字母就不好计算了,有没有列和行都用数字表示的?
var
StarColumn: integer;
AnswerCount: integer;
begin
.....
ExcelApp.ActiveSheet.Range[Chr(StarColumn+65)+ '2',Chr(StarColumn+ 65+AnswerCount) + '2'].Merge(X1);
//ExcelWorkSheet.Cells[2,StarColumn].value:=Copy(Question,1,1);
StarColumn:=StarColumn + AnswerCount;
.....
end;
上面是我通过ASCII转化来算的,并不准备,而且如果StarColumn大于一定数字后就出错,请问,有没有使用数字表示行和列的合并单元格方法?
 
var
StarColumn: integer;
AnswerCount: integer;
c1,c2:variant;
begin
.....
c1:=ExcelApp.ActiveSheet.Cells[2,StarColumn];
c2:=ExcelApp.ActiveSheet.cells[2,StarColumn+AnswerCount];
ExcelApp.ActiveSheet.Range[c1,c2].Merge(X1);
//ExcelWorkSheet.Cells[2,StarColumn].value:=Copy(Question,1,1);
StarColumn:=StarColumn + AnswerCount;
.....
end;
 
不好意思,分数太少,对不起各位了。
 
多人接受答案了。
 
后退
顶部