您的位置:首页 > 编程语言 > Delphi

Delphi控制Execl

2009-03-28 09:46 363 查看
Delphi控制Excel2000心得 - -

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

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

(二)使用Delphi 控件方法
在Form中分别放入ExcelApplication, ExcelWorkbook和ExcelWorksheet。
1)打开Excel
ExcelApplication1.Connect;
2)显示当前窗口:
ExcelApplication1.Visible[0] := True;
3)更改 Excel 标题栏:
ExcelApplication1.Caption := '应用程序调用 Microsoft Excel';
4)添加新工作簿:
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(EmptyParam, 0));
5)添加新工作表:
var Temp_Worksheet: _WorkSheet;
begin
Temp_Worksheet := ExcelWorkbook1.
WorkSheets.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam, 0) as _WorkSheet;
ExcelWorkSheet1.ConnectTo(Temp_WorkSheet);
end;
6)打开已存在的工作簿:
ExcelApplication1.Workbooks.Open(c: /a.xls
EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, 0)
7)设置第2个工作表为活动工作表:
ExcelApplication1.WorkSheets[2].Activate; 或
ExcelApplication1.WorksSheets['Sheet2'].Activate;
8)给单元格赋值:
ExcelApplication1.Cells[1, 4].Value := '第一行第四列';
9)设置指定列的宽度(单位: 字符个数), 以第一列为例:
ExcelApplication1.ActiveSheet.Columns[1].ColumnsWidth := 5;
10)设置指定行的高度(单位: 磅)(1 磅=0.035 厘米), 以第二行为例:
ExcelApplication1.ActiveSheet.Rows[2].RowHeight := 1 / 0.035; // 1厘米
11)在第8行之前插入分页符:
ExcelApplication1.WorkSheets[1].Rows[8].PageBreak := 1;
12)在第8列之前删除分页符:
ExcelApplication1.ActiveSheet.Columns[4].PageBreak := 0;
13)指定边框线宽度:
ExcelApplication1.ActiveSheet.Range['B3:D4'].Borders[2].Weight := 3;
1 - 左 2 - 右 3 - 顶 4 - 底 5 - 斜(/)6 - 斜(/ )
14)清除第一行第四列单元格公式:
ExcelApplication1.ActiveSheet.Cells[1, 4].ClearContents;
15)设置第一行字体属性:
ExcelApplication1.ActiveSheet.Rows[1].Font.Name := '隶书';
ExcelApplication1.ActiveSheet.Rows[1].Font.Color := clBlue;
ExcelApplication1.ActiveSheet.Rows[1].Font.Bold := True;
ExcelApplication1.ActiveSheet.Rows[1].Font.UnderLine := True;
16)进行页面设置:
a.页眉:
ExcelApplication1.ActiveSheet.PageSetup.CenterHeader := '报表演示';
b.页脚:
ExcelApplication1.ActiveSheet.PageSetup.CenterFooter := '第&P页';
c.页眉到顶端边距2cm:
ExcelApplication1.ActiveSheet.PageSetup.HeaderMargin := 2 / 0.035;
d.页脚到底端边距3cm:
ExcelApplication1.ActiveSheet.PageSetup.HeaderMargin := 3 / 0.035;
e.顶边距2cm:
ExcelApplication1.ActiveSheet.PageSetup.TopMargin := 2 / 0.035;
f.底边距2cm:
ExcelApplication1.ActiveSheet.PageSetup.BottomMargin := 2 / 0.035;
g.左边距2cm:
ExcelApplication1.ActiveSheet.PageSetup.LeftMargin := 2 / 0.035;
h.右边距2cm:
ExcelApplication1.ActiveSheet.PageSetup.RightMargin := 2 / 0.035;
i.页面水平居中:
ExcelApplication1.ActiveSheet.PageSetup.CenterHorizontally := 2 / 0.035;
j.页面垂直居中:
ExcelApplication1.ActiveSheet.PageSetup.CenterVertically := 2 / 0.035;
k.打印单元格网线:
ExcelApplication1.ActiveSheet.PageSetup.PrintGridLines := True;
17)拷贝操作:
a.拷贝整个工作表:
ExcelApplication1.ActiveSheet.Used.Range.Copy;
b.拷贝指定区域:
ExcelApplication1.ActiveSheet.Range['A1:E2'].Copy;
c.从A1位置开始粘贴:
ExcelApplication1.ActiveSheet.Range. ['A1'].PasteSpecial;
d.从文件尾部开始粘贴:
ExcelApplication1.ActiveSheet.Range.PasteSpecial;
18)插入一行或一列:
a.ExcelApplication1.ActiveSheet.Rows[2].Insert;
b.ExcelApplication1.ActiveSheet.Columns[1].Insert;
19)删除一行或一列:
a.ExcelApplication1.ActiveSheet.Rows[2].Delete;
b.ExcelApplication1.ActiveSheet.Columns[1].Delete;
20)打印预览工作表:
ExcelApplication1.ActiveSheet.PrintPreview;
21)打印输出工作表:
ExcelApplication1.ActiveSheet.PrintOut;
22)工作表保存:
if not ExcelApplication1.ActiveWorkBook.Saved then
ExcelApplication1.ActiveSheet.PrintPreview;
23)工作表另存为:
ExcelApplication1.SaveAs('C:/Excel/Demo1.xls');
24)放弃存盘:
ExcelApplication1.ActiveWorkBook.Saved := True;
25)关闭工作簿:
ExcelApplication1.WorkBooks.Close;
26)退出 Excel:
ExcelApplication1.Quit;
ExcelApplication1.Disconnect;
(三)使用Delphi 控制Excle二维图
在Form中分别放入ExcelApplication, ExcelWorkbook和ExcelWorksheet
var asheet1, achart, range: variant;
1)选择当第一个工作薄第一个工作表
asheet1 := ExcelApplication1.Workbooks[1].Worksheets[1];
2)增加一个二维图
achart := asheet1.chartobjects.add(100, 100, 200, 200);
3)选择二维图的形态
achart.chart.charttype := 4;
4)给二维图赋值
series := achart.chart.seriescollection;
range := sheet1!r2c3: r3c9;
series.add(range, true);
5)加上二维图的标题
achart.Chart.HasTitle := True;
achart.Chart.ChartTitle.Characters.Text := ' Excle二维图'
6)改变二维图的标题字体大小
achart.Chart.ChartTitle.Font.size := 6;
7)给二维图加下标说明
achart.Chart.Axes(xlCategory, xlPrimary).HasTitle := True;
achart.Chart.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text := '下标说明';
8)给二维图加左标说明
achart.Chart.Axes(xlValue, xlPrimary).HasTitle := True;
achart.Chart.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text := '左标说明';
9)给二维图加右标说明
achart.Chart.Axes(xlValue, xlSecondary).HasTitle := True;
achart.Chart.Axes(xlValue, xlSecondary).AxisTitle.Characters.Text := '右标说明';
10)改变二维图的显示区大小
achart.Chart.PlotArea.Left := 5;
achart.Chart.PlotArea.Width := 223;
achart.Chart.PlotArea.Height := 108;
11)给二维图坐标轴加上说明
achart.chart.seriescollection[1].NAME := '坐标轴说明';

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);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure setEclStyle;
procedure drawImg;
function getColChar(col: Integer): string;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

