首页 > 其他分享 >wps js 宏之插入页码

wps js 宏之插入页码

时间:2022-12-28 15:22:29浏览次数:70  
标签:obj 插入 文本框 wps Item ActiveDocument 宏之 js 页码

在写插入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);

下面对应修改两处:

 obj.Fields.Add(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 宏代码,完美实现插入文档页面外侧页码。

记录一下。

 

标签:obj,插入,文本框,wps,Item,ActiveDocument,宏之,js,页码
From: https://www.cnblogs.com/lcxdc/p/17010213.html

相关文章

  • JS中的事件、事件冒泡和事件捕获、事件委托
    JavaScript事件模型及事件代理事件模型JavaScript事件使得网页具备互动和交互性,我们应该对其深入了解以便开发工作,在各式各样的浏览器中,JavaScript事件模型主要分为3种:......
  • 01 | JSX 代码是如何“摇身一变”成为 DOM 的?
    JSX的本质是什么JSX是JavaScript的一种语法扩展,它和模板语言很接近,但是它充分具备JavaScript的能力,JSX的本质是React.createElement这个JavaScript调用的语法糖......
  • JS动态加载引入JS文件
    1.调整标签位置可以把<script>标签放到HTML文档的最后面,这样不影响页面加载。 2.动态创建script来加载loadJS('js/index.min.js?V=1.0.0.1',function(){//加载,......
  • javaweb 8、JSP
    什么是JSPJavaServicePages:java服务器端页面,也和Servlet一样,用于动态web技术最大特点:写JSP就像在写HTML区别:HTML只给用户提供静态的数据JSP页面中科院嵌入java代......
  • P5231 JSOI2012 玄武密码
    \(P5231\)[\(JSOI2012\)]玄武密码一、题目背景在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河。相传一日,一缕紫气从天而至,只一瞬间便消失在了......
  • JS基础——异步回调
    前言一个刚入前端的小菜,虽然以前看到过关于回调的文章,但是呢,理解起来有点费劲啊。当时的脑海里就一个概念。回调:大多出现在Ajax请求,用于处理收到的请求结果。嘿嘿,当时真的就......
  • 省份城市二级联动【DOM+js+XML】
    功能   省份城市二级联动【js+DOM+XML】实现效果展示代码实现显示页面<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">2<html>3<head>......
  • js for循环,每次循环间隔时间执行
    根据循环的次数来设定延时时间index*1000 $.get('/zdj_stat/data/onheart',function(res){ if(res.code==0){ $(res.data).each((index,v)=>......
  • dayjs 前几秒时间
    varsecs_befortime=dayjs().subtract(3000000000,'second').format();前言:工作中的经常对时间进行操作处理,例如倒计时,距离当前过去了多久等场景,采用原生的时......
  • json断言
    在线程组>>添加>>断言>>json断言   ......