案例需求:

替换书签范围为指定内容, 类型:文本/文件/图片/域/剪贴板

扩展:

1.替换书签中的内容,并且想指定字体
2.不想替换整个书签,只想在书签末尾追加内容

案例可能遇到的坑:

暂无

代码流程

1. 获取书签的区域Range
2. 记录书签的起始位置和末尾位置
3. 记录替换前文章的原长度判断书签所在的StoryType,常见为正文/文本框/页眉页脚。他们对应不同的文章Story。如果是[1正文]记录文档Document原先的总长度。[其他]则记录对应文章中的总字符数StoryLengthWdStoryType[wdMainTextStory|1|正文部分,wdTextFrameStory|5|文本框部分,10、11|页眉页脚]
4. 判断入参type、插入对应的内容
5. 获取替换后文章的长度
6. 重新设置书签的范围,计算书签的末尾为: 原先书签末尾 + (替换后文章长度 - 替换前文章长度)

代码实现

/**
* 书签替换
* @author Li Zuxian
* @param {string} bookmarkStr  书签名
* @param {string} type         替换类型  text:文本 link:文件 pic:图片 field:域 paste:粘贴
* @param {string} text         替换内容
*/
function SetBookMark(bookmarkStr, type, text) {var app = wps.WpsApplication();var doc = wps.WpsApplication().ActiveDocument;var bookmark = doc.Bookmarks.Item(bookmarkStr);if (!bookmark) return "书签不存在";let bookStart = bookmark.Range.Start;let bookEnd = bookmark.Range.End;let beforeEnd = doc.Range().End;//Range.StoryType -> WdStoryType[wdMainTextStory|1|正文部分,wdTextFrameStory|5|文本框部分,10、11|页眉页脚] beforeEnd = /5|10|11/.test(bookmark.Range.StoryType) ? bookmark.Range.StoryLength : beforeEnd;if (!type || type === "text") {bookmark.Range.Text = text;} else if (type === "link") {bookmark.Range.InsertFile(text);} else if (type === "pic") {bookmark.Range.InlineShapes.AddPicture(text);} else if (type === "field") {bookmark.Range.Fields.Item(1).Result.Text = text;return;} else if (type === "paste") {bookmark.Range.Select();app.Selection.PasteAndFormat(16);}let nowEnd = doc.Range().End;let range = bookmark.Range;nowEnd = /5|10|11/.test(range.StoryType) ? bookmark.Range.StoryLength : nowEnd;    //文本框是不同的storyif (!doc.Bookmarks.Exists(bookmark.Name)) {  //书签不存在就添加书签range.SetRange(bookStart, bookEnd + (nowEnd - beforeEnd));doc.Bookmarks.Add(bookmark.Name, range);} else {  //书签存在就删掉再添加bookmark.Delete();app.Selection.SetRange(bookStart, bookEnd + (nowEnd - beforeEnd));doc.Bookmarks.Add(bookmark.Name, app.Selection.Range);}app.ActiveWindow.Selection.WholeStory();app.ActiveWindow.Selection.EndKey();
}

扩展代码

1.替换书签中的内容,并且想指定字体

插入内容改为光标处插入样式文字的方法

