WPS灵犀 :表格加载项实战→从零实现新建表格"行列高亮"

嘉禾宝宝
嘉禾宝宝 WPS寻令官Lv.2 潜力创作者

Lv.2潜力创作者

一、为什么做这个功能

之前在设置看到有的小伙伴需求,更不能一次调整wps的全局设置,最近利用AI制作一些WPS工具不能实现的小工具:

这是 ET 表格组件里的 "高亮行列" 功能——本质上是给 WPS 表格实现一个自研的"阅读模式/十字光标高亮":点击任意单元格,它所在整行和整列同时被浅色填充,像十字线一样聚焦当前数据位置。,应为wps不能在新建表格中自动启用高亮行列,于是决定在 WPS 论文排版助手的 ET 组件里自己实现一个"高亮行列"功能,替代官方阅读模式。

功能定位:点选任意单元格 → 所在整行 + 整列同时浅色填充(十字高亮)→ 切换位置后旧高亮自动清除

二、功能设计一览

交互

行为

点选单元格

所在整行 + 整列同时填色(十字高亮)

颜色选择

10 种预设:浅黄(默认)、浅蓝、浅绿、浅灰、浅粉、浅橙、浅紫、浅青、浅红、浅棕

开关按钮

功能区「高亮行列」可开/关,默认开启;关闭时清除所有已打开工作簿每个 sheet 的底色

颜色记忆

所选颜色存 localStorage,下次沿用

按钮状态

标签实时显示"高亮开启/高亮关闭"

交互细节上做了一个体贴设计:高亮颜色用 30% 原色 + 70% 白色混合淡化,避免大块纯色刺眼。

三、技术方案选型:条件格式 → 直接填色

开发过程中我们其实换过一次核心方案,这是最重要的决策记录。

方案 A:全表条件格式(早期)

最初设计用条件格式实现:

// 条件格式思路:当前行或列命中时显示底色
OR(CELL("row")=ROW(), CELL("col")=COLUMN())
  • 优点:不破坏单元格原有底色,理论上是"纯逻辑"高亮,与数据底色完全解耦;

  • 缺点:需要监听选区变化后触发全表重算(Calculate),大表下性能开销明显,且 WPS 与 Excel 对条件格式 + CELL() 实时求值的行为存在差异,复杂场景兼容性不稳定。

最终因为性能和跨版本兼容性问题弃用,改走方案 B。

方案 B:整行/整列对象直接填色(当前)

sheet.Rows.Item(row).Interior.Color = color;
sheet.Columns.Item(col).Interior.Color = color;
  • 优点:实现简单、即时生效、性能好;

  • 缺点:会覆盖单元格原有底色——这是当前版本最大的使用限制,我们专门在提示文案里写明了"注意:会覆盖单元格原有底色"。

一句话:用"破坏底色"换"稳定简单"。如果你的使用场景里表格本身带大量底色,方案 A 值得再试一次(把重算做局部化可能能压住性能问题)。

  1. 核心实现(关键代码)

最初想设置一个控制wps内置高亮行列的开关,发现无法实现!!!!!

  1. 选区变化监听
function registerEtEvents() {
    try {
        wps.ApiEvent.AddApiEventListener("SheetSelectionChange", function () {
            handleSelectionChange();
        });
        log("event reg: SheetSelectionChange");
    } catch (e) { log("event reg fail SheetSelectionChange: " + e.message); }
}

  1. 选区变化 → 清除旧高亮 → 应用新高亮
function handleSelectionChange() {
    if (!hlEnabled()) return;
    var app = getEtApp();
    var wb = app.ActiveWorkbook;
    var sheet = app.ActiveSheet;
    var sel = app.Selection;
    var row = sel.Row, col = sel.Column;
    if (row <= 0 || col <= 0) return;
    clearLastHL();      // 先清上一次
    applyHLGrad(sheet, row, col);  // 再涂当前十字
}

  1. 淡化色算法(30% 原色 + 70% 白)
var color = rgbToBGR(
    Math.round(255 + (cc.r - 255) * 0.3),   // 朝白色方向混合,非透明度
    Math.round(255 + (cc.g - 255) * 0.3),
    Math.round(255 + (cc.b - 255) * 0.3)
);

  1. 上次高亮记录(跨工作簿隔离的关键)
wps.PluginStorage.setItem(HL_LAST_KEY, JSON.stringify({
    wb: wbName(sheet), sheet: sheet.Name, row: row, col: col, full: true
}));

五、9 大踩坑实录(按代码演进顺序)

坑 1:条件格式方案性能与兼容性不可控

现象:全表条件格式 + 选区重算,在大表上卡顿;WPS/Excel 对 CELL() 实时求值行为不一致。

结论:弃用条件格式,改用整行/整列对象直接填色。

遗留:代码头部注释还留着旧方案描述("原理 = 全表条件格式…"),维护时需要意识到注释与实现已脱节。

坑 2:覆盖单元格原有底色

