Delphi导出Execl及控制Execl

来源:互联网 发布:注册教师网络培训平台 编辑:程序博客网 时间:2024/05/18 20:09

类 别: COM & ActiveX
(一)使用动态创建的方法
首先创建 Excel 对象, 使用ComObj:
var ExcelApp: Variant;
  ExcelApp := CreateOleObject('Excel.Application');

    ------------复选框-------------

    ExcelApp.Activesheet.OptionButtones.Add(ExcelApp.Range['A1'].Left, ExcelApp.Range['A1'].Top,ExcelApp.Range['A1'].Width,ExcelApp.Range['A1'].Height);  //插入位置
     ExcelApp.Activesheet.OptionButtones[1].Characters.Text := 'Tested';   //名字
     ExcelApp.Activesheet.OptionButtones[1].Value := true ;   //选中

 


  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;

原创粉丝点击