如何定位表格的Top,Left?

解决方案 »

  1.   

    VAR
      WordParagraph,WordApp,WordRange : olevariants;  WordParagraph := WordApp.activedocument.paragraphs.add;
      WordRange := WordParagraph.range;
      WordRange := WordApp.ActiveDocument.Content;
      WordRange.Collapse(wdCollapseEnd);
      WordTable:= WordApp.activedocument.tables.add(WordRange,5,5);要多次插入表格,每一次加入这段代码即可
      

  2.   

    给个例子
    打印TDBGridEh当前显示的内容
    基于TDBGridEh控件的格式和内容,自动在文档中的sBookMark书签处生成Word表格
    目前能够支持单元格对齐、多行标题(两行)、底部合计等特性
    sBookMark:Word中要插入表格的书签名称
    }
    function PrnWordTable(var dbG:TDBGridEh;sBookMark:String=''):boolean;
    var iCol,iLine,i,j,k:Integer;
        wTable,wRange:Variant;
        iRangeEnd:longint;
        iGridLine,iTitleLine:Integer;
        getTextText:String;getTextDisplay:boolean;
        titleList:TStringList;titleSplit,titleCol:Integer;lastTitleSplit,SubTitle:Integer;lastTitle:String;
    begin
      result:=false;
      try
        //计算表格的列数(不包括隐藏的列)
        iTitleLine:=1;  //始终默认为1
        iCol:=0;
        for i:=0 to dbG.Columns.Count-1 Do
        begin
          if dbG.Columns[i].Visible then
          begin
            iCol:=iCol+1;
          end;
        end;
        //计算表格的行数(不包括隐藏的列)
        if dbG.DataSource.DataSet.Active then
          iLine:=dbG.DataSource.DataSet.RecordCount
        else
          iLine:=0;
        iGridLine:=iLine+iTitleLine+dbG.FooterRowCount;
        //定位插入点
        if sBookMark='' then
        begin
          //在文档末尾
          iRangeEnd:=wDoc.Range.End-1;
          if iRangeEnd<0 then iRangeEnd:=0;
          wRange:=wDoc.Range(iRangeEnd,iRangeEnd);
        end else begin
          //在书签处
          wRange:=wDoc.Range.Goto(wdGoToBook,,,sBookMark);
        end;
        wTable:=wDoc.Tables.Add(wRange,iGridLine,iCol);
        wTable.Columns.AutoFit;
        //标题行
        k:=1;
        for j:=1 to dbG.Columns.Count Do
        begin
          if dbG.Columns[j-1].Visible then
          begin
            if dbG.UseMultiTitle then
            begin
              titleList:=strSplit(dbG.Columns[j-1].Title.Caption,'|');
              wTable.Cell(1,k).Range.InsertAfter(titleList.Strings[0]);
            end else
              wTable.Cell(1,k).Range.InsertAfter(dbG.Columns[j-1].Title.Caption);
            //设置单元格对齐方式
            if dbG.Columns[j-1].Title.Alignment=taCenter then
              wTable.Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphCenter
            else if dbG.Columns[j-1].Title.Alignment=taRightJustify then
              wTable.Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphRight
            else if dbG.Columns[j-1].Title.Alignment=taLeftJustify then
              wTable.Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphJustify;
            k:=k+1;
          end;
        end;
        //填写每一行
        if iLine>0 then
        begin
          dbG.DataSource.dataset.DisableControls;
          dbG.DataSource.DataSet.First;
          for i:=1 to iLine Do
          begin
            k:=1;
            for j:=1 to dbG.Columns.Count Do
            begin
              if dbG.Columns[j-1].Visible then
              begin
                if dbG.Columns[j-1].FieldName<>'' then //避免由于空列而出错
                begin
                  //如果该列有自己的格式化显示函数,则调用显示函数获取显示串
                  getTextText:='';
                  if Assigned(dbG.DataSource.DataSet.FieldByName(dbG.Columns[j-1].FieldName).OnGetText) then
                  begin
                    dbG.DataSource.DataSet.FieldByName(dbG.Columns[j-1].FieldName).OnGetText(dbG.DataSource.DataSet.FieldByName(dbG.Columns[j-1].FieldName),getTextText,getTextDisplay);
                    wTable.Cell(i+iTitleLine,k).Range.InsertAfter(getTextText);
                  end else begin
                    //使用数据库内容显示
                    wTable.Cell(i+iTitleLine,k).Range.InsertAfter(dbG.DataSource.DataSet.FieldByName(dbG.Columns[j-1].FieldName).AsString);
                  end;
                end;
                //设置单元格对齐方式
                if dbG.Columns[j-1].Alignment=taCenter then
                  wTable.Cell(i+iTitleLine,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphCenter
                else if dbG.Columns[j-1].Alignment=taRightJustify then
                  wTable.Cell(i+iTitleLine,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphRight
                else if dbG.Columns[j-1].Alignment=taLeftJustify then
                  wTable.Cell(i+iTitleLine,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphJustify;
                k:=k+1;
              end;
            end;
            dbG.DataSource.DataSet.Next;
          end;
        end;
        //结尾行
        for i:=1 to dbG.FooterRowCount Do
        begin
          k:=1;
          for j:=1 to dbG.Columns.Count Do
          begin
            if dbG.Columns[j-1].Visible then
            begin
              wTable.Cell(iLine+1+i,k).Range.InsertAfter(dbG.GetFooterValue(i-1,dbG.Columns[j-1]));
              //设置单元格对齐方式
              if dbG.Columns[j-1].Footer.Alignment=taCenter then
                wTable.Cell(iLine+1+i,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphCenter
              else if dbG.Columns[j-1].Footer.Alignment=taRightJustify then
                wTable.Cell(iLine+1+i,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphRight
              else if dbG.Columns[j-1].Footer.Alignment=taLeftJustify then
                wTable.Cell(iLine+1+i,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphJustify;
              k:=k+1;
            end;
          end;
        end;
        //处理多行标题
        if dbG.UseMultiTitle then
        begin
          //先分割单元格,再逐个填入第二行
          k:=1;
          titleCol:=1;
          lastTitleSplit:=1;
          SubTitle:=0;
          lastTitle:='';
          for j:=1 to dbG.Columns.Count Do
          begin
            if dbG.Columns[j-1].Visible then
            begin
              titleList:=strSplit(dbG.Columns[j-1].Title.Caption,'|');
              if titleList.Count>1 then
              begin
                //处理第二行以上的内容
                wTable.Cell(1,k-SubTitle).Range.Cells.Split(titleList.Count,1,false);
                for titleSplit:=1 to titleList.Count-1 Do
                begin
                  wTable.Cell(titleSplit+1,titleCol).Range.InsertAfter(titleList.Strings[titleSplit]);
                end;
                titleCol:=titleCol+1;
                //处理第一行合并
                if (lastTitleSplit=titleList.Count) and (lastTitle=titleList.Strings[0]) then
                begin
                  //内容相同时,合并单元格
                  wTable.Cell(1,k-SubTitle).Range.Copy;
                  wRange:=wDoc.Range(wTable.Cell(1,k-SubTitle-1).Range.Start,wTable.Cell(1,k-SubTitle).Range.End);
                  wRange.Cells.Merge;
                  wRange.Paste;
                  SubTitle:=SubTitle+1;
                end;
              end;
              lastTitle:=titleList.Strings[0];
              lastTitleSplit:=titleList.Count;
              titleList.Clear;titleList.Free;
              k:=k+1;
            end;
          end;
        end;
        //自动调整表格
        wTable.AutoFitBehavior(1);//根据内容自动调整表格wdAutoFitContent
        wTable.AutoFitBehavior(2);//根据窗口自动调整表格wdAutoFitWindow
        result:=true;
      except
        result:=false;
      end;
      try
        dbG.DataSource.dataset.EnableControls;
      except
      end;
    end;