在介绍使用delphi控件前,我们首先需要了解关于EXCEL的几个基本概念:EXCEL应用程序、工作薄(book)、工作表(sheet),我们每次打开excel应用程序时,都会看到一个工作薄和三张工作表,这些都是EXCEL应用程序默认提供建好的。一个ExceL应用程序可以包含多个工作薄(book),每个工作薄至少需要包含一个工作表(sheet)。
图1 一个空的EXCEL应用程序窗口
图2 具有3个工作薄的EXCEL应用
点击工具栏中“新建”按钮,可以添加新的工作薄,如图3所示:
图3 新建按钮可以创建新的工作薄
图4 工作薄中包含工作表,右击表名(例如sheet1,sheet2...),在弹出的菜单中点击“插入”查单可以添加一张新的工作表。
delphi操作EXCEL的控件
在servers控件选项页面中,选择ExcelApplication、ExcelWorkbook和ExcelWorksheet这3个控件放置在窗体上,如图所示:
图5 控件在servers选项卡中的样式
说明:如果在servers选项卡中找不到这3个控件,请手动安装。以Delphi7为例,点击“component”菜单,在菜单栏中点击“Install Packages...”,在弹出的窗体中点击“Add”按钮,在delphi的安装目录下的bin目录中找到“dclofficexp70.bpl”。选择后进行控件安装即可。
图6
“”
图7
放置好3个控件的示例界面如图8所示:
图8
完整的程序代码如下所示:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExcelXP, OleServer, StdCtrls, ComObj;
type
TForm1 = class(TForm)
exclApp1: TExcelApplication;
exclSht1: TExcelWorksheet;
exclBk1: TExcelWorkbook;
btn1: TButton;
btn2: TButton;
mmo1: TMemo;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
const
EXCEL_OPEN_PATH: string = 'C:\testExcelDemo.XLS';
EXCEL_SAVE_PATH: string = 'C:\testExcelDemo.xls';
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
const
ROW_COL: STRING = '第%d行,第%d列';
var
wkExcel: _Workbook;
wsExcel: _Worksheet;
i, j: Integer;
strSaveExcelName: string;
begin
// 创建Excel
try
// 连接到Excel
exclApp1.Connect;
// 显示询问窗口(比如文件名重复是否保存之类的询问)
exclApp1.DisplayAlerts[0] := True;
// 不显示EXCEL窗口
exclApp1.Visible[0] := True;
// 设置标题栏内容
exclApp1.Caption := 'Test Excel Demo';
// 创建一份空的工作簿,默认包含3个工作表
wkExcel := exclApp1.Workbooks.Add(EmptyParam, 0);
// TExcelWorkbook连接到创建的工作簿
exclBk1.ConnectTo(wkExcel);
// 激活工作簿
exclBk1.Activate;
// 统计工作薄的有几张工作表
// ShowMessage(IntToStr(exclBk1.Worksheets.Count));
// 创建一张新的工作表
wsExcel := (exclBk1.Worksheets.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam, 0)) as _Worksheet;
exclSht1.ConnectTo(wsExcel);
exclSht1.Activate;
// 设置当前工作表的名称
exclSht1.Name := 'New Worksheet';
// 设置EXCEL表的第一行为表的名称
// 设定从A列到D列的列宽
exclSht1.Rows.Range['A1','D1'].ColumnWidth := 30;
// 设定第一行从A列到D列的字体颜色为蓝色
exclSht1.Rows.Range['A1','D1'].Font.Color := clblue;
// 设定第一行从A列到D列的字体加粗
exclSht1.Rows.Range['A1','D1'].Font.Bold := true;
// 设定第一行从A列到D列的字号为18
exclSht1.Rows.Range['A1','D1'].Font.Size := 18;
// 设定第一行从A列到D列合并
exclSht1.Rows.Range['A1','D1'].Merge(4);
// 调整第一行行高
exclSht1.Rows.Range['A1','D1'].Rows.RowHeight := 30;
// 设置文本垂直居中
exclSht1.Rows.Range['A1','D1'].VerticalAlignment := xlcenter;
// 设置文本水平居中
exclSht1.Rows.Range['A1','D1'].HorizontalAlignment := xlcenter;
// 填充内容
exclSht1.Cells.Item[1, 1] := 'TEST EXCEL DEMO';
// 设置EXCEL表的第二行为表头
// 设定第二行从A列到D列的字体颜色为红色
exclSht1.Rows.Range['A2','D2'].Font.Color := clRed;
// 填充第一行,A列到D列的单元格
exclSht1.Cells.Item[2, 1] := '第一列';
exclSht1.Cells.Item[2, 2] := '第二列';
exclSht1.Cells.Item[2, 3] := '第三列';
exclSht1.Cells.Item[2, 4] := '第四列';
// 填充一个4x4的表格
for i := 3 to 7 do
begin
for j := 1 to 4 do
begin
exclSht1.Cells.Item[i, j] := Format(ROW_COL,[i, j]);
end;
end;
// 给A1到D7整个范围加边框
exclSht1.Rows.Range['A1','D7'].Borders.LineStyle := 1;
// 保存excel文件
try
// 可以通过FileExists()函数预先判断文件名是否重名
exclSht1.SaveAs(EXCEL_SAVE_PATH);
except
// 发现文件名重复时选择不替换保存会抛出异常
on e: EOleException do // 引用ComObj单元
begin
// exclSht1.Delete; // 删除当前工作表
ShowMessage(e.ClassName);
end;
end;
finally
// 如果工作簿没有保存,强制设置为已保存,避免在调用Quit方法时再次提示保存文件
if not exclBk1.Saved[0] then
begin
ShowMessage('工作薄尚未保存!');
exclBk1.Saved[0] := True; // 放弃存盘
end;
exclSht1.Disconnect;
exclBk1.Disconnect;
exclApp1.Disconnect;
exclApp1.Quit;
end;
end;
procedure TForm1.btn2Click(Sender: TObject);
var
wkExcel: _Workbook;
wsExcel: _Worksheet;
i, j: Integer;
strSaveExcelName: string;
iValidRows: Integer; // 工作表的有效行
iValidCols: Integer; // 工作表的有效列
strContent: string; // 工作表的内容
begin
mmo1.Clear;
// 读Excel
try
// 连接到excel应用程序
exclApp1.Connect;
exclApp1.Visible[0] := False;
// 打开一个已经存在的EXCEL文件
exclApp1.Workbooks.Open(EXCEL_OPEN_PATH, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, 0);
// 连接到第一个工作簿
exclBk1.ConnectTo(exclApp1.Workbooks.Item[1]);
// 连接到第一个工作表
wsExcel := exclBk1.Worksheets.Item[1] as _Worksheet;
exclSht1.ConnectTo(wsExcel);
// 激活工作表
exclSht1.Activate(0);
iValidRows := exclSht1.UsedRange[0].Rows.Count; // 有效行数
iValidCols := exclSht1.UsedRange[0].Columns.Count; // 有效列数
ShowMessage(IntToStr(iValidRows) + ', ' + IntToStr(iValidCols));
for i := 1 to iValidRows do
begin
strContent := ''; // 清空内容
for j := 1 to iValidCols do
begin
// 读工作表单元格
strContent :=strContent + string(exclSht1.Cells.Item[i, j]) + ', ';
end;
// 显示在mmo1中
mmo1.Lines.Add(strContent);
end;
finally
exclSht1.Disconnect;
exclBk1.Disconnect;
exclApp1.Disconnect;
exclApp1.Quit;
end;
end;
end.
完整代码示例下载链接:http://download.youkuaiyun.com/detail/js0001/6810841
程序运行效果如图所示: