Word JS API:扩展范围

2024-04-15

在努力解答的同时这个问题 https://stackoverflow.com/a/51159442/3077495我真的希望能够将范围扩展特定数量的字符。在 COM API 中我会使用Range.MoveEnd()。是否有我在 JS API 中没有找到的等效项?

背景:所引用的问题是关于查找超过 255 个字符的搜索词 - 这是桌面版 Word 的限制。搜索失败。

最简单的方法是搜索前 254 个字符,然后按剩余字符数扩展找到的范围并进行比较Range.Text到完整的搜索词。

没有找到以这种方式扩展范围的任何等效项,我不得不求助于:

  • 将搜索词分解为
  • 逐一搜索每件作品
  • 确定每个搜索到的片段是否与前一个片段相邻
  • 然后扩展范围以包含相邻的部分
  • 并重复直到找到所有碎片

因此,我的问题...

async function basicSearch() {
    await Word.run(async (context) => {
        let maxNrChars = 254;
        let searchterm = "";
        let shortSearch = true; //search string < 255 chars
        let fullSearchterm = "Video provides a powerful way to help you prove your point. When you click Online Video, you can paste in the embed code for the video you want to add. You can also type a keyword to search online for the video that best fits your document. Aösdlkvaösd faoweifu aösdlkcj aösdofi "
        let searchTermNrChars = fullSearchterm.length;
        let nrSearchCycles = Number((searchTermNrChars / maxNrChars).toFixed(0));
        let nrRemainingChars = searchTermNrChars - (nrSearchCycles * maxNrChars);
        //console.log("Number of characters in search term: " + searchTermNrChars
        //    + "\nnumber of search cycles required: " + nrSearchCycles
        //    + "\nremaining number of characters: " + nrRemainingChars);

//numerous ranges are required to extend original found range
        let bodyRange = context.document.body.getRange();
        bodyRange.load('End');
        let completeRange = null;
        let resultRange = null;
        let extendedRange = null;
        let followupRange = null;

        let cycleCounter = 0;
        let resultText = "";
        if (searchTermNrChars > maxNrChars) {
            searchterm = fullSearchterm.substring(0, maxNrChars);
            cycleCounter++;
            shortSearch = false;
        }
        else { searchterm = fullSearchterm; }

        let results = context.document.body.search(searchterm);
        results.load({ select: 'font/highlightColor, text' });

        await context.sync();

        // short search term, highlight...
        if (shortSearch) {
            for (let i = 0; i < results.items.length; i++) {
                results.items[i].font.highlightColor = "yellow";
            }
        }
        else {
            //console.log("Long search");
            for (let i = 0; i < results.items.length; i++) {
                resultRange = results.items[i];
                resultRange.load('End');
                extendedRange = resultRange.getRange('End').expandTo(bodyRange.getRange('End'));

                await context.sync();

                //search for the remainder of the long search term
                for (let cycle = 1; cycle < nrSearchCycles; cycle++) {
                    searchterm = fullSearchterm.substring((cycle * maxNrChars), maxNrChars);
                    //console.log(searchterm + " in cycle " + cycle);
                    let CycleResults = extendedRange.search(searchterm);
                    CycleResults.load({ select: 'text, Start, End' });
                    await context.sync();
                    followupRange = CycleResults.items[0];

                    //directly adjacent?
                    let isAfter = followupRange.compareLocationWith(resultRange);
                    if (isAfter.value == Word.LocationRelation.adjacentAfter) {
                        resultRange.expandTo(followupRange);
                        extendedRange = resultRange.getRange('End').expandTo(bodyRange.getRange('End'));
                    }
                    await context.sync();
                }

                if (nrRemainingChars > 0) {
                    console.log("In remaining chars");
                    searchterm = fullSearchterm.substring(searchTermNrChars - nrRemainingChars);
                    console.log(searchterm);
                    let xresults = extendedRange.search(searchterm);
                    xresults.load('end, text');
                    await context.sync();

                    let xresult = xresults.items[0];

                    let isAfter = xresult.compareLocationWith(resultRange);

                    await context.sync();
                    console.log(isAfter.value);
                    if (isAfter.value == Word.LocationRelation.adjacentAfter) {
                        completeRange = resultRange.expandTo(xresult);
                        completeRange.load('text');
                        //completeRange.select();
                        await context.sync();
                        resultText = completeRange.text.substring(0, fullSearchterm.length);
                        console.log("Result" + cycleCounter + ": " + resultText);
                    }  
                }
                else {
                    //No remeaining chars
                    resultRange.load('text');
                    //resultRange.select();
                    await context.sync();
                    resultText = resultRange.text.substring(0, fullSearchterm.length);
                    completeRange = resultRange; 
                }

                //long search successful?
                if (resultText == fullSearchterm) {
                    completeRange.font.highlightColor = "yellow";
                }
                else {
                    console.log("Else! " + resultText + "  /  " + fullSearchterm);
                }
                completeRange = null;
            }
        }  
    });

这是我们在最初设计中就有的,但它实际上从 API 中删除了,因为它很容易导致意外结果(即隐藏的字符不一致、脚注等),而且我们无法用现有的资源来覆盖这些情况。我们决定将其删除。

话虽如此,我认为您可以使用 Word.js 实现类似于 range.MoveEnd() 的功能,您只需要定义到内容的末尾;)。一种方法是使用 range.expandTo(endRange) 方法。同样,有趣的是如何获取“endRange”,因此下面的示例展示了如果“end”表示段落结束时如何执行此操作,可能在您的场景中就足够了。

