delphi自带控件操作excel

在介绍使用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.csdn.net/detail/js0001/6810841
程序运行效果如图所示:




使用方便,功能强大。 type FileCheckResult = (fcrNotExistend,fcrNotXSLFile,fcrValidXSL); //文件不存在,不是XSL文件,合法的XSL文件 TOLEExcel = class(TComponent) private FExcelCreated: Boolean; FVisible: Boolean; FExcel: Variant; //Excel程序对象 FWorkBook: Variant; //Excel工作簿对象 FWorkSheet: Variant; //Excel工作簿 工作表对象 FCellFont: TFont; //单元格字体对象 FTitleFont: TFont; // FFontChanged: Boolean; FIgnoreFont: Boolean; FFileName: TFileName; //********************************************自己添加*****************************// FCreateFromFile:Boolean; //指示是否打开已有文件 FExcelCaption:string; //用程序打开Excel的窗体标 //*********************************来自U_Report*****************************// FRCPrePage:Integer; //每页显示的记录数 FMax:Integer; //最大的数组个数 procedure SetExcelCellFont(var Cell: Variant); procedure SetExcelTitleFont(var Cell: Variant); procedure GetTableColumnName(const Table: TTable; var Cell: Variant); procedure GetQueryColumnName(const Query: TQuery; var Cell: Variant); procedure GetFixedCols(const StringGrid: TStringGrid; var Cell: Variant); procedure GetFixedRows(const StringGrid: TStringGrid; var Cell: Variant); procedure GetStringGridBody(const StringGrid: TStringGrid; var Cell: Variant); protected procedure SetCellFont(NewFont: TFont); procedure SetTitleFont(NewFont: TFont); procedure SetVisible(DoShow: Boolean); function GetCell( ARow,ACol: Integer): string; procedure SetCell(ACol, ARow: Integer; const Value: string); function GetDateCell(ACol, ARow: Integer): TDateTime; procedure SetDateCell(ACol, ARow: Integer; const Value: TDateTime); //*********************************************自己添加************************************// procedure SetCaption(ACaption:string);//设置打开文件后,Excel主程序的窗体标题 function GetCapiton:string;//返回打开文件后,Excel主程序的窗体标题 public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure C
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值