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
程序运行效果如图所示:




已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页