async function run() {
    await Word.run(async (context) => {
        //assume the range at the end of your 255 characters.
        var startRange = context.document.getSelection().getRange("end"); 
        //This one is the range at the end of the paragraph including the selection.
        var endRange = context.document.getSelection().paragraphs.getLast().getRange("end");

        var deltaRange = startRange.expandTo(endRange);
        context.load(deltaRange);

        await context.sync();
        // this will print the characters after the range all the way to the end of the paragraph.
        console.log(deltaRange.text);
    });
}

希望这对您有所帮助,或者至少为您指明了正确的方向。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Word JS API:扩展范围 的相关文章

  • 如何使用 apache poi 将 .docx 转换为 .doc

    我需要知道如何转换 docx to doc using apache poi 也许使用XWPFDocument HWPFDocument课程 如果无法实现 请提供替代解决方案 使用 LibreOffice 通过 JODConverter 驱
  • 是否可以从C语言函数写入word文件?

    我有一个用 C 语言编写的图书馆管理系统 其中有 I O 文件 dat 如何从该函数中获取word文件的输出 void viewbooks void show the list of book persists in library int
  • 以编程方式将 Word 文件另存为图片

    我想将Word文档的第一页另存为图片 使用 C 有什么方法可以做到这一点 您可以将 Word 文档打印到 XPS 文档 在 WPF Net 3 5 应用程序中打开它 并使用 WPF 框架的文档和图像功能将第一个内部固定页面对象转换为位图 如
  • 如何使用 Office.js 查找 Office AddIn Host(它是 Word 应用程序还是 Excel)?

    我正在创建一个 Office AddIn 它可以在 Excel 和 Word 应用程序中使用 并且基于主机 如果它是 Word 或 Excel 主机 我想执行不同的逻辑 我正在使用office js 创建office Addin 例如 le
  • Excel JS - 获取范围数字格式

    我正在 React 中使用 Excel Office JS API 数据被推送到 Excel 范围 我正在尝试执行以下逻辑 检查范围 单元格格式是否为常规 如果是通用格式 则将格式设置为特定的日期时间格式 如果不是通用格式 请勿更改格式 看
  • Word 插件 - 如何读取自定义文档属性

    我正在使用 Office JS API 开发 Word 插件 目前 我可以通过执行以下操作向 Word 文档添加自定义属性 context document properties load context document properti
  • 使用 XML 和 C# 创建 Word 文档

    我已经为报告创建了一个 xml 模板 用户应该能够通过我用 C 创建的程序添加信息以根据自己的需要个性化此报告 如何根据用户输入文本框的内容编辑实体的内容 然后将其显示在 Word 上 网上有大量有关使用 XML 和 C 创建 Word 文
  • 如何在Word 2010中从SQL数据库检索数据?

    我想用 MS SQL 数据库中的数据填充 Word 文档 这可能吗 如果可能的话 如何实现 我过去曾通过多种方式做到这一点 这取决于用户是从 Microsoft Word 外部还是从 Microsoft Word 内部启动操作 From I
  • MS Office 使用 WebDAV 以只读方式打开文档

    我们实现了自己的 WebDAV 服务器 某些使用 Office Word Excel 的用户以只读方式打开文档 对于有问题的计算机 接下来的查询是 OPTIONS http pastie org 10957339 http pastie o
  • 编辑Word书签更改字体

    我有一个使用 OpenXml 生成文档的 C 程序 它使用以下方法用值替换书签 private void FillBookmark BookmarkStart bookmark string value var text new Text
  • 在 MS word .docs 中插入 MathMl 、 Tex 或 LaTex 方程?

    我一直在寻找 C 中 Net 的一些 dll 用于在 MS Word 中插入任何 MathMl Tex 或 LaTex 方程 我尝试了一些类似 DocX 的工具 但它们失败了 你知道吗 或任何提示如何做到这一点 谢谢 Word 2007 可
  • 用于更新 Word 文档中所有字段的宏

    多年来 我构建了一个 vba 宏 该宏应该更新 Word 文档中的所有字段 我在发布文档进行审查之前调用此宏 以确保所有页眉和页脚等均正确 目前 它看起来像这样 Sub UpdateAllFields UpdateAllFields Mac
  • VBA MS-Word:是否可以用通配符替换文本?

    是否可以替换使用通配符找到的文本并将其也替换为通配符 例如FindText 13 2 13 Forward True MatchWildcards True 然后用这样的通配符替换它replacewith 13 2 11 是否可以 评论中的
  • 在 Word 2010 中开发功能区选项卡,在组标签名称中使用 & 符号

    我正在开发一个用于模板的功能区选项卡 MyTemplate dotm 对于 Word 2010 我的问题 我想在组的标签中使用与号 我尝试了很多方法 也用谷歌搜索了很多关于这个问题的信息 但没有任何效果 named amp decimal
  • VBA Word - 更改小数点分隔符

    我周围的一些人在 Windows Office 中使用国家本地化 不幸的是 这导致我的宏无法执行简单的数学运算 因为它们使用逗号表示小数位置 而我编辑的 pov ray 文件仅使用逗号作为列表分隔符 使用点表示小数点 1 我知道在 Exce
  • 使用 VBA 从 Word 发送 HTTP 请求

    我正在尝试将数据从 Word 文档发送到网页 我找到了一些代码 将其粘贴到新模块中并保存 当我运行它时 我收到 编译错误 用户定义的类型未定义 My code Sub http Dim MyRequest As New WinHttpReq
  • 如何使用 win32com.client api 访问 MS Word 的脚注

    我正在尝试使用 win32com client api 访问 MS Word 文件的脚注 我已经用谷歌搜索过 但没能找到合适的方法 我使用 python docx 来实现上述目的 但我发现当前版本的 python docx 无法访问 MS
  • Word 2016 插件:检测文档保存

    我正在开发一个 Word 2016 插件 Word API Office js 我想知道是否可以在用户即将保存文档时收到通知 该文档作为 LOB 存储在应用程序的数据库中 在临时路径上提取并在 Word 中作为普通文件打开 我需要为 保存
  • 使用PHP从doc、xls文件中读取数据

    我想知道是否可以从 doc 和 xls 文件中读取数据并将 将内容读取到图像文件中 创建文档的页面样本 例如 我有一些文件希望我的客户购买 所以我需要自动创建小图像 例如我的文档样本 我们将不胜感激您的帮助 对于读取 xls 文件 我真的推
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e

随机推荐

  • npm install git+ssh 在 docker (node16) 中失败

    谁能解释一下为什么要从node 14 alpine to node 16 alpine会导致npm安装失败吗 gt 8 10 RUN mount type ssh npm i 14 14 27 npm ERR code 128 14 14
  • InProc 会话数据消失

    我大约一周前才注意到这一点 我正在存储有关用户正在玩的当前谜题的数据 www wikipediamaze com 如下所示 HttpContext Current Session Add puzzleInfo currentPuzzleIn
  • 使用 jQuery 将宽度设置为百分比

    如何使用 jQuery 将 div 的宽度设置为百分比 使用width http api jquery com width 功能 div somediv width 70 将转向 div div into div style width 7
  • 如何将CUDA时钟周期转换为毫秒?

    我想用一些代码来测量时间within我的内核需要 我已经关注了这个问题 https stackoverflow com questions 11209228 timing different sections in cuda kernel连
  • 如何将图像从黑色转换为白色,反之亦然

    我有一张黑白的 jpg 图片 我想将黑色部分转换为白色 将白色部分转换为黑色 黑色像素转换为白色 反之亦然 MATLAB并再次另存为jpg文件 我已经尝试过这段代码 但它只是在白页上给了我一条黑线 im imread Export00000
  • JPA/Hibernate + HQL/JPQL:选择带有 BigDecimal 参数的 DTO

    我们使用 JPA 和 hibernate 作为实现 假设我有以下 DTO public class SupplierInfoDto private String supplierName private BigDecimal remaini
  • iOS 11 SceneKit hitTest:选项:失败

    我在 iOS 11 上的 SceneKit 中使用 hitTest options 时遇到了困难 在地图应用程序中 我有一个地形节点 使用 hitTest options 我能够长时间通过触摸屏幕来发现地形上的一个点 它仍然可以在 iOS
  • 反应路由器和 Express 冲突

    我有我想要 React Router 处理的路径 而且我还有一个 Express API 后端 我从 React 应用程序调用它来执行一些安全的 API 调用 希望在这里提供应用程序 id 应用程序的唯一 URL 我使用 ID 从 Reac
  • 如何将 com.android.internal.telephony.ITelephony 导入到 Android 应用程序

    我想挂断来电 我检测到它然后我想挂断它 问题是这样的 com android internal telephony ITelephony没有解决 我尝试添加包com android internal telephony到我的应用程序并创建界
  • 在 Puppeteer 中获取 elementHandle 的同级元素

    我正在做 const last await page item last child 现在我很想根据最后一个元素获取前面的元素 IE const prev last prev 关于如何做到这一点有什么想法吗 Thanks 你应该使用prev
  • 异常传播指南(Java 中)

    Java 中有关于异常传播的指南吗 什么时候向方法签名添加异常 例如 如果仅在缺少必要的程序资源时抛出异常 并且只能在顶层处理 那么我是否可以通过使用错误方法的所有方法将其传播到使用此异常的所有方法 有什么好的做法吗 有什么不好的做法吗 如
  • 使用javascript更改html标签内的文本

    我正在尝试使用纯 JavaScript 更改 li 标记内的文本 html 内容始终是这样的 section class sidebar menu sidebar right sidebar open div class cart side
  • 如何在 SwiftUI 视图中调用方法

    刚刚开始使用 SwiftUI 我有一个谷歌地图视图 https gist github com kwmt 1df17577c59e33da1c4c2eb982f21bbf in a ContentView使用CLLocationManage
  • 如果某一列中的文本与其前面的文本不匹配,则将一个大文件拆分为多个文件

    我搜索了一段时间 找不到对此的回应 我有一个标准 tsv 文件 格式如下 1 100 101 350 A 1 101 102 300 A 1 102 103 180 A 1 800 801 60 B 1 801 802 70 B 1 802
  • 没有与特定模式匹配的 JSON 文件:appsettings.json

    我在 Team Services 版本上收到此错误 我怀疑发生此错误是因为我正在生成拉链工件 MSBuild 配置 p DeployOnBuild true p WebPublishMethod Package p PackageAsSin
  • 通过 Java 或 JavaScript 以外的语言使用 DAML Ledger API

    我想编写一个与 DAML 账本交互的应用程序 但从 SDK 0 11 3 开始 唯一记录的绑定是针对 Java 和 JavaScript 的 有没有办法使用其他语言的 Ledger API The 账本API https docs daml
  • MySQL - 如何跟踪每个查询? [复制]

    这个问题在这里已经有答案了 可能的重复 如何启用MySQL查询日志 https stackoverflow com questions 6479107 how to enable mysql query log 有没有办法跟踪 MySQL
  • 使用 Gnome 启动器的相对路径

    我们正在开发一个需要在可移动设备 例如 USB 记忆棒 上运行的应用程序 在 Linux 上 我们使用 Gnome 启动器将应用程序的快捷方式放置在设备的根目录上 但是 我们需要对可执行文件和图标使用相对路径 因为我们事先不知道设备将安装在
  • 如何检查 Stream.Null?

    我有一个 WCF 服务 它返回一个 Stream 如下所示 public Stream StreamFile string filepath try Grab the file from wherever it is Throw an ex
  • Word JS API:扩展范围

    在努力解答的同时这个问题 https stackoverflow com a 51159442 3077495我真的希望能够将范围扩展特定数量的字符 在 COM API 中我会使用Range MoveEnd 是否有我在 JS API 中没有