var
eclApp: Variant;
imgFile: string;

const
rowStart = 6;
colStart = 3;

//生成99乘法表

procedure TForm1.Button1Click(Sender: TObject);
var
i, j: Integer;
row, col: Integer;
begin
try
//创建OLE对象Excel Application与 WorkBook
eclApp := CreateOleObject('Excel.Application');
eclApp.workBooks.Add;
except
messagebox(handle, '您的机器里可能未安装Microsoft Excel或异常', '无法生成', MB_OK or MB_ICONWARNING);
Exit;
end;

eclApp.visible := True;

Hide; //生成过程将程序隐藏
try
for i := 1 to 9 do
begin
eclApp.Cells(rowStart, colStart + i) := i;
eclApp.Cells(rowStart + i, colStart) := i;
for j := 1 to 9 do
begin
row := rowStart + i;
col := colStart + j;
eclApp.Cells(row, col) := i * j;

//设置字体,底框颜色 颜色值为 $00BBGGRR
if i < j then
begin
eclApp.Cells.item[row, col].Font.Color := $00FF0000;
eclApp.Cells.item[row, col].Interior.Pattern := 1;
eclApp.cells.item[row, col].Interior.ColorIndex := 12;
end
else if i > j then
begin
eclApp.Cells.item[row, col].Font.Color := $0000FF00;
eclApp.Cells.item[row, col].Interior.Pattern := 1;
eclApp.cells.item[row, col].Interior.ColorIndex := 9;
end
else begin
eclApp.Cells.item[row, col].Font.Color := $000000FF;
eclApp.Cells.item[row, col].Interior.Pattern := 1;
eclApp.cells.item[row, col].Interior.ColorIndex := 6;
end;
end;
end;
SetEclStyle;
//设置纸线为横向
eclApp.ActiveSheet.PageSetup.Orientation := 2;
finally
Show;
end;
Application.BringToFront; //将应用程序提前
messagebox(handle, '生成完毕,您可以再进行编辑并存盘', '生成成功', MB_OK or MB_ICONINFORMATION);
end;

