Delphi 控制Excel

  1 创建Excel文件

  要在Delphi中控制Excel,就必须用到OLE自动化。现在一般采用OLE2来创建OLE对象,当激活一个OLE对象时,服务器程序仅在容器程序内部激活,这就是所谓的“就地激活”(in-place activation)。

  创建Excel文件时,先创建一个OLE对象,然后在对象中建立工作表worksheet,如函数createExcel所示:

  function createExcel:variant;

  var

  v:variant;

  sheet:variant;

  begin

  v:=createoleobject('Excel.Application');//创建OLE对象

  v.visible:=true;

  v.workbooks.add(-4167); //添加工作表

  v.workbooks[1].sheets[1].name:='test';

  sheet:=v.workbooks[1].sheets['test'];

  return v;

  end;

  2 数据表格控制

  Excel表格的控制,主要包括数据的导入、修改;单元格的合并、边框的控制;表格的复制、粘贴等。当报表格式一定的情况下,表格的复制、粘贴显得尤为重要,这样,可以先制作一个文件模板,然后按照实际需要输出多页报表即可。

  (1)数据的导入(importData)

  procedure importData;

  var

  I,j:integer;

  v:variant;

  begin

  v:=createExcel; //创建Excel文件test

  for I:=0 to maxcolumn do

  begin

  for j:=0 to maxrow do

  v.workbooks[1].sheets[1].cells[I,j]:=I*j; //导入数据

  end;

  end;

  (2)单元格的合并、边框的控制(lineStylecontrol)

  单元格的合并,是在选定合并范围的情况下进行的。边框控制可以操作边框线条的是否显示。其他方式的控制,可以仿照下面过程进行。

  procedure lineStylecontrol;

  var

  v,sheet,range:variant;

  begin

  v:=createExecl;

  sheet:= v.workbooks[1].sheets[1];

  range:=sheet.range[sheet.cells[1,1],sheet.cells[39,30]];//选定表格

  range.select;

  range.merge; //合并单元格

  range.borders.linestyle:=xlcontinuous; //置边框线可见

  range.font.size:=9; //改变表格内文本字体大小

  end;

4.實例
procedure TForm1.Button1Click(Sender: TObject);
var Cell1, Cell2, Cell3, Cell4, Range1, Range2: Variant;
  ExcelApplication, Sheet1: Variant;