现象:直接填色会洗掉数据区原有底色。

处理:无法两全时明确量化代价,并在用户提示中显式声明,不隐瞒。

建议:若业务数据表普遍带底色,把"是否透出原底色"做成可选项,内部再评估条件格式局部重算方案。

坑 3:清除范围与填充范围必须一致(杜绝残留)

现象:早期涂/清范围不一致,切换选格后旧高亮色块残留。

结论:统一用整行/整列对象涂与清,注释明确写着"整块清色,涂/清范围一致,杜绝残留"。

坑 4:跨工作簿误清

现象:打开多个工作簿时,切到别的文档会把对方的高亮清掉。

处理:记录上次高亮时同时记录工作簿名,清除前校验 info.wb !== wb.Name 则跳过——旧高亮归原文档。

坑 5:整行/整列对象 vs UsedRange

现象:用 UsedRange 计算填充范围会漏掉数据区以外的部分,十字线不完整。

结论:直接操作 Rows.Item(row) / Columns.Item(col),覆盖整个工作表,不受 UsedRange 限制。

坑 6:WPS/Excel 的 Interior.Color 是 BGR 字节序(经典坑)

现象:直接把 RGB 数值传给 Interior.Color,颜色全部错乱。

解决:手动字节序翻转:

function rgbToBGR(r, g, b) {
    return ((b & 255) << 16) | ((g & 255) << 8) | (r & 255);
}

坑 7:清除底色用 ColorIndex = -4142(xlNone),不是设白色

现象:把 Color 设回白色后,高亮区域仍有可见填充,打印/转 PDF 与"无色"不一致。

结论:清除统一用 Interior.ColorIndex = -4142xlNone),这才是真正的"无填充"。

坑 8:事件注册失败是静默降级

现象:注册 SheetSelectionChange 失败时功能完全失效,但无任何界面提示。

处理:try/catch + 日志落 PluginStoragelw_et_log,保留最近 50 条)。

排查路径:用户反馈"高亮没反应"→ 先查 lw_et_log 是否有 event reg fail,再谈别的。

坑 9:状态存储双机制混用

现象:开关键状态存 wps.PluginStorageHL_KEY),颜色选择却存 localStorageHL_COLOR_KEY)。

注意:功能上没问题,但维护时容易忘记"哪个状态在哪个存储里",建议新代码统一走 PluginStorage

六、容易被忽略的两点(打印与导出)

  1. 高亮是"颜色"不是"图层":淡色是混入白色算出来的,打印/导出 PDF 时会原样输出;

  1. 黑白打印场景:如果下游要求黑白打印,浅色高亮可能被当作灰底输出,建议打印前关闭高亮(removeAllHL 已实现全工作簿清理)。

七、排错速查表

现象

优先排查

高亮完全没反应

lw_et_log 是否 event reg fail

颜色诡异不对

是否走了 rgbToBGR 字节序翻转

切换选格后有残留色块

涂/清范围是否一致;HL_LAST_KEY 记录是否跨簿混用

底色被洗

已知限制,直接填色方案造成

打印带灰底

高亮颜色随打印输出,打印前先关闭

八、改进路线建议

  1. 底色保护可选:评估条件格式 + 局部重算方案的性能,若能压住,可提供"不破坏底色"模式;

  1. 自绘叠加层:长线方案是自绘 Overlay(类似 Canvas 覆盖),彻底解耦底色与高亮,但实现成本高;

  1. 配置收敛:状态存储统一到 PluginStorage,去掉双机制;

  1. 补充验收清单:多工作簿切换、合并单元格场景、冻结窗格下的表现,都值得补自动化验收。

九、打包

效果

为避免自己手工操作麻烦和错误,制作一个exe一键安装,以后安装在其他电脑爽歪歪

经验来自于灵犀踩坑经验总结!!

总体而言针对于一个不懂代码的人而言,有点难度,前期把发现的问题逐项告诉灵犀,一个一个解决,慢慢把问题减少,实在用这个方法解决不掉的,及时换个方式,否则AI可能在这陷入死循环,如果有那个地方有成功的经验,提供给AI,会事半功倍!,还是有点小瑕疵,比如这个一个表格改颜色,其他的都跟着变,不是互相独立的!!望体谅,同时建议使用AI制作时先使用小体量的ai模型,虽然慢,但是省钱呀!

最后也希望wps的高亮行列能够实现这方面问题,小伙伴们就不用自己手搓了

WPS从入门到精通—操作技巧指南
@WPS办公技巧
浏览 158
收藏
11
分享
11 +1
2
+1
全部评论 2
 
临商珑胜
临商珑胜 Lv.1 新人创作者

Lv.1 新人创作者

期待WPS更好的功能,朋友们都来支持!
举报
0
1
嘉禾宝宝
嘉禾宝宝WPS寻令官Lv.2 潜力创作者

Lv.2潜力创作者

仪器加油
· 安徽省
举报
0
0