DELPHI中,操作word表格时,我们经常需要进行1行中的2个单元格合并与1列中的2个单元格合并.如果第1次合并1行中的2个单元格,没有问题,但是,第2次合并1行中的另外2个单元格时,运行出错:"无法访问此集合中单独的列,因为表格中有混合的单元格宽度".请问怎么解决?

解决方案 »

  1.   

    补充:我使用的是OFFICE2003,而且是先合并后面单元格,然后才合并前面单元格",所以,尽管"后面单元格的列索引会变"而与前面的单元格应该没有问题,可就是出上面的错误????????
      

  2.   

    没有相应的开发环境,(我的系统是Win7,office2007),帮楼主顶了。
      

  3.   

    尽管我的是D7,OFFICE2003,但是,原理应该差不多吧...
      

  4.   

    我刚把XP的Wrapper勾上,调调Word工作正常,先试试,好了,我把代码给您贴上来
      

  5.   

    var myRow:WordXP.Row;
      start,e:Integer;
      r:WordXP.Range;
    begin
      WordApplication1.Connect;
      WordApplication1.Visible:=True;
      WordApplication1.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam);
      WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
      //新建文档、插入表格、设置边框
      WordDocument1.Tables.Add(WordDocument1.Range,10,20,EmptyParam,EmptyParam);
      WordDocument1.Tables.Item(1).Borders.InsideLineStyle:=wdLineStyleSingle;
      WordDocument1.Tables.Item(1).Borders.OutsideLineStyle:=wdLineStyleSingle;
      r:=WordDocument1.Range;  myRow:=WordDocument1.Tables.Item(1).Rows.Item(1);
      //合并 10-13
      start:= myRow.Cells.Item(10).Range.Start;
      e:=myRow.Cells.Item(13).Range.end_;
      r.Start:=start;
      r.end_:=e;
      r.Cells.merge;
      //合并 6-8
      start:= myRow.Cells.Item(6).Range.Start;
      e:=myRow.Cells.Item(8).Range.end_;
      r.Start:=start;
      r.end_:=e;
      r.Cells.merge;
       //合并单元格  1-3
      start:= myRow.Cells.Item(1).Range.Start;
      e:=myRow.Cells.Item(3).Range.end_;
      r.Start:=start;
      r.end_:=e;
      r.Cells.merge;
      WordDocument1.Disconnect;
      WordApplication1.Disconnect;
    end;
    经测试:1.合并后索引号确实变了,合并的单元格以新的一个格起算,起始值为1
      2.2007和XP的调用没有任何区别,可直接使用
      

  6.   

        按照你的方法是通过了,谢谢last_wolf1860,回头一定给分。你是使用Delphi 7的Servers面板中提供的TWordApplication和TWordDocument组件,但是帮助中却几乎没有写它们的使用方法。
        你能不能利用OLE在Delphi7中调用Word2003多次合并单元格的例子,再写一下代码好吗?我给你加分.
      

  7.   

    例如:FWord := CreateOleObject('Word.Application');
      FDoc := FWord.Documents.Add;
    ...
    (接下来,就请你帮忙了...)
      

  8.   

    var WordApp,WordDoc,tb,R,myRow,Start,e:OleVariant;
    begin
      WordApp:=CreateOleObject('Word.application');
      WordApp.Visible:=True;
      WordApp.DOcuments.add(EmptyParam,EmptyParam,EmptyParam,EmptyParam);
      WordDoc:=WordApp.ActiveDocument;
      tb:=WordDoc.Tables.Add(WordDoc.Range,10,20,EmptyParam,EmptyParam );
      tb.Borders.InsideLineStyle:=1;//wdLineStyleSingle;
      tb.Borders.OutsideLineStyle:=1;//wdLineStyleSingle;
      r:=WordDoc.Range;
      myRow:=WordDoc.Tables.Item(1).Rows.Item(1);
      //合并 10-13
      start:= myRow.Cells.Item(10).Range.Start;
      e:=myRow.Cells.Item(13).Range.end;
      r.Start:=start;
      r.end:=e;
      r.Cells.merge;
      //合并 6-8
      start:= myRow.Cells.Item(6).Range.Start;
      e:=myRow.Cells.Item(8).Range.end;
      r.Start:=start;
      r.end:=e;
      r.Cells.merge;
      //合并单元格 1-3
      start:= myRow.Cells.Item(1).Range.Start;
      e:=myRow.Cells.Item(3).Range.end;
      r.Start:=start;
      r.end:=e;
      r.Cells.merge;  WordDoc:=null;
      WordApp:=null;
    end;
    这种东西比较讨厌的地方在于,根本没有办法在Code时就判定代码正误,只有在执行时摸石头过河:)这跟使用Server面板中的组件有天壤之别。我在写代码时也是一行一行试过来。如果您在公司的话,还是尽量建议您的领导少用CreateOleObject,开发效率巨低,到软件升级时会哭滴:),如果您是个人开发的话,直接用Server有什么不好的?我从97到2007全这么用过来,office97的代码照样兼容!
      

  9.   

    last_wolf1860老师,我还要进行cell(1,1)与CELL(2,1)列合并、cell(1,2)与CELL(2,2)列合并,按照你的方法类推失败。也请你给出代码,谢谢!
      

  10.   

    好吧,你就使用用Server组件,给我解决上述列合并的问题。谢谢!
      

  11.   

    是这样的,表格的cell(1,1)与CELL(2,1)列合并、cell(1,2)与CELL(2,2)列合并;
    cell(1,3)与CELL(1,6)行合并、cell(1,7)与CELL(1,10)行合并;
      

  12.   

    反正行列的访问你都知道了,最简单的代码如下(合并):
    var  tb:wordXP.Table;
    begin
      wordApp1.Connect;
      wordApp1.Visible:=True;
      wordApp1.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam);
      WordDoc1.ConnectTo(WordApp1.ActiveDocument);
      //新建文档、插入表格、设置边框
      tb:=WordDoc1.Tables.Add(WordDoc1.Range,10,20,EmptyParam,EmptyParam);
      WordDoc1.Tables.Item(1).Borders.InsideLineStyle:=wdLineStyleSingle;
      WordDoc1.Tables.Item(1).Borders.OutsideLineStyle:=wdLineStyleSingle;
      tb.Cell(1,1).Merge(tb.Cell(2,1));
      tb.Cell(1,6).Merge(tb.Cell(1,9));  WordDoc1.Disconnect;
      WordApp1.Disconnect;
    end;
      

  13.   

        last_wolf1860老师:此问题大体差不多解决.
        现在还有一个问题是,怎么让数据在单元格内靠左、靠右、居中,请列出代码。
        这个问题之后就散分了。
      

  14.   

    倒,你回去再好好研究一下VBA的对象模型,Word写值最重要的对象就是Range,要知道哪些对象有这个属性。
    tb.Cell(1,1).Merge(tb.Cell(2,1));
    tb.cell(1,1).Range.Text:='真逗';
    tb.Cell(1,6).Merge(tb.Cell(1,9));
    tb.Cell(1,6).Range.Text:='现在人都懒成这样了吗?';
    干嘛还要移动光标呢?直接赋值就OK!
      

  15.   

    使用“WordApplication1.Selection.ParagraphFormat.Alignment:=wdAlignParagraphRight”不起作用?
            
      

  16.   

    对齐也是在Range的基础上:tb.Cell(1,1).Range.ParagraphFormat.Alignment:=wdAlignParagraphLeft;
      

  17.   

    自己已经完成。谢谢last_wolf1860 老师!
      

  18.   

    操作Word只有在万不得己的情况下老使用Selection,效率低且不安全。所有的文档类操作全部力争获取Range
      

  19.   

    不需要加分滴:)这东西本来也不难,可能是你对Office的对象框架不熟的缘故,多玩儿几次就熟悉了