begin
  try
    ExcelApplication := CreateOleObject('Excel.Application');
  except
    Showmessage('Sorry,No Excel');
    abort;
  end;
  ExcelApplication.Visible := true;
  ExcelApplication.Workbooks.Add(xlWBatWorkSheet);
  Sheet1 := ExcelApplication.Workbooks[1].Worksheets['sheet1'];
  Sheet1.Name := 'Delphi控制Excel Chart';
  Sheet1.Cells.item[1, 1] := 'Excel Chart -范例';
  Sheet1.Cells.item[2, 1] := '星期';
  Sheet1.Cells.item[2, 2] := '星期一';
  Sheet1.Cells.item[2, 3] := '星期二';
  Sheet1.Cells.item[2, 4] := '星期三';
  Sheet1.Cells.item[2, 5] := '星期四';
  Sheet1.Cells.item[2, 6] := '星期五-';
  Sheet1.Cells.item[2, 7] := '星期六';
  Sheet1.Cells.item[2, 8] := '星期日';
  Sheet1.Cells.item[3, 1] := '銷售量';
  Sheet1.Cells.item[3, 2] := 115;
  Sheet1.Cells.item[3, 3] := 112;
  Sheet1.Cells.item[3, 4] := 156;
  Sheet1.Cells.item[3, 5] := 148;
  Sheet1.Cells.item[3, 6] := 132;
  Sheet1.Cells.item[3, 7] := 196;
  Sheet1.Cells.item[3, 8] := 162;
  Cell1 := Sheet1.Cells.item[2, 2];
  Cell2 := Sheet1.Cells.item[2, 8];
  Cell3 := Sheet1.Cells.item[3, 2];
  Cell4 := Sheet1.Cells.item[3, 8];
  Range1 := sheet1.Range[cell1, cell2]; //設定Chart類別座標軸的取值范圍
  Range2 := sheet1.Range[cell3, cell4]; //設定Chart數值座標軸的取值范圍
  Range1.Borders.Color := 27;
  Range2.Borders.Color := 6;
 //向工作表中添加內嵌圖表﹐Add方法中的四個參數分別表示與儲存格A1的左邊距﹑頂部邊距﹑以及圖表的寬度and高度﹔
  Sheet1.ChartObjects.add(10, 60, 500, 280);
  sheet1.ChartObjects[1].Activate; //激活當前圖表
  sheet1.ChartObjects[1].Chart.charttype := xl3DColumnClustered; //指定圖表類型﹕立體叢集直條圖
  sheet1.ChartObjects[1].Chart.seriescollection.ADD[Range2]; //建立新數例
  sheet1.ChartObjects[1].Chart.seriescollection[1].values := Range2; //指定新數例值
  sheet1.ChartObjects[1].Chart.seriesCollection[1].hasdatalabels := True; //顯示圖表中數列的資料標簽﹔
  sheet1.ChartObjects[1].Chart.Axes[xlValue].MinimumScale := 100; //設定數值座標軸的最小刻度值﹔
  sheet1.ChartObjects[1].Chart.Axes[xlValue].MaximumScale := 200; //設定數值座標軸的最大刻度值﹔
  sheet1.ChartObjects[1].Chart.Axes[xlValue].MajorUnit := 10; //設定數值座標的主要單位﹔
  sheet1.ChartObjects[1].Chart.Axes[xlValue].MinorUnit := 10; //設定數值座標的次要單位﹔
  sheet1.ChartObjects[1].Chart.Axes[xlCategory].HasTitle := True;
  sheet1.ChartObjects[1].Chart.Axes[xlCategory].AxisTitle.Text := '星期'; //類別座標軸標簽。
  sheet1.ChartObjects[1].Chart.Axes[xlCategory].CategoryNames := Range1;
  sheet1.ChartObjects[1].Chart.HasLegend := false; //不顯示圖例
  sheet1.ChartObjects[1].Chart.ChartArea.Fill.Visible := true; //圖表區域填滿
  sheet1.ChartObjects[1].Chart.ChartArea.Fill.ForeColor.SchemeColor := 28; //前景色彩﹔
  sheet1.ChartObjects[1].Chart.ChartArea.Fill.BackColor.SchemeColor := 42; //背景色彩﹔
  sheet1.ChartObjects[1].Chart.Rotation := 44; // 以度為單位傳回或設定立體圖表檢視的旋轉值﹔
  sheet1.ChartObjects[1].Chart.walls.Interior.ColorIndex := 28;
  //如果指定圖表的座標軸為直角﹐并與圖表的轉角或仰角無關﹐則為True,僅適用于立體折線圖﹐直條圖與橫條圖﹔
  sheet1.ChartObjects[1].Chart.RightAngleAxes := True;
  sheet1.ChartObjects[1].Chart.ChartGroups(1).VaryByCategories := true; //對每個資料標號指定不同的色彩或圖樣.

  Sheet1.Range['A20', 'C20'].Columns.HorizontalAlignment := xlGeneral;
  Sheet1.Range['A20', 'C20'].Columns.VerticalAlignment := xlcenter;
  Sheet1.Range['A20', 'C20'].Columns.WrapText := False;
  Sheet1.Range['A20', 'C20'].Columns.Orientation := 0;
  Sheet1.Range['A20', 'C20'].Columns.AddIndent := False;
  Sheet1.Range['A20', 'C20'].Columns.IndentLevel := 0;
  Sheet1.Range['A20', 'C20'].Columns.MergeCells := True;
  sheet1.Range['A20', 'A20'].value := 'TEST';
end;

5.實例
procedure TF_TestChart.Button1Click(Sender: TObject);
var
   startx,i,x:integer;
   Cell1,Cell2,Range:Variant;