/**
* 书签替换(带字体样式)
* @author Li Zuxian
* @param {string} bookmarkStr  书签名
* @param {string} text         替换内容
* @param {object} font         字体 json
* {
*  "Name":"微软雅黑",  //字体
*  "Bold":true,        //粗体
*  "Italic":true,      //斜体
*  "Size":21,          //字体大小
*  "Color":"#FFF",     //颜色的16进制
*  "Alignment":"2",    //对齐方式  [0居左 1居中 2居右]
*  "CleaerIndent":true //清除缩进
* }
*/
function SetBookMark(bookmarkStr, text, font) {var app = wps.WpsApplication();var doc = wps.WpsApplication().ActiveDocument;var bookmark = doc.Bookmarks.Item(bookmarkStr);if (!bookmark) return;let bookStart = bookmark.Range.Start;let bookEnd = bookmark.Range.End;let beforeEnd = doc.Range().End;if (bookmark) {//Range.StoryType -> WdStoryType[wdMainTextStory|1|正文部分,wdTextFrameStory|5|文本框部分,10、11|页眉页脚] beforeEnd = /5|10|11/.test(bookmark.Range.StoryType) ? bookmark.Range.StoryLength : beforeEnd;//这里改成样式插入文字app.Selection.SetRange(bookStart, bookEnd);insertText(text, font);let nowEnd = doc.Range().End;let range = bookmark.Range;nowEnd = /5|10|11/.test(range.StoryType) ? bookmark.Range.StoryLength : nowEnd;    //文本框是不同的storyif (!doc.Bookmarks.Exists(bookmark.Name)) {  //书签不存在就添加书签range.SetRange(bookStart, bookEnd + (nowEnd - beforeEnd));doc.Bookmarks.Add(bookmark.Name, range);} else {  //书签存在就删掉再添加bookmark.Delete();app.Selection.SetRange(bookStart, bookEnd + (nowEnd - beforeEnd));doc.Bookmarks.Add(bookmark.Name, app.Selection.Range);}app.ActiveWindow.Selection.WholeStory();app.ActiveWindow.Selection.EndKey();}
}/**
* 光标处插入文本(带样式)
* @author Li Zuxian
* @param str 欲插入的文本内容
* @param font json
* {
*  "Name":"微软雅黑",  //字体
*  "Bold":true,        //粗体
*  "Italic":true,      //斜体
*  "Size":21,          //字体大小
*  "Color":"#b50e19",  //颜色的16进制
*  "Alignment":"2",    //对齐方式  [0居左 1居中 2居右]
*  "CleaerIndent":true //清除缩进
* }
*/
function insertText(str, font) {let app = wps.WpsApplication();let selection = app.Selection;let start = selection.Range.End;let end;selection.TypeText(str);end = selection.Range.End;app.Selection.SetRange(start, end);if (font) {//字体if (font.Name)selection.Font.Name = font.Name//粗体selection.Font.Bold = font.Bold ? -1 : 0;selection.Font.BoldBi = font.Bold ? -1 : 0;//斜体selection.Font.Italic = font.Italic ? -1 : 0;selection.Font.ItalicBi = font.Italic ? -1 : 0;//大小if (font.Size) {selection.Font.Size = font.Sizeselection.Font.SizeBi = font.Size}//颜色if (font.Color)selection.Font.Color = colorHex2int(font.Color)//对齐if (font.Alignment) {selection.ParagraphFormat.Alignment = font.Alignment}//清除缩进if (font.CleaerIndent) {selection.ParagraphFormat.CharacterUnitFirstLineIndent = 0; //首行缩进 (以字符为单位)selection.ParagraphFormat.CharacterUnitLeftIndent = 0; //左缩进值 (以字符为单位)selection.ParagraphFormat.FirstLineIndent = 0; //首行缩进 (以磅为单位)selection.ParagraphFormat.LeftIndent = 0; //左缩进值 (以磅为单位) }}app.Selection.SetRange(end, end);
}/**
* 颜色16转10进制 forWPS
* @author Li Zuxian
* @param {string} hex
* @returns int
*/
function colorHex2int(hex) {hex = hex.replace(/#/g, "");hex = [hex.substring(4, 6), hex.substring(2, 4), hex.substring(0, 2)].join("");var len = hex.length, a = new Array(len), code;for (var i = 0; i < len; i++) {code = hex.charCodeAt(i);if (48 <= code && code < 58) {code -= 48;} else {code = (code & 0xdf) - 65 + 10;}a[i] = code;}return a.reduce(function (acc, c) {acc = 16 * acc + c;return acc;}, 0);
}

2.不想替换整个书签,只想在书签末尾追加内容

这里只需要将上面书签替换中的代码 app.Selection.SetRange(bookStart, bookEnd)
改为 app.Selection.SetRange(bookEnd, bookEnd) 即可实现,意味插入时直接在书签末尾插入

/**
* 书签追加   //目前只支持文字追加
* @param {string} bookmarkStr  书签名
* @param {string} text         替换内容
* @param {object} font         字体 json
* {
*  "Name":"微软雅黑",  //字体
*  "Bold":true,        //粗体
*  "Italic":true,      //斜体
*  "Size":21,          //字体大小
*  "Color":"#FFF",     //颜色的16进制
*  "Alignment":"2",    //对齐方式  [0居左 1居中 2居右]
*  "CleaerIndent":true //清除缩进
* }
*/
function BookMarkAddmore(bookmarkStr, text, font) {var app = wps.WpsApplication();var doc = wps.WpsApplication().ActiveDocument;var bookmark = doc.Bookmarks.Item(bookmarkStr);if (!bookmark) return;let bookStart = bookmark.Range.Start;let bookEnd = bookmark.Range.End;let beforeEnd = doc.Range().End;if (bookmark) {//Range.StoryType -> WdStoryType[wdMainTextStory|1|正文部分,wdTextFrameStory|5|文本框部分,10、11|页眉页脚] beforeEnd = /5|10|11/.test(bookmark.Range.StoryType) ? bookmark.Range.StoryLength : beforeEnd;//这里改成样式插入文字app.Selection.SetRange(bookEnd, bookEnd);insertText(text, font);let nowEnd = doc.Range().End;let range = bookmark.Range;nowEnd = /5|10|11/.test(range.StoryType) ? bookmark.Range.StoryLength : nowEnd;    //文本框是不同的storyif (!doc.Bookmarks.Exists(bookmark.Name)) {  //书签不存在就添加书签range.SetRange(bookStart, bookEnd + (nowEnd - beforeEnd));doc.Bookmarks.Add(bookmark.Name, range);} else {  //书签存在就删掉再添加bookmark.Delete();app.Selection.SetRange(bookStart, bookEnd + (nowEnd - beforeEnd));doc.Bookmarks.Add(bookmark.Name, app.Selection.Range);}app.ActiveWindow.Selection.WholeStory();app.ActiveWindow.Selection.EndKey();}
}
/*** 光标处插入文本(带样式)* @author Li Zuxian* @param str 欲插入的文本内容* @param font json * {*  "Name":"微软雅黑",  //字体*  "Bold":true,        //粗体*  "Italic":true,      //斜体*  "Size":21,          //字体大小*  "Color":"#b50e19",  //颜色的16进制*  "Alignment":"2",    //对齐方式  [0居左 1居中 2居右]*  "CleaerIndent":true //清除缩进  * }*/
function insertText(str, font) {let app = wps.WpsApplication();let selection = app.Selection;let start = selection.Range.End;let end;selection.TypeText(str);end = selection.Range.End;app.Selection.SetRange(start, end);if (font) {//字体if (font.Name)selection.Font.Name = font.Name//粗体selection.Font.Bold = font.Bold ? -1 : 0;selection.Font.BoldBi = font.Bold ? -1 : 0;//斜体selection.Font.Italic = font.Italic ? -1 : 0;selection.Font.ItalicBi = font.Italic ? -1 : 0;//大小if (font.Size) {selection.Font.Size = font.Sizeselection.Font.SizeBi = font.Size}//颜色if (font.Color)selection.Font.Color = colorHex2int(font.Color)//对齐if (font.Alignment) {selection.ParagraphFormat.Alignment = font.Alignment}//清除缩进if (font.CleaerIndent) {selection.ParagraphFormat.CharacterUnitFirstLineIndent = 0; //首行缩进 (以字符为单位)selection.ParagraphFormat.CharacterUnitLeftIndent = 0; //左缩进值 (以字符为单位)selection.ParagraphFormat.FirstLineIndent = 0; //首行缩进 (以磅为单位)selection.ParagraphFormat.LeftIndent = 0; //左缩进值 (以磅为单位) }}app.Selection.SetRange(end, end);
}
/*** 颜色16转10进制 forWPS* @param {string} hex * @returns int*/
function colorHex2int(hex) {hex = hex.replace(/#/g, "");hex = [hex.substring(4, 6), hex.substring(2, 4), hex.substring(0, 2)].join("");var len = hex.length, a = new Array(len), code;for (var i = 0; i < len; i++) {code = hex.charCodeAt(i);if (48 <= code && code < 58) {code -= 48;} else {code = (code & 0xdf) - 65 + 10;}a[i] = code;}return a.reduce(function (acc, c) {acc = 16 * acc + c;return acc;}, 0);
}//-------demo-以下是测试代码----------
//标题字体
var titleFont = {"Name": "微软雅黑",  //字体"Bold": true,        //粗体"Italic": true,      //斜体"Size": 18,          //字体大小"Color": "#b50e19"   //颜色的16进制
}
//正文字体
var ContentFont = {"Name": "微软雅黑",  //字体"Bold": false,        //粗体"Italic": false,      //斜体"Size": 12,          //字体大小"Color": "#FFF"   //颜色的16进制
}
//测试数据
var data = [{ "title": "测试标题1\n", "content": "测试内容1\n" },{ "title": "测试标题2\n", "content": "测试内容2\n" },{ "title": "测试标题3\n", "content": "测试内容3\n" },
]
//插入测试书签
wps.Application.Selection.Bookmarks.Add("test");
//触发渲染
function render(data) {data.forEach(d => {BookMarkAddmore("test", d.title, titleFont)BookMarkAddmore("test", d.content, ContentFont)});
}
render(data);

【WPS JSAPI加载项】 书签替换功能的实现相关推荐

  1. 【WPS JSAPI加载项】判断当前文档是普通WPS文档还是WPS公文文档

    [WPS JSAPI加载项]判断当前文档是普通WPS文档还是WPS公文文档 案例需求: 代码流程 代码实现 案例需求: 判断当前文档是普通WPS文档还是WPS公文文档 代码流程 1. 获取文档Xml, ...

  2. vba vbscript.regexp加载dll错误_TFS金钥匙系列04期:WPS 加载项之“团队”功能

    随着TFS管理工具在我中心推广使用,越来越多的人开始使用它开展项目管理和缺陷管理等工作,已成为我们日常工作的必备工具.它涵盖的内容广泛,功能丰富,有很多常用功能项是我们日常工作的得力助手. 如何使用T ...

  3. wps2019数据分析加载项_《07版office办公软件中的excle中,为什么在加载项里选择了分析工具库,数据分析还是显示不出来?》 wps数据分析加载项...

    如何利用excle做数据分析 excel完全可以解决! 可以通过数据透视表,筛选出你的各种需求,但是要求操作要熟练,没办法在这里描述清楚的 07版office办公软件中的excle中,为什么在加载项里 ...

  4. wpsppt加载项在哪里_《wps表格加载项在哪里》 WPS版的EXCEL中 加载宏和数据分析在哪?...

    wps表格里的查找功能在哪? 以WPS 2019版本为例: 可以在工具栏中单击"查找"功能哦. WPS中的excel表格将字段分组在哪 我在wps表格中了一个关于成绩的表格面我们来 ...

  5. wpsppt加载项在哪里_wpsppt加载项在哪里_《wps表格加载项在哪里》 WPS版的EXCEL中 加载宏和数据分析在哪?......

    wps表格里的查找功能在哪? 以WPS 2019版本为例: 可以在工具栏中单击"查找"功能哦. WPS中的excel表格将字段分组在哪 我在wps表格中了一个关于成绩的表格面我们来 ...

  6. WPS JASPI加载项 JSAPI概述及原理JSAPI集成开发文档

    JSAPI概述及原理 : [金山文档]JSAPI概述及原理 https://kdocs.cn/l/skWT29577eEE JSAPI集成开发文档 [金山文档]JSAPI集成开发文档 https:// ...

  7. Excel删除xlam加载项右键多余功能如何清理

    之前由于安装了excel的xlam扩展功能,删除后导致点击excel表右键会来很多无效的选项. 清除方法: 右击工作表标签 > 查看代码 粘贴下面代码 Sub test() With Appli ...

  8. wps加载项开发和使用

    这里写自定义目录标题 wps加载项的使用 准备环境 生成一个加载项的demo wps加载项的使用 准备环境 1.安装wps企业版(个人版可能出问题) 2.安装node 环境 3.详细情况可查看官方开发 ...

  9. 启用和禁用excel 中的加载项

    原文地址为: 启用和禁用excel 中的加载项 查看已安装的加载项 安装 2007 Microsoft Office System 时,将在计算机上安装多个加载项. 请在以下 2007 Microso ...

最新文章

  1. 关于sysobjects这个表
  2. CommandBehavior.CloseConnection有何作用
  3. 开发日记-20190602 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  4. dz如何安装mysql_windows下安装Mysql(图文详解)
  5. Orleans—一些概念
  6. 固执己见的框架(例如Spring Boot)的危险。 求知代码反转
  7. 光纤收发器和光电转换器有什么区别?
  8. 手机html5性能测试工具,HTML5模块 性能方面8大测试环节_小米 M3_手机硬件频道-中关村在线...
  9. Javascript事件驱动编程
  10. 线程数究竟设多少合理
  11. 苹果电脑上几款不错的cad绘图软件
  12. word怎么恢复自动保存_如何使用自动恢复自动保存Word文档并恢复丢失的更改
  13. 让人眼前一亮的小众PC浏览器
  14. [gdc13]dx11效率优化
  15. airpods链接mac弹窗_AirPods怎么连接Mac AirPods连接Mac教程
  16. 浅谈Unity中的rotation和Quaternion的乘法
  17. Java支付--苹果内购
  18. 美元人民币汇率API
  19. 电磁场与仿真软件(21)
  20. Linux下dirname命令

热门文章

  1. 共享文件无法查看计算机,win10共享文件夹看不到其他电脑怎么办解决
  2. 【RS】关于路由器ping不通直连的几种原因(1)
  3. 使用.Net5尝鲜的一些小总结及Configuration.Json读取配置文件的使用
  4. CSS 自学笔记(三)
  5. 短视频平台-小说推文(Lofter)推广任务详情
  6. R1_LiceCap动态图片GIF录制软件
  7. 软件工程国考总结——选择题
  8. 加拿大计算机专业面试,《移民易出国网》成功案例:加拿大技术移民,计算机程序员-30个月单免(免面试)...
  9. AndroidAPP的安全模型
  10. CIO40知识星球—6年总监升职VP(35-40岁)