首先说一下我为什么会有这种需求:
    因为在我的应用中有特殊要求,把一些文档设置成每一页对应数据库中的一条记录(比如说一个文档假如有10页,那它在数据库中就有10条数据,并且不同的页的文档保存在不同记录里面),要访问时才从数据库取出来生成doc临时文件。
    我使用以下代码可以往一个doc文档插入一个页码信息(因为我一个doc文档只有一页,所以不用考虑多页的情况):
  procedure AddPageFooter(
    sFilename: String;              //文档路径
    iCurrentPage: Integer;          //当前页码
    iPageCount: Integer             //总页数
    );
  var
    m, n: OleVariant;
    doc: OleVariant;
    WordApp: Variant;
  begin
    m := wdLine;
    n := 1;
    WordApp := CreateOleObject('Word.Application');
    try
      doc := WordApp.Documents.Open(sFilename);
      WordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageFooter;
      WordApp.Selection.Move(m, n);
      WordApp.Selection.ParagraphFormat.Alignment := wdAlignParagraphRight;      WordApp.Selection.InsertAfter(Format('第%d页 / 共%d页', [iCurrentPage, iPageCount]));
      WordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;
      doc.Save;
    finally
      try
        doc.Close;
        WordApp.Quit;
      finally
        //
      end;
    end;
  end;    以上都调试通过,没有问题。但是后来又提出了新的需求:要导出不连续的若干页内容,目的是先打印其中的一部分内容。我把所选的内容都导出为临时文件之后,用以下方式合并:
  WordApp.Documents.Open(SaveDialog1.FileName);
  for i := 1 to iSelectedCount do
  begin
    if (i > 1) then
      WordApp.Selection.InsertBreak(wdPageBreak);
    WordApp.Selection.InsertFile(sFilePath + IntToStr(i) + '_.doc');
  end;
  WordApp.ActiveDocument.Save;    但是问题出现了:每一页的显示页码的那个位置显示的都是第一页的信息。比如说我第一页是“第1页/共10页”,那后面每一页显示的都是这个字符串。
    我又试过这样测试,在word中使用“插入页码”的方式(不是用代码)设置几个doc文档,然后把这些文档用上述方式合并,结果发现,页码是根据第一页的页码,后面的自动递增的,没办法显示不连续的数字页码。    我的问题是:有没有办法改进插入页码的函数或者改进合并文档的方式,使它合并后页码那个位置显示的字符串(不一定是页码)不会因为合并而发生变化?

解决方案 »

  1.   

    上面的看的不是很明白,不太理解你的意思。AddPageFooter(
        sFilename: String;              //文档路径
        iCurrentPage: Integer;          //当前页码
        iPageCount: Integer             //总页数
        );
    你每次插入文档的时候,更新这几个参数不就行了吗?
      

  2.   

    给你提供思路:
    word文档有节的概念,不同的节,可以有不同的起始页码。你不分节,当然达不到不连续页码的要求。
    所以,建议插入分节符,然后就能设置不同的起始页码了。
      

  3.   

    节的集合(对象)是Sections(Section)
      

  4.   

    呵呵,这个示例更有针对性了:可用 PageNumbers 属性返回 PageNumbers 集合。下例将活动文档的第一节首页码设为 3。ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary) _
        .PageNumbers.StartingNumber = 3
      

  5.   

    to konhon(优华无限): 我的AddPageFooter是对一个只有一页的文档进行操作的,实际效果也能满足我的要求。但是问题出在我把多个这样处理后的文档合并成一个之后,原来设置的东西都乱了。请详细看我前面的描述。上次我的《如何在Delphi中控制在Word中插入新文档时另起一页?》就是你提供了思路给我,感谢你的再次关注。
        还有,你上次所说的“vba参考资料可以直接看Word的帮助”,恕我愚钝,我找了半天还是没有找到,能说一下具体是哪个章节么?:(to 严黎斌(): 谢谢你提供的思路,我再看看。
      

  6.   

    使用节,通过节,可以实现一个文档横排竖排以及设置页眉页角。以前做过。BreakType:OleVariant ;
    BreakType:=wdSectionBreakContinuous; 加节不另起一页 
    WordA.Selection.InsertBreak(BreakType); //加入一节。
    WordDocument1.Sections.Item(J+1).PageSetup. //页面设置。其他可以参考VBA的帮助,安装office的时候带有。大概10M。
      

  7.   

    你要看你自己安装Office时是否安装的VBA的帮助!看代码“可以通过录制‘宏’”来实现,在“工具”菜单下,我对'Word'操作不太熟,你可以用楼上的”节“试试看。
      

  8.   

    修改一行代码就可以了,呵呵        for i := 1 to iSelectedCount do
            begin
              if (i > 1) then
                WordApp.Selection.InsertBreak(wdSectionBreakContinuous);
                //这个地方我原来传的参数值为wdPageBreak,改完之后ok          WordApp.Selection.InsertFile(sFilePath + IntToStr(i) + '_.doc');
            end;
      

  9.   

    这个地方是过年前做的,比较匆忙,没有怎么测试过,这两天有空拿出来看的时候才发现有问题。其实当时是结合InsertBreak(wdPageBreak);来完成的,但是出来的效果仍然有bug。比如说,我合并的文档的页码分别是:第一页、第二页、第三页,结果合并出来的文档的三页在页脚处依次显示的是:
    [空白]
    第一页
    第二页
        就是说,wdSectionBreakContinuous参数是把当前页的页脚的内容应用到下一页去了。不得已,重装了Office并安装了相关的帮助(之前Word有问题,打不开帮助。安装时把word相关的帮助全部安装),在帮助目录中“与编程有关的信息”中找到了vba的相关帮助,再次修改代码如下:
            for i := 1 to iSelectedCount do
            begin
              if (i > 1) then
                WordApp.Selection.InsertBreak(wdSectionBreakNextPage);
                //这个参数的意义应该是另起新页(没有看到关于这些参数的说明)          WordApp.Selection.InsertFile(sFilePath + IntToStr(i) + '_.doc');
            end;