begin
    try
      FExcelApplication:=CreateOleObject('Excel.Application');
    except
      MessageDlg(rsNoSetup,mtInformation,[mbOK],0);
      Exit;
    end;
      FExcelApplication.Workbooks.Add(xlWBatWorkSheet);
      Sheet1:=FExcelApplication.Workbooks[1].Worksheets['sheet1'];
      FExcelApplication.Visible:=true;
      Sheet1.cells.item[1,1]:='Monthly';
      Sheet1.cells.item[1,2]:='Jan';
      Sheet1.cells.item[1,3]:='Feb';
      Sheet1.cells.item[1,4]:='Mar';
      Sheet1.cells.item[1,5]:='Apr';
      Sheet1.cells.item[1,6]:='May';
      Sheet1.cells.item[1,7]:='Jun';
      Sheet1.cells.item[1,8]:='Jul';
      Sheet1.cells.item[1,9]:='Aug';
      Sheet1.cells.item[1,10]:='Sep';
      Sheet1.cells.item[1,11]:='Oct';
      Sheet1.cells.item[1,12]:='Nov';
      Sheet1.cells.item[1,13]:='Dec';
      Sheet1.cells.item[1,13]:='Dec';

      Sheet1.Range['A20','C20'].Columns.HorizontalAlignment:=xlGeneral;
      Sheet1.Range['A20','C20'].Columns.VerticalAlignment:=xlcenter;
      Sheet1.Range['A20','C20'].Columns.WrapText := False;
      Sheet1.Range['A20','C20'].Columns.Orientation:= 0 ;
      Sheet1.Range['A20','C20'].Columns.AddIndent := False ;
      Sheet1.Range['A20','C20'].Columns.IndentLevel := 0  ;
      Sheet1.Range['A20','C20'].Columns.MergeCells := True  ;
      sheet1.Range['A20','A20'].value:='TEST';
     
      startx:=2;

    for  x:=1 to 3 DO
    begin
      for i:=1 to 12 DO
      begin
        Sheet1.cells.item[x+1,1]:=x;
        Sheet1.cells.item[startx,1+i]:=(i+x)*20;
      end;
      startx:=startx+1;
    end;

      Cell1:=sheet1.cells.item[1,1];
      Cell2:=sheet1.cells.item[startx-1,13];
      Range:=sheet1.Range[Cell1,Cell2];
      sheet1.Range[Cell1,Cell2].Columns.Borders.colorIndex:=0;
      sheet1.ChartObjects.add(0,100,700, 200)   ;
      sheet1.ChartObjects[1].Activate;
      sheet1.ChartObjects[1].Chart.charttype:=xlLineMarkers;
      sheet1.ChartObjects[1].Chart.seriescollection.ADD[Range];
      sheet1.ChartObjects[1].Chart.PlotBy:=xlRows;
 
  sheet1.ChartObjects[1].Chart.Axes(xlValue, xlPrimary).HasTitle := True;
  sheet1.ChartObjects[1].Chart.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text := 'Y';
  sheet1.ChartObjects[1].Chart.Axes(xlCategory, xlPrimary).HasTitle := True;
  sheet1.ChartObjects[1].Chart.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text := 'X';
  
      sheet1.ChartObjects[1].Chart.ChartArea.Font.Size:= 10;
//      sheet1.ChartObjects[1].Chart.HasLegend := True;
//      sheet1.ChartObjects[1].Chart.Legend.Position:= xlTop;
      sheet1.ChartObjects[1].Chart.HasTitle := false ;
     
      Sheet1.Range['A20','C20'].Columns.HorizontalAlignment:=xlCenter;
      Sheet1.Range['A20','C20'].Columns.VerticalAlignment:=xlcenter;
      Sheet1.Range['A20','C20'].Columns.WrapText := False;
      Sheet1.Range['A20','C20'].Columns.Orientation:= 0 ;
      Sheet1.Range['A20','C20'].Columns.AddIndent := False ;
      Sheet1.Range['A20','C20'].Columns.IndentLevel := 0  ;
      Sheet1.Range['A20','C20'].Columns.MergeCells := True  ;
      sheet1.Range['A20','C20'].value:='TEST';
      Sheet1.Range['A20','C20'].Columns.Borders.colorIndex:=0;

end;