//关闭程序时,释放Excel应用对象

procedure TForm1.FormDestroy(Sender: TObject);
begin
//关闭eclApp
//若不进行这一步,在任务管理器中会驻留Excel进程
//但可以不必关闭Excel (eclApp.Quit),这样,操作员可以继续编辑或打印表格
eclApp := Unassigned;
end;

//设置表格的显示样式

procedure TForm1.setEclStyle;
var
Sheet, Range: Variant;
s: string;
rct: TRect;
begin

Sheet := eclApp.WorkBooks[1].WorkSheets[1];

s := Format('%s%d:%s%d', [getColChar(colStart),
rowStart,
getColChar(colStart + 9),
rowStart + 9]);
Range := Sheet.Range[s]; //得到区域对象

Range.Font.Name := 'Tahoma';
Range.Font.Bold := True;

//设置区域的外框线型
// 1: Left, 2: Right, 3: Top, 4: bottom
// 5: /, 6: / (斜线)
// 7: Left, 8: Top, 9: bottom, 10: Right (不包括内部单元格)
// 11, 12 , 内部单元格线条 (分别是竖线和横线,12我用了没效果)
Range.Borders[7].LineStyle := 1;
Range.Borders[7].Weight := 3;
Range.Borders[8].LineStyle := 1;
Range.Borders[8].Weight := 3;
Range.Borders[9].LineStyle := 1;
Range.Borders[9].Weight := 3;
Range.Borders[10].LineStyle := 1;
Range.Borders[10].Weight := 3;

Range.Borders[11].LineStyle := 1;
Range.Borders[11].Weight := 2;
Range.Borders[11].ColorIndex := 2;
Range.Borders[12].LineStyle := 1;
Range.Borders[12].Weight := 2;
Range.Borders[12].ColorIndex := 2;

//水平,垂直对齐方式
Range.HorizontalAlignment := 3;
Range.VerticalAlignment := 2;

//单元格行高,列宽
Range.ColumnWidth := 9;
Range.RowHeight := 18;

//设置表头
s := Format('%s%d:%0:s%2:d', [getColChar(colStart),
rowStart,
rowStart + 9]);
Range := Sheet.Range[s]; //得到区域对象
Range.ColumnWidth := 5;
Range.Interior.Pattern := 1;
Range.Interior.ColorIndex := 3;

s := Format('%s%d:%s%1:d', [getColChar(colStart + 1),
rowStart,
getColChar(colStart + 9)]);
Range := Sheet.Range[s]; //得到区域对象
Range.Interior.Pattern := 1;
Range.Interior.ColorIndex := 3;

//表格标题
s := Format('%s%d:%s%1:d', [getColChar(colStart),
rowStart - 2,
getColChar(colStart + 9)]);
Range := Sheet.Range[s];

//合并单元格
Range.Merge;
Range.Select;
//============================================
//在当前选定单元格插入图片
Sheet.Pictures.Insert(imgFile).Select;
//移动图片
eclApp.Selection.ShapeRange.IncrementLeft(180);
eclApp.Selection.ShapeRange.IncrementTop(-30);

rct.Left := Range.Left;
rct.Top := Range.Top;
rct.Right := rct.Left + Range.Width;
rct.Bottom := rct.Top + Range.Height;
//在指定坐标添加线条
Sheet.Shapes.AddLine(rct.Left, rct.Top, rct.Right, rct.Top).Select;
eclApp.Selection.ShapeRange.IncrementTop(18);
eclApp.Selection.ShapeRange.Line.Weight := 2.25;
//在指定坐标添加文本框 并选定
Sheet.Shapes.AddTextBox(1, rct.Right - 160, rct.Top, 160, 16).Select;
eclApp.Selection.Characters.Text := 'Design By Mostone.Jiang';
//选中字符的起始位置与长度(长度省去则包含所有后面的字符)
eclApp.Selection.Characters(11, 13).Font.FontStyle := '加粗 倾斜';
eclApp.Selection.Characters(11, 13).Font.Underline := 1;
eclApp.Selection.Characters(11, 13).Font.colorIndex := 46;
eclApp.Selection.Font.Name := 'Tahoma';
eclApp.Selection.ShapeRange.Fill.Visible := 0;
eclApp.Selection.ShapeRange.Line.Visible := 0;

