delphi应用EXCEL(2) 使用delphi控件
Delphi的excel控件在servers面板中,有些版本的DELPHI中未打开这些控件,但都是安装了的,手动去打开即可。
在servers控件选项页面中,选择ExcelApplication、ExcelWorkbook和ExcelWorksheet这3个控件。
- ExcelApplication:用于启动/关闭EXCEL应用程序。
- ExcelWorkbook:用于连接工作薄。
- ExcelWorksheet:用于连接工作表。
我们的页面中使用这三个控件,命名分别是:
- exclApp1: TExcelApplication;
- exclSht1: TExcelWorksheet;
- exclBk1: TExcelWorkbook;
1. ExcelApplication的使用
这个是应用程序控件,用于打开或关闭excel,或设置应用程序可见或不可见等属性,也可用于打开、关闭工作簿。
Autoconnect属性用于确定是否在执行程序是自动打开EXCEL,autoquit属性用于确定在关闭程序时是否自动关闭excel;
// 连接到Excel exclApp1.Connect; // 显示询问窗口(比如文件名重复是否保存之类的询问) exclApp1.DisplayAlerts[0] := True; // 显示EXCEL窗口,默认显示,设置为false则在后台运行excel程序 exclApp1.Visible[0] := True; // 设置标题栏内容 exclApp1.Caption := 'Test Excel Demo'; //全屏显示EXCEL EA1.DisplayAlerts[0]:=TRUE;
实际上,在这个控件中就可以实现对excel的所有操作,但接下来我们使用接下来的两个控件更方便。
2. ExcelWorkbook的使用
这个控件主要用于控制工作簿,在使用前,应与某工作簿链接。常见操作见下:
VAR wkExcel: _Workbook; …… // 创建一份空的工作簿,默认包含3个工作表 wkExcel := exclApp1.Workbooks.Add(EmptyParam, 0); // TExcelWorkbook连接到创建的工作簿 exclBk1.ConnectTo(wkExcel); // 激活工作簿 exclBk1.Activate; // 统计工作薄的有几张工作表 ShowMessage(IntToStr(exclBk1.Worksheets.Count));
可以使用控件Texcelworkbook通过连接_workbook来操作工作簿,其实也可直接操作_WORKBOOK,操作都是一样的。另外,_WORKBOOK的别名是Excelworkbook。
EA1下控制若干工作簿,但只有一个active(活动的)的工作簿,可以通过调用工作簿的activate来使得某一工作簿变成活动工作簿。
此外,EA1的worksheets并不是所有的sheets,而是活动工作簿的sheets,所以activeworksheet对应的是活动工作簿的活动工作表。
workbooks.count指的是工作簿的数量;
workbooks[1]指的是第一个工作簿。
Workbooks.Add(EmptyParam, 0),第一个参数是新建的工作簿的类型,emptyparam表示是默认的excel工作簿,也可以是‘’空字符串。
打开工作簿的函数比较复杂,参数很多。
WorkBooks.Open(filename,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,LCID);
同样的,保存这个工作表也非常复杂。
Excel.ActiveWorkBook.SaveAs ( ' MyOutput ' , EmptyParam,EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, LCID);
主要是包含了各种密码设置等等。
注意,emptyparam并不是一个常量,而是一个函数,所以并不是每一个emptyparam都可以使用空字符串代替。
Activeworkbook.save(0)将以Activeworkbook.name加默认扩展名的文件名保存工作簿,但Activeworkbook.name是一个只读变量,不能修改,所以,另一种保存工作簿的方法是:
wkBook.Close(True, SaveAsName, EmptyParam, 0);
关闭workbook并保存。
第一个参数说明在关闭工作簿之前是否保存所做的修改。
第二个参数当然指的是文件名了。
第三个参数用于多位作者处理文档的情况。
3. ExcelWorksheet的使用
工作表的使用稍微复杂一点,因为工作表连接时的类型和workbook生成表的类型略有区别,需要你手动转换一下。
同时,workbook默认的sheets有三张,先请看下面的语句:
(EA1.ActiveWorkbook.Worksheets[2] as ExcelWorksheet).Activate(0); with (EA1.ActiveSheet as ExcelWorksheet) do begin name:='shujuceshi'; with Cells.Range[Cells.Item[2,2],Cells.Item[5,5]] do begin Cells.RowHeight:=30; Cells.ColumnWidth:=25; Cells.Borders.Item[1].Weight:=3; Cells.Borders.Item[2].Weight:=3; Cells.Borders.Item[3].Weight:=3; Cells.Borders.Item[4].Weight:=3; Cells.Item[2,3]:='=pi()'; Cells.Range['A1','B2'].Value2:='test'; end; end;
首先是让活动workbook的第二张表成为活动工作表;
接着针对第二章工作表(活动工作表表做操作)
参见上面的运行结果图,表下的cells表示表下的所有格子的集合。
然后在cells下用range函数圈定某些单元格,range的参数可以指定某些具体的单元格,例如例子中cells.item[2,2]表示第二行第二列的单元格,也可直接用字符串’B2’表示。
然后圈定范围的单元格又可以从CELLS众检索,例如CELLS.item[2,3]实际指向的是第三行第四列(因为cells子集是从2,2开始的)。里面的填充内容可以直接写字符串。当然这个字符串可以是excel的公式,例如本例中指的就是函数pi()
Cells的rowheight指的是指定cells的行高,注意,rowheight和columnwidth的单位是不一样的,例子中25的列宽明显比30的行高更高。
Borders.item[I].weight用于设置单元格的边框,1-6分别表示左上右下斜反斜线的厚度。
Item[7-10]则指的是子集的外边框。
Range子集的value2可以为子集的集体赋值。同样的,range[‘A1’,’B2’]并不是指定的sheet的一行一列到二行二列,而是子集的相对位置。
下面再慢慢讲讲使用控件的操作方式。
我们通常应该是针对range或item进行操作,item指向具体的单元格,通常只对其赋值。而range指向的是单元格子集,可以改变子集的字体,对齐方式,单元格显示格式化等等。
// 创建一张新的工作表 wsExcel := (exclBk1.Worksheets.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam, 0)) as _Worksheet; exclSht1.ConnectTo(wsExcel); exclSht1.Activate;
某张表的名称:
// 设置当前工作表的名称 exclSht1.Name := 'New Worksheet';
ROWS表示行的数据,rows.range表示行内列的数据。
如果不设置具体的range,则可以设置整个表的行高;columns表示列,同样也可以设置列数据。需要注意的是,列宽和行高是的数字是有限的,设置过高的列宽或行高则无反应。
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';
Cells属性用于存储的数据。下列是一个九九乘法表。
for I := 1 to 9 do for j:=1 to I do es1.Cells.Item[i,j]:=format( '%d × %d=%d',[i,j,i*j]);
下面的语句用于设置页面。
with wkSheet.PageSetUp do begin PaperSize: = xlPaperA4; // Paper type A4 PrintTitleRows : = ' A1:D1 ' ; // Repeat this row/page LeftMargin: = 18 ; // 0.25" Left Margin RightMargin: = 18 ; // 0.25" will vary between printers TopMargin: = 36 ; // 0.5" BottomMargin: = 36 ; // 0.5" CenterHorizontally: = True; Orientation: = 1 ; // 横向打印(landscape)=2, portrait = 1 end;