我在Word文档中操作表格时遇到这样一个问题:
  当把Word文档置为可视时,在表格中的用MoveDown移动位置时,能正确执行。
如果把Word文档置为不可视时,则在表格中用MoveDown移动位置时,没有反应。
而用MoveLeft、 MoveRight等移动时没有任何问题!
代码如下:
   MsAppl.visible := false;
   for i := 0 to FTiltles.Count -1 do
   begin
     TempSerialNum := StrToInt(FSerialNum.Strings[i]);
     MsTable.Cell(1,TempSerialNum).Range.Text := FTiltles.Strings[i]
     //合并第一、二列
     MsAppl.Selection.MoveDown(wdline, 1, wdExtend);
     MsAppl.Selection.Cells.Merge;   //合并 
   end;    这段语句:MsAppl.Selection.MoveDown(wdline, 1, wdExtend);没有发生作用。
不知各位兄弟有何高见!  见者有分!!!!!!!

解决方案 »

  1.   

    现在问题主要出现Visible=true时,没有任何问题。
    但visible=false时,就不行。这是什么问题?
      

  2.   

    不可视方式下,能否获得焦点呢?
    建议去看看word2000.pas中此部分的源码,看是否真的是焦点的问题
      

  3.   

    但我在word xp上使用则不会出现上述情况。
    在word 2000上就有问题,不知是什么情况导致的!
      

  4.   

    关注,前一段时间在忙着操作excel 表,
    现在想学习怎么来操作word ,谢谢各位 请多指教!~~~
      

  5.   

    var WordApp: TWordApplication;
        WordDoc: TWordDocument;
        myCol:Column;
        iStart,iEnd:integer;
    (1) 创建并打开Word文件  ==>WordApp ,WordDoc
    (2) WordDoc.ConnectTo(WordApp.Documents.Item(1));  iStart:=WordDoc.Tables.Item(i).Cell(1,1).Range.Start;
      myCol:= WordDoc.Tables.Item(i).Columns.Item(2);
      iEnd:=myCol.Cells.Item(myCol.Cells.Count).Range.End_;
      //合并第一、二列
      myRange:=WordDoc.Range;
      myRange.Start:=iStart;
      myRange.End_ :=iEnd;
      myRange.Cells.Merge;(3) 释放 WordApp ,WordDoc
      

  6.   

    iStart:=WordDoc.Tables.Item(1).Cell(1,1).Range.Start;  //第 1 个表 Cell[1,1]
      myCol:= WordDoc.Tables.Item(1).Columns.Item(2);        //第 1 个表 第 2 列
      iEnd:=myCol.Cells.Item(myCol.Cells.Count).Range.End_;
      //合并第一、二列
      myRange:=WordDoc.Range;
      myRange.Start:=iStart;
      myRange.End_ :=iEnd;
      myRange.Cells.Merge;
      

  7.   

    1、执行下述代码时报错: 
       MsAppl.Selection.Cells.Merge;   //合并2、错误提示:project PrjCheckManage raised EOleException with message'此命令无效'.
       process stopped. use step or run to continue.3、此段代码只有在word2000中出错,而在word xp中完全正常。如果在word2000中     
       MsAppl.visible := true;则不错,MsAppl.visible := false出错。欢迎各位兄弟指教!!1!1 
      

  8.   

    下面我测试过,没错
    uses word97;procedure MergerCells;
    var WordApp: TWordApplication;
        WordDoc: TWordDocument;
        myCol:Column;
        iStart,iEnd:integer;
        DocInx,oFileName,CfCversions,oReadOnly,AddToRctFiles,PswDocument,
        PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat: OleVariant;
        myRange:Range;
    begin    if not Assigned(WordApp) then                          // ===== 创建对象 =====
        begin
          WordApp:= TWordApplication.Create(nil);
          WordApp.Visible := false;
        end;
        if not Assigned(WordDoc) then
          WordDoc:= TWordDocument.Create(nil);
      try
        DocInx:=1;
        oFileName := 'd:\test1.doc';
        oReadOnly:=false;
        CfCversions := EmptyParam;
        AddToRctFiles:= EmptyParam;
        PswDocument:= EmptyParam;
        PswTemplate:= EmptyParam;
        oRevert:= EmptyParam;
        WPswDocument:= EmptyParam;
        WPswTemplate:= EmptyParam;
        oFormat:= EmptyParam;                                  // ===== 打开文件 =====
        WordApp.Documents.open(oFileName,CfCversions,oReadOnly,AddToRctFiles,PswDocument,
                               PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat);    WordDoc.ConnectTo(WordApp.Documents.Item(DocInx));     // ===== 关联文件 =====
      iStart:=WordDoc.Tables.Item(1).Cell(1,1).Range.Start;   //第1个表Cell[1,1]
      myCol:= WordDoc.Tables.Item(1).Columns.Item(2);         //第1个表第二列
      iEnd:=myCol.Cells.Item(myCol.Cells.Count).Range.End_;
      //合并第一、二列
      myRange:=WordDoc.Range;
      myRange.Start:=iStart;
      myRange.End_ :=iEnd;
      myRange.Cells.Merge;  WordDoc.SaveAs;  finally
        if Assigned(WordDoc) then                           // ===== 关闭文件 =====
        begin
          WordDoc.Close;
          WordDoc.Disconnect;
          WordDoc.Destroy;
          WordDoc := nil;
        end;
        if Assigned(WordApp) then                           // ===== 关闭Word =====
        begin
          WordApp.Quit;
          WordApp.Disconnect;
          WordApp.Destroy;
          WordApp := nil;
        end;
      end;end;
      

  9.   

    WordApp.Visible := false;
    上面我测试过,没错误给分 ^_^
      

  10.   

    1、你操作的是word2000还是word97?2、我也是在word2000上才出问题。在XP下是正确的!3、我现在用的是Ole操作word,不是delphi自带的控件。4、我操作表的格式是这样的:
    |------|-------|----------------------------|-----------------|
    |      |       |        测定结果            |     规范要求    |
    |项目  |单位   |------|------|-------|------|-----------------|
    |      |       |   A  |   B  |   C   |   D  |                 |
    |------|-------|------|------|-------|------|-----------------|
    |      |       |      |      |       |      |                 |     
    |------|-------|------|------|-------|------|-----------------|
    |      |       |      |      |       |      |                 |      
    |------|-------|------|------|-------|------|-----------------|5、问题出现在合并“项目”栏时不行。十分感谢LuckyJan(小虾无招)兄弟,我也试了一下你的方法。是可行的。呆会散分。
      

  11.   

    合并代码如下://建立一多表头的表;
    function TLabel.CreateTwoHeadTable(IsVisible: Boolean): Boolean;
    var
      i, cols, iCount, TempMovePos, k: Integer;
      TempColWidth: Double;
      TempSerialNum, TempAlign: Integer;
      MsVersion: String;
    begin
      //----------------------1、新建一个word文档--------------------------------------
      try
        MsAppl := CreateOleObject('Word.Application');
        MsVersion := MsAppl.Version;
        //MsAppl.visible := IsVisible;
        //新建一个Word文档
        MsAppl.Documents.add;
        //MsAppl.WindowState[wdWindowStateMinimize];  //最小化WORD文档
      except
        Result := false;
        MsAppl.quit;
        Abort;
      end;  //如果不是word2000或word XP,则给予提示并退出操作。
      if (MsVersion <> '10.0') and (MsVersion <> '9.0') then
      begin
        ShowMessage('Word的版本不是最新版本, 请安装Word2000或Word XP!');
        Result := false;
        MsAppl.quit;
        exit;
      end;  //因为word2000如果为显示状态,操作存在问题.
      if MsVersion = '9.0' then
        MsAppl.visible := true
      else
        MsAppl.visible := IsVisible;  //------------------2、新建一个表格------------------------------------------
      cols := 0;
      iCount := 0;  //用来记录往第一行插入多少标题
      Cols := FColumens.Count;
      MsAppl.ActiveDocument.Tables.Add(MsAppl.ActiveDocument.Range(0,0),3,Cols);
      MsTable := MsAppl.ActiveDocument.Tables.Item(1);  //-----------------3、去除掉表的竖线-----------------------------------------
      MsTable.Select;    //选中全表
      //把表格的竖线及中间的横线去掉;
      MsTable.Borders.item(wdBorderLeft).LineStyle := wdLineStyleNone;
      MsTable.Borders.Item(wdBorderRight).LineStyle := wdLineStyleNone;
      //设置表格顶上线
      MsTable.Borders.Item(wdBorderTop).LineStyle := wdLineStyleSingle;
      MsTable.Borders.item(wdBorderTop).LineWidth := wdLineWidth050pt;
      MsTable.Borders.item(wdBorderTop).Color := wdColorAutomatic;
      //设表格底线
      MsTable.Borders.item(wdBorderBottom).LineStyle := wdLineStyleSingle;
      MsTable.Borders.item(wdBorderBottom).LineWidth := wdLineWidth050pt;
      MsTable.Borders.item(wdBorderBottom).Color := wdColorAutomatic;
      //设中间横线
      MsTable.Borders.item(wdBorderHorizontal).LineStyle := wdLineStyleSingle;
      MsTable.Borders.item(wdBorderHorizontal).LineWidth := wdLineWidth050pt;
      MsTable.Borders.item(wdBorderHorizontal).Color := wdColorAutomatic;
      //设表两侧线
      MsTable.Borders.item(wdBorderVertical).LineStyle := wdLineStyleNone;
      MsTable.Borders.item(wdBorderDiagonalDown).LineStyle := wdLineStyleNone;
      MsTable.Borders.item(wdBorderDiagonalUp).LineStyle := wdLineStyleNone;
      MsTable.Borders.Shadow := False;
      //设线的属性
      MsAppl.Options.DefaultBorderLineStyle := wdLineStyleSingle;
      MsAppl.Options.DefaultBorderLineWidth := wdLineWidth050pt;
      MsAppl.Options.DefaultBorderColor := wdColorAutomatic;
      //标题中间对齐
      MsAppl.Selection.MoveUp(wdLine, 1);                          //定位第一行第一列
      MsAppl.Selection.MoveDown(wdLine, 1, wdExtend);               //移到第二行第一列
      MsAppl.Selection.MoveRight(wdCharacter, cols, wdExtend);      //选中第一、二行
      MsAppl.Selection.ParagraphFormat.Alignment := wdAlignParagraphCenter;  //设第一行为中间对齐;
      MsAppl.Selection.Cells.VerticalAlignment := wdCellAlignVerticalCenter;  //行居中
      MsAppl.Selection.MoveLeft(wdCharacter, 1);                  //回到第一行第一列  //------------------4、合并检验结果列并插入标题-------------------------------
      //合并检验结果列
      MsAppl.Selection.MoveRight(wdCharacter, FStart - 1);                //移到要合并的起始位置
      MsAppl.Selection.MoveRight(wdCharacter, FEnd-FStart + 1, wdExtend); //选中要合并的列
      MsAppl.Selection.Cells.Merge;                            //合并
      MsAppl.Selection.Range.Text := FCheckTitle;              //合并检验结果行
      MsAppl.Selection.MoveLeft(wdCharacter, FStart - 1);      //移回第一行第一列  
      
      //------------------5、插入列标题及合并列-------------------------------------
      for i := 0 to FTiltles.Count -1 do
      begin
        TempSerialNum := StrToInt(FSerialNum.Strings[i]);
        //-----------如果TempSerialNum在FStart至FEnd之间,则标题放入第二行----------
        if (TempSerialNum >= FStart) and (TempSerialNum <= FEnd) then
        begin
          if FTiltles.Strings[i] = '该列标题为空' then
          begin
            if MsVersion = '10.0' then      //如果是wordXP
              MsTable.Cell(2, TempSerialNum).Range.Text := ''
            else if MsVersion = '9.0' then  //如果是word2000
              MsTable.Cell(2, TempSerialNum - iCount).Range.Text := '';
          end
          else begin
             if MsVersion = '10.0' then      //如果是wordXP
              MsTable.Cell(2, TempSerialNum).Range.Text := FTiltles.Strings[i]
            else if MsVersion = '9.0' then  //如果是word2000
              MsTable.Cell(2, TempSerialNum - iCount).Range.Text := FTiltles.Strings[i];  
          end
        end    //-------------------否则标题插入第一行,并合并第一、二行-------------------
        else begin
          iCount := iCount + 1;   //每插入一次记数器加1
          if TempSerialNum > FEnd then
          begin
            if FTiltles.Strings[i] = '该列标题为空' then
              MsTable.Cell(1,TempSerialNum-(FEnd-FStart)).Range.Text := '' //检验结果行合并后被认为为1行
            else
              MsTable.Cell(1,TempSerialNum-(FEnd-FStart)).Range.Text := FTiltles.Strings[i];//检验结果行合并后被认为为1行
          end
          else begin
            if FTiltles.Strings[i] = '该列标题为空' then
              MsTable.Cell(1,TempSerialNum).Range.Text := ''
            else
               MsTable.Cell(1,TempSerialNum).Range.Text := FTiltles.Strings[i];
          end;       
          //合并第一、二列
          MsAppl.Selection.MoveRight(wdCell);     //全选二行,因为可能会出现一个单元有多行字符,所以采用下列代码
          MsAppl.Selection.MoveLeft(wdCell);
          MsAppl.Selection.MoveDown(wdline, 1, wdExtend);
          MsAppl.Selection.Cells.Merge;   //合并
        end;
      end;
      //-----------------------------设表的宽及对齐方式-----------------------------
      MsAppl.Selection.MoveDown(wdLine, 1);             //移到第二行
      MsAppl.Selection.MoveLeft(wdCharacter, TempSerialNum - 1); //移到第三行第一列
      for i := 0 to FTiltles.Count -1 do
      begin
        //-------------------初始化数据----------------------------
        TempColWidth := 0;
        TempSerialNum := 0;
        TempAlign := 0;
        TempMovePos := 0;
        if FAlign.Strings[i] = '+' then         //左对齐
          TempAlign := 3
        else if FAlign.Strings[i] = '-' then    //右对齐
          TempAlign := 2
        else if FAlign.Strings[i] = '|' then    //中间对齐
          TempAlign := 1;
        TempColWidth := StrToFloat(FWidths.Strings[i]);  //取出标题要插入的列
        TempSerialNum := StrToInt(FSerialNum.Strings[i]);
        //设置宽度及对齐方式
        if i = 0 then
        begin
          MsAppl.Selection.ParagraphFormat.Alignment := TempAlign;
          MsAppl.Selection.Columns.PreferredWidth := 28.3*TempColWidth;
        end
        else begin
          TempMovePos := StrToInt(FSerialNum.Strings[i-1]);        //磅与厘米之间的转换,设置列的宽度
          MsAppl.Selection.MoveRight(12, TempSerialNum-TempMovePos, 1);
          MsAppl.Selection.ParagraphFormat.Alignment := TempAlign;
          MsAppl.Selection.Columns.PreferredWidth := 28.3*TempColWidth;
        end;
      end;       
      Result := true;
    end;