问题:我们工作所用的excel表要用到宏,宏是镶嵌在excel表里的。这个宏是用vb写的,我现在想用delphi达到同样的效果,请问可以吗?因为excel自带了vb编辑器,所以用起来很方便,但是我对delphi更加熟悉,现在不知道excel和delphi的接口是怎样的,请高手详细解答,在线等待!谢谢!

解决方案 »

  1.   

    delphi也可以的
    比如说
    //将数据导入到EXCEL中procedure TfrmPrint2.ExportDataToExcel;
    var
            i, j, k: integer;
            xxx1: string;
            xr: string;
    begin
            if frmPrint2.dstlist.items.count = 0 then
      begin
            application.messagebox('没有选择目标字段!', '管理系统', mb_iconwarning + mb_defbutton1);
            exit;
      end;
            frmPrint2.statusbar1.Panels[0].text := '正在载入Excel,请稍候......';
            frmPrint2.statusbar1.refresh;
      try
            screen.cursor := crHourGlass;
        try
          //创建EXCEL对象
          varexcel := createoleobject('excel.application');
          if not varisempty(varexcel) then
          begin
            //添加工作簿
            varexcel.workbooks.add;
            varexcel.workbooks[1].worksheets[1].name := '数据库信息';
          end;
        except
          application.messagebox('请确认是否安装Excel?', '提示信息:', mb_iconquestion + mb_defbutton1);
          exit;
        end;
        begin
          //获取数据
          getData;
          //写入列标题
          range := varexcel.workbooks[1].worksheets[1].columns;
          for i := 0 to frmPrint2.dstlist.Items.count - 1 do begin
            varexcel.workbooks[1].worksheets[1].cells[2, i + 1].value := frmPrint2.dstlist.items.strings[i];
            varexcel.workbooks[1].worksheets[1].cells[2, i + 1].Font.bold := true;
            range.columns[i + 1].columnwidth := frmPrint2.adoquery1.Fieldbyname(frmPrint2.dstlist.items.Strings[i]).Displaywidth;
            range.columns[I + 1].HorizontalAlignment := xlCenter;
          end;
          try
            try
              //循环写入数据到EXCEL中
              frmPrint2.adoquery1.First;
              j := 3;
              while not frmPrint2.adoquery1.eof do begin
                for i := 0 to frmPrint2.dstlist.Items.count - 1 do begin
                  xr := ''''+frmPrint2.adoquery1.fieldbyname(frmPrint2.dstlist.items.strings[i]).AsString;
                  varexcel.workbooks[1].worksheets[1].cells[j, i + 1].value := xr;
                end;
                frmPrint2.adoquery1.next;
                j := j + 1;
              end;
              varexcel.workbooks[1].worksheets[1].cells[j + 1, 2].value := '制表: ' + frmPrint2.edtLister.text;
              varexcel.workbooks[1].worksheets[1].cells[j + 1, 4].value := '日期: ' + frmPrint2.edtListDate.text;
            except
            end;
          finally
            frmPrint2.adoquery1.enablecontrols;
            frmPrint2.statusbar1.Panels[0].text := '';
            k := i - 1 + ord('A');
            xxx1 := chr(k);
            xxx1 := 'A2:' + xxx1 + inttostr(j - 1);
            //将数据表格画线
            range := varexcel.workbooks[1].worksheets[1].range[xxx1];
            range.borders.linestyle := xlcontinuous;
            k := i - 1 + ord('A');
            xxx1 := chr(k);
            xxx1 := 'a1:' + xxx1 + '1';
            //数据标题列居中
            range := varexcel.workbooks[1].worksheets[1].range[xxx1];
            range.HorizontalAlignment := xlCenter;
            range.VerticalAlignment := xlCenter;
            range.MergeCells := True;
            //对报表标题进行修饰
            varexcel.workbooks[1].worksheets[1].range['a1:a1'] := frmPrint2.edtPrintTitle.text;
            varexcel.workbooks[1].worksheets[1].range['a1:a1'].font.name := '楷体';
            varexcel.workbooks[1].worksheets[1].range['a1:a1'].font.size := '18';
            varexcel.workbooks[1].worksheets[1].range['a1:a1'].font.fontstyle := 'bold';
            varexcel.visible := true;
          end;
        end;
      finally
        screen.cursor := crArrow;
      end;
    end;