Delphi常用的Excel操作

以下是我在Delphi中用过的Excel操作

ExlApp:=CreateOLEObject('Excel.Application'); //创建对象
ExlApp.Visible :=False;// True;   //是否显示
ExlApp.DisplayAlerts := False;  //是否显示警告
ExlApp.Caption:=aTitle;   //设置标题

ExlApp.Workbooks.Open(FileName);      // 打开文件
ExlApp.Workbooks[1].Sheets[1].Activate ;  //设置哪个工作表为激活状态

ExlApp.Workbooks[1].Title:='报价单';


将行、列数转为坐标名,如 1行3列 转换成 C1
  sTemp:=Char(iCol+64);
  Result:=Format('%s%d',[sTemp,iRow]);

//---------------------------------------合并相同的列

iStart:=iDataStart;  //从第几行开始
  iCount:=0;  //要合并的数量
  for i:=iDataStart to ExlApp.ActiveSheet.UsedRange.Rows.Count do //逐行找相同的列
  begin
    sValue:=Trim(VarToStr(ExlApp.ActiveSheet.Cells[iStart,iIndex].Value)); //起始行的值
    sTemp:=Trim(VarToStr(ExlApp.ActiveSheet.Cells[i,iIndex].Value));//当前行的值
    sNO:=ExlApp.ActiveSheet.Cells[i,1].Value;
    if (sValue <> sTemp) then  //发生变化,要合并前面的列
    begin
      R1:=GetCellName(iStart,iIndex);
      R2:=GetCellName(i-1,iIndex);  //i-1就是合并之前的行,这行不算

      ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Merge; //合并行
      ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Borders[1].Weight := 2; //设框格线
      ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Borders[2].Weight := 2;
      ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Borders[3].Weight := 2;
      ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Borders[4].Weight := 2;
      iStart:=i;
      iCount:=1;
    end
    else if (TryStrToInt(sNO,iTemp)) and (iTemp>0) then
    begin
      Inc(iCount);  //如果起始和当前的值相同,要合并的数量增加
    end;

  end;
  if iCount>0 then //最后还有要合并的,继续合并
  begin
    R1:=GetCellName(iStart,iIndex);
    R2:=GetCellName(iStart+iCount-1,iIndex);
    ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Merge;    //R1和R2之前的CELL进行合并
    ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Borders[1].Weight := 2;   //设框格线
    ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Borders[2].Weight := 2;
    ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Borders[3].Weight := 2;
    ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Borders[4].Weight := 2;
  end;

ExlApp.ActiveSheet.columns[i].Hidden:=True;   //隐藏列

ExlApp.ActiveSheet.Columns[i].Delete;  //删除列

ExlApp.ActiveSheet.Cells[4,2].Value:=FieldByName('cCusName').AsString; //赋值
sTemp:=ExlApp.ActiveSheet.Cells[iDataStart,1].Value; //取值

ExlApp.ActiveSheet.Cells[5,10].NumberFormat:='@';//设置单元格的格式,这是文字型
ExlApp.ActiveSheet.Cells[5,10].NumberFormat:='#0.####';//设置单元格的格式,这是数字型
ExlApp.ActiveSheet.Cells[5,10].NumberFormat:='$#0.####';//设置单元格的格式,这是货币型

ExlApp.ActiveSheet.Columns[11].EntireColumn.AutoFit; //自动调整列宽

ExlApp.ActiveSheet.Rows[3].Insert; //插入一行

ExlApp.ActiveSheet.UsedRange.Rows.Count //总行数,列也一样

//---------------------------------------图片操作

var
  vStream:TADOBlobStream;
  sCol,tmpFile,vPicType,R1:string;
  i,iCol:Integer;
  picture,workRange : OleVariant;
  vName:string;

begin
vStream:=TADOBlobStream.Create(TBlobField(Query001_2.FieldByName('Pics')),bmRead); 将图片数据写入流
if vStream.Size=0 then //没图片数据
begin
  exit;
end;
    vPicType:=CheckImgType(vStream);  //判断图片类型
    vStream.Position:=0;  //指向流的开头
    tmpFile:=GV_TempPath+PubData1.GetGUIDString+'.'+vPicType;  //生成临时文件名
    TBlobField(Query001_2.FieldByName('Pics')).SaveToFile(tmpFile); //流数据保存到临时文件里
    ExlApp.ActiveSheet.Columns[iCol].ColumnWidth :=15;  //设置列宽
    R1:=GetCellName(iRow,iCol);
    workRange:= ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R1])]; //设定范围,此处只是一格
    workRange.Select;
    picture := ExlApp.ActiveSheet.Shapes.AddPicture(tmpFile,true,true,workRange.left + 1,workRange.top + 1,workRange.width - 2,workRange.height - 2); //插入图片,前面2个true不知道有什么用,后面分别是left,top,width,height

    picture := Unassigned;  //释放
    workRange:=Unassigned;
    DeleteFile(tmpFile);  //删除临时文件
    vStream.Free;

try
      iTemp:=1; //从第1个算起

      for i:=1 to 10000 do  //因为无法访问shapes的数量,所以这里设大点
      begin
        if VarIsEmpty(ExlApp.ActiveSheet.Shapes.Item(iTemp)) then //判断第N个存在就删除
        begin
          Inc(iTemp);
          Break;
        end else
        begin
          if ExlApp.ActiveSheet.Shapes.Item(iTemp).Width<500 then  //这是自己定义的删除条件
          begin
            ExlApp.ActiveSheet.Shapes.Item(iTemp).Delete; //删除第N个,后面的就会变成第N个,如此循环
          end else
            inc(iTemp);  //不用删除就判断第N+1个
        end;

      end;
    except

    end;

end;

//---------------------------------------退出
try
    ExlApp.WorkBooks.Close;  //关闭工作薄
    ExlApp.Quit;    //退出
    ExlApp:=unassigned;  //关闭线程,不然在任务表里还会存在
    Result:=True;
  except
    Result:=False;
  end;


 

猜你喜欢

转载自blog.csdn.net/victor_yang/article/details/86570334
今日推荐