6.其它

    在delphi中调用excel有四种方式,我们选取其中的一种用OleObject来装载excel工作表的方式来谈delphi控制excel的重要属性和方法。

    首先给出通过OLE创建的一些主要代码步进行简单说明:

    创建OLE对象:

    Var olecon: TOleContainer;
    Olecon:= TOleContainer.Create(self);
    Olecon.oleobject:= Olecon.CreateObject('excel.sheet',false);

    或选择导入一个excel文件来创建OLE对象:

    Olecon.oleobject:= Olecon.CreateObjectFromFile(xlsname,false);

    最好隐藏excel的几个工具条,这样就好象是嵌在你的程序中的一个表而已了:

    Olecon.OleObject.application.CommandBars['Standard'].Visible:=false;
    Olecon.OleObject.application.CommandBars['Formatting'].Visible:=false;
    Olecon.OleObject.application.CommandBars['Reviewing'].Visible:=false;

    然后显示并激活excel表,对TOleContainer定义的对象:

    Olecon.show;
    Olecon.doverb(0);

    这样基本可以了,但TOleContainer有个不好的地方,就是当你一点击其它控件是就它就失去焦点,然后就自动退出,其实并没有真的退出,只是需要你再次激活它而已,关键是当它失去焦点的时候就excel对象就不见了,可以用Timage控件把TOleContainer所在的地方有EXCEL时候的区域图片截下来骗骗用户,我们这里主要不是讲这个,就不详述了。

    下面我们就开始讲Excel_TLB中的接口的常用属性和方法,主要是针对导出和设定报表格式的一些接口元素。

    单元格的读写属性:

    olecon.OleObject.application.cells.item[1,1];
    olecon.OleObject.application.cells(1,1);
    olecon.OleObject.application.cells[1,1].Value;

    上面三种都可以对工作表的‘A1’单元进行读写。

    在delphi中对单元格(集),区域,工作表等所有对象的操作都是要Variant来实现的。

    自己的程序中选定区域赋给Range:

    Var range,sheet:Variant;
    Range:= olecon.OleObject.application.Range['A1:C3'];

    或者:

    Sheet:= olecon.OleObject.application.Activesheet;
    Range:= olecon.OleObject.application.Range[sheet.cells[1,1],sheet.cells[3,3]];

    对上面的Range合并单元格:

    Range.merge;
    Range. FormulaR1C1:='合并区';//合并后写入文本

    注意以后要读合并的单元格里面的文本就是读合并区域的左上角的那个单元格的文本

    在excel表中选定区域赋给range:

    range:=excel_grid1.OleObject.application.selection;

    拆分单元格:

    Range.unmerge;

    合并后设定单元格(集)的格式:

    Range.HorizontalAlignment:= xlCenter;// 文本水平居中方式
    Range.VerticalAlignment:= xlCenter//文本垂直居中方式
    Range.WrapText:=true;//文本自动换行
    Range.Borders.LineStyle:=1//加边框
    Range.Interior.ColorIndex:=39;//填充颜色为淡紫色
    Range.Font.name:='隶书';//字体
    Range.Font.Color:=clBlue;//字体颜色

    常用格式也就这些,以上这些对于单个单元格也适用。

    在excel表中寻找前后上下的单元格:

    Var u1,u2,u3,u4,u5:Variant;
    U1:=olecon.oleobject.application.activecell;//获取当前格;
    U2:=u1.previous;//非特殊情况就是u1左边的一格;
    U3:=ui.next;//非特殊情况就是u2右边的一格;
    U4:=olecon.oleobject.application.cells[u1.cells.row-1,u1.cells.column];//非特殊情况为上面一格
    U5:=olecon.oleobject.application.cells[u1.cells.row+1,u1.cells.column];//非特殊情况为下面一格

    删除和插入一行和一列:

    Olecon.oleobject.application.rows[2].delete;
    Olecon.oleobject.application.columns[2].delete;
    Olecon.oleobject.application.rows[2].insert;
    Olecon.oleobject.application.columns[2].insert;

    复制指定区域:

    Olecon.oleobject.application.range['A1:C3'].copy;

    从指定单元格开始粘贴:

    Olecon.oleobject.application.range['A4'].PasteSpecial;

    常用的就这些了,对delphi中server面板下的EXEL控件和创建EXCEL.Application COM对象的方式都适用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值