在写插入wps文档的页码时,原以为简单的事情,随着录制宏变得有些扑朔迷离。

为了插入奇偶页不同的页码,我尝试用录制宏的方式,看系统是怎么设置的。

结果得到以下代码。

/**
 * Macro1 Macro
 * 宏由 user 录制,时间: 2022/12/26
 */
function Macro1()
{
    Selection.SetRange(1, 1);
    ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter;
    Selection.SetRange(5, 5);
    (obj=>{
        obj.Shapes.AddTextbox(msoTextOrientationHorizontal, 0, 0, 144, 144, ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).Range);
        (obj=>{
            obj.Fill.Visible = msoFalse;
            obj.Line.Visible = msoFalse;
            (obj=>{
                obj.AutoSize = 1;
                obj.WordWrap = 0;
                obj.MarginLeft = 0;
                obj.MarginRight = 0;
                obj.MarginTop = 0;
                obj.MarginBottom = 0;
                obj.Orientation = msoTextOrientationHorizontal;
            })(obj.TextFrame);
            obj.RelativeHorizontalPosition = wdRelativeHorizontalPositionMargin;
            obj.Left = -999993;
            obj.RelativeVerticalPosition = wdRelativeVerticalPositionParagraph;
            obj.Top = 0;
            obj.WrapFormat.Type = wdWrapNone;
            (obj=>{
                obj.Text = "— X —";
                obj.Fields.Add(ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).Shapes.Item(1).TextFrame.TextRange, wdFieldPage, "", true);
            })(obj.TextFrame.TextRange);
        })(obj.Shapes.Item(1));
        obj.PageNumbers.NumberStyle = wdPageNumberStyleArabic;
    })(ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary));
    ActiveWindow.ActivePane.VerticalPercentScrolled = 8;

}

直接运行,却报错了!!!

录下来的宏不能用!!!♣  那要怎么玩嘛,还得帮wps查错??

经过分析代码,页码是以文框的形式插入的。代码中:

(obj.Shapes.Item(1)
指的是第一次插入的文本框,再执行一次,插入的这个文本框编号就是2了(因为原来的那个我没有删除),而程序还去处理第一个插入的文本框,所以,好像是错了。
于是,在第1个” (obj=>{" 下面一行的行首加上: "let myPag1 =" 变成
let myPag1 = obj.Shapes.AddTextbox(msoTextOrientationHorizontal, 0, 0, 144, 144, ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).Range);

下面对应修改两处:

ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).Shapes.Item(1).TextFrame.TextRange, wdFieldPage, "", true);

划线部分修改为:myPag1

})(obj.Shapes.Item(1)); //划线部分修改为 myPag1
这样修改后,程序处理的,就都是新建的这个文本框了。但问题仍然存在。

页码两边的横线不会出来!?!!!!??
期间,各种上网查找,各种看wps开发文档,各种重新录制宏。不行。出不来。最后,分析认为,还是因为录制宏未录制全面。有一部分东西没录到。
网络上有位jw8800 的网友也问过这个问题,但没有人回答。我尝试自己来处理。
仔细下来研究录制的代码,插入页码最关键的一句是:
(obj=>{
       obj.Text = "— X —";
       obj.Fields.Add(ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).Shapes.Item(1).TextFrame.TextRange, wdFieldPage, "", true);
 })(obj.TextFrame.TextRange);

为什么两边的线会不见了?因为第二句插入的时候,是直接向整个文本框插入的,相当于全部改写了文本框的内容,所以,文本框内,就只剩下一个页码了,没有了其他的一字线和空格。

那其实要解决也就简单了,不直接改写文本框的内容,改写第3个字符内容就行了。(黄色部分按上面说的改,加上绿色部分)绿色部分代码的意思,就是第三个字符而已。

(obj=>{
       obj.Text = "— X —";
       obj.Fields.Add(myPag1.TextFrame.TextRange.Characters.Item(3), wdFieldPage, "", true);
    obj.Font.Name = "宋体";
    obj.Font.Size = 14;
 })(obj.TextFrame.TextRange);

 

然后,运行。两边的横线出来了。顺便加了两句:

obj.Font.Name = "宋体";
obj.Font.Size = 14;

剩下来的工作,一是在插入前,要先删除页码。照样先录制宏。得到这么一句。

ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).Range.ShapeRange.Shapes.Item("TextBox 6").Delete();

开始计划怎么样枚举页脚的文本框进行删除,弄了半天也不太好操作。直到。。。。

ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).Range.ShapeRange.Delete();

呃,就这个简单,全部单数页脚的文本框都删掉。当然,双数页脚的

ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterEvenPages).Range.ShapeRange.Delete();

到这里,基本上,用wps js 宏代码,完美实现插入文档页面外侧页码。

记录一下。