end;

//程序启动时,创建一张图片,用来插入到生成的Excel表格中

procedure TForm1.FormCreate(Sender: TObject);
var
d: Word;
buf: array[0..255] of char;
begin
d := GetTempPath(sizeof(buf), buf);
if d > 0 then
begin
imgFile := buf + 'imgTL.jpg';
drawImg; //调用自定义过程,绘制图形并保存到临时目录
//也可以考虑使用剪贴板
end
else messagebox(handle, '无法得到临时目录!/n你可以继续运行程序/n但是生成的Excel表格将没有图例', '取临时文件出错', MB_OK or MB_ICONINFORMATION);
end;

//随便画张图

procedure TForm1.drawImg;
var
bitMap: TBitMap;
w, h: Integer;
begin
W := 268;
H := 50;
bitMap := TBitMap.Create;
try
bitMap.Width := W;
bitMap.Height := H;
with bitMap.Canvas do
begin
Font.Size := 36;
Font.Name := '隶书';

Brush.Style := bsClear;

TextOut(5, 9, '九九乘法表');
TextOut(5, 5, '○○');
end;
bitMap.SaveToFile(imgFile);
finally
bitMap.Free;
end;
end;

//返回列的字符表示符

function TForm1.getColChar(col: Integer): string;
const
Ai = 65; //'A'的ASCII码值
begin
if col > 256 then
begin
//允许的最大列数
raise ERangeError.CreateFmt('列(%d)超出允许的最大列数[256]', [col]);
exit
end;
if col <= 26 then Result := chr(Ai + col - 1) else
Result := chr(Ai + col div 26 - 1) + chr(Ai + (col - 1) mod 26);
end;

end.

//关闭程序时,释放Excel应用对象

procedure TForm1.FormDestroy(Sender: TObject);
begin
//关闭eclApp
//若不进行这一步,在任务管理器中会驻留Excel进程
//但可以不必关闭Excel (eclApp.Quit),这样,操作员可以继续编辑或打印表格
eclApp := Unassigned;
end;

//合并单元格
Range.Merge;
Range.Select;

//自己用的一个过程, 把数据集导如导excel, adsdata可以换成任意你用导的数据集
WriteExcel(AdsData: Tclientdataset; sName, Title: string);
var
ExcelApplication1: TExcelApplication;
ExcelWorksheet1: TExcelWorksheet;
ExcelWorkbook1: TExcelWorkbook;
i, j: integer;
filename: string;
begin
filename := concat(sName, '.xls');
try
ExcelApplication1 := TExcelApplication.Create(Application);
ExcelWorksheet1 := TExcelWorksheet.Create(Application);
ExcelWorkbook1 := TExcelWorkbook.Create(Application);
ExcelApplication1.Connect;
except
Application.Messagebox('Excel没有安装!', 'Hello', MB_ICONERROR + mb_Ok);
Abort;
end;
try
ExcelApplication1.Workbooks.Add(EmptyParam, 0);
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _worksheet);
AdsData.First;
for j := 0 to AdsData.Fields.Count - 1 do
begin
ExcelWorksheet1.Cells.item[3, j + 1] := AdsData.Fields[j].DisplayLabel;
ExcelWorksheet1.Cells.item[3, j + 1].font.size := '10';
end;
for i := 4 to AdsData.RecordCount + 3 do
begin
for j := 0 to AdsData.Fields.Count - 1 do
begin
ExcelWorksheet1.Cells.item[i, j + 1] :=
AdsData.Fields[j].Asstring;
ExcelWorksheet1.Cells.item[i, j + 1].font.size := '10';
end;
AdsData.Next;
end;
ExcelWorksheet1.Columns.AutoFit;
ExcelWorksheet1.Cells.item[1, 2] := Title;
ExcelWorksheet1.Cells.Item[1, 2].font.size := '14';
ExcelWorksheet1.SaveAs(filename);
Application.Messagebox(pchar('数据成功导出' + filename), '信息化建设部', mb_Ok);
finally
ExcelApplication1.Disconnect;
ExcelApplication1.Quit;
ExcelApplication1.Free;
ExcelWorksheet1.Free;
ExcelWorkbook1.Free;
end;
end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: