Excel Power Query批量正则检测Web.Page()失效问题排查与修复
Power Query批量正则检测函数Rgx_Tests() Web.Page渲染JSON缺失问题排查与修复
故障原因分析
- 字符串转义冲突:Power Query直接拼接
JSON.stringify生成的字符串到Web.Page的HTML脚本时,JSON中的双引号会与HTML脚本的双引号发生冲突,导致JS解析时提前截断JSON,最终造成文本块缺失。 - 编码差异:Power Query与Web.Page的JS上下文存在字符串编码差异,批量数据的JSON字符串可能包含未被正确处理的特殊字符(如换行、制表符),导致渲染时内容丢失。
修复方案
方案1:用Base64编码传递JSON(推荐)
通过Base64编码把JSON数据转为ASCII字符串,彻底规避转义问题,JS端解码后再处理,这是最可靠的解决方式。
修复后的Rgx_Tests函数代码:
Rgx_Tests = (textList as list, pattern as text) as list => let // 将批量数据转为JSON二进制,再转Base64字符串 JsonBinary = JSON.FromValue([Texts=textList, Pattern=pattern]), Base64Str = Binary.ToText(JsonBinary, BinaryEncoding.Base64), // 嵌入Base64数据到JS脚本,解码后处理正则检测 Html = "<script> var base64Data = '" & Base64Str & "'; var jsonStr = atob(base64Data); var data = JSON.parse(jsonStr); var results = data.Texts.map(t => new RegExp(data.Pattern).test(t)); document.body.innerHTML = JSON.stringify(results); </script>", // 渲染页面并解析结果 Page = Web.Page(Html), Results = JSON.Parse(Page{0}[Data]{0}[Children]{0}[Text]) in Results
方案2:手动转义JSON特殊字符(仅适用于小批量/无特殊字符场景)
如果数据量小且没有复杂特殊字符,可以手动转义JSON里的双引号,避免和HTML脚本的引号冲突:
Rgx_Tests = (textList as list, pattern as text) as list => let JsonStr = JSON.FromValue([Texts=textList, Pattern=pattern]) |> Text.FromBinary, // 转义双引号:Power Query里用两个双引号表示一个转义的双引号 EscapedJsonStr = Text.Replace(JsonStr, """", """"""), Html = "<script> var data = " & EscapedJsonStr & "; var results = data.Texts.map(t => new RegExp(data.Pattern).test(t)); document.body.innerHTML = JSON.stringify(results); </script>", Page = Web.Page(Html), Results = JSON.Parse(Page{0}[Data]{0}[Children]{0}[Text]) in Results
验证说明
两种方案都能解决Web.Page渲染JSON缺失的问题,其中Base64编码方案适配所有场景,包括包含特殊字符、大体积的批量数据;手动转义方案仅适合简单场景,遇到复杂文本容易再次出现问题。
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

