找回密码
 立即注册

QQ登录

只需一步,快速开始

mfkpie8
论坛元老   /  发表于:2024-12-9 16:05  /   查看:144  /  回复:9
1金币
本帖最后由 mfkpie8 于 2024-12-9 19:50 编辑

原官方的没有支持表格的说明

请增加文字高亮显示支持表格或el表格里面的内容

普通的表格跟el表格的内容支持
高亮显示搜索关键字支持表格内的文字。需要js来实现d

最佳答案

查看完整内容

原生表格 缓存:缓存表格对象和上次查询结果以提升执行和渲染性能 获取原生表格操作对象并缓存 搜索对应列中的值后进行渲染 EL表格 写在末尾,因为是直接对页面上的数据查询,所以应该适用于数据源为数据库和JSON两种类型,这里是通过循环进行匹配查询的。

9 个回复

倒序浏览
最佳答案
最佳答案
二麻子
中级会员   /  发表于:2024-12-9 16:05:44
来自 4#
本帖最后由 二麻子 于 2024-12-10 11:06 编辑

原生表格


缓存:缓存表格对象和上次查询结果以提升执行和渲染性能

获取原生表格操作对象并缓存
  1. // 找到带有 fgcname 的父级 DIV
  2. const con = document.querySelector("div[fgcname='表格1']");
  3. let spreadInstance;
  4. if (con) {
  5.     console.log("找到父级 DIV:", con);
  6.     spreadParent = con.querySelector(".spreadDiv[gcuielement='gcSpread']");
  7.     // 获取绑定的 SpreadJS 实例
  8.     spreadInstance = GC.Spread.Sheets.findControl(spreadParent);
  9. }

  10. // 获取工作表
  11. const sheet = spreadInstance.getActiveSheet();
  12. Forguncy.Page.getCell("obj_page").setValue(sheet);

复制代码


搜索对应列中的值后进行渲染
  1. // 上一次查询的结果
  2. let cachedRows = Forguncy.Page.getCell("row_page").getValue() || [];
  3. const sheet = Forguncy.Page.getCell("obj_page").getValue();

  4. var columnIndex = 0;  // 查找列
  5. var searchValue = Forguncy.CommandHelper.getVariableValue("target");  // 查找的值
  6. var rowCount = sheet.getRowCount();
  7. var foundRows = [];  // 用于保存当前查询匹配的行号

  8. clearPreviousHighlights(sheet, cachedRows);

  9. // 遍历列,查找模糊匹配值
  10. for (var row = 0; row < rowCount; row++) {
  11.     var cellValue = sheet.getValue(row, columnIndex);
  12.     if (cellValue && cellValue.indexOf(searchValue) !== -1) {
  13.         foundRows.push(row);  
  14.     }
  15. }

  16. // 打印结果
  17. if (foundRows.length > 0) {
  18.     console.log("值 '" + searchValue + "' 在以下行找到: " + foundRows.map(row => row + 1).join(", "));
  19. } else {
  20.     console.log("未找到值 '" + searchValue + "'。");
  21. }

  22. highlightRows(sheet, foundRows);

  23. // 更新缓存为当前查询结果
  24. cachedRows = foundRows.slice();
  25. Forguncy.Page.getCell("row_page").setValue(cachedRows);

  26. // 清除上一次高亮函数
  27. function clearPreviousHighlights(sheet, cachedRows) {
  28.     if (cachedRows.length > 0) {
  29.         cachedRows.forEach(rowIndex => {
  30.             let defaultStyle = new GC.Spread.Sheets.Style();
  31.             sheet.getRange(rowIndex, 0, 1, sheet.getColumnCount()).setStyle(defaultStyle);
  32.         });
  33.     }
  34. }

  35. // 高亮当前查询匹配的行
  36. function highlightRows(sheet, foundRows) {
  37.     let highlightStyle = new GC.Spread.Sheets.Style();
  38.     highlightStyle.font = "bold 14px Arial";
  39.     highlightStyle.foreColor = "white";  
  40.     highlightStyle.backColor = "green";  

  41.     if (foundRows.length > 0) {
  42.         foundRows.forEach(rowIndex => {
  43.             sheet.getRange(rowIndex, 0, 1, sheet.getColumnCount()).setStyle(highlightStyle);
  44.         });
  45.     }
  46. }
复制代码
EL表格

  1. const wrapper = document.querySelector("div[fgcname='elTable']");
  2. let highlightedRows = Forguncy.Page.getCell("cache_page").getValue() || []; // 用于存储已高亮的行

  3. if (wrapper) {
  4.     const tables = wrapper.querySelectorAll("table");
  5.     tables.forEach(table => {
  6.         const rows = table.querySelectorAll("tr"); // 获取所有行

  7.         const columnIndex = 1; // 查询第2列(索引从0开始)
  8.         const searchValue = Forguncy.Page.getCell("target").getValue(); // 要查询的特定值

  9.         // 在查询新值之前,先恢复之前高亮的行样式
  10.         highlightedRows.forEach(row => {
  11.             const cells = row.querySelectorAll("td, th");
  12.             cells.forEach(cell => {
  13.                 cell.style.backgroundColor = ""; // 恢复背景色
  14.                 cell.style.color = ""; // 恢复字体颜色
  15.             });
  16.         });

  17.         // 清空已高亮的行记录
  18.         highlightedRows = [];

  19.         rows.forEach(row => {
  20.             const cells = row.querySelectorAll("td, th"); // 获取每行的单元格
  21.             if (cells[columnIndex] && cells[columnIndex].textContent.trim() === searchValue) {
  22.                 // 高亮整行
  23.                 cells.forEach(cell => {
  24.                     cell.style.backgroundColor = "blue"; // 设置每个单元格的背景色
  25.                     cell.style.color = "white"; // 设置每个单元格的字体颜色
  26.                 });
  27.                 highlightedRows.push(row); // 记录已高亮的行
  28.             }
  29.         });

  30.         // 更新已高亮的行数据
  31.         Forguncy.Page.getCell("cache_page").setValue(highlightedRows);
  32.     });

  33. } else {
  34.     console.warn("未找到具有 fgcname='elTable' 的div元素。");
  35. }
复制代码

写在末尾,因为是直接对页面上的数据查询,所以应该适用于数据源为数据库和JSON两种类型,这里是通过循环进行匹配查询的。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
二麻子
中级会员   /  发表于:2024-12-9 17:23:09
2#
是这个效果吗


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
mfkpie8
论坛元老   /  发表于:2024-12-9 19:50:54
3#

高亮显示搜索关键字支持表格内的文字。需要js来实现的你这样子是全部背景了
回复 使用道具 举报
mfkpie8
论坛元老   /  发表于:2024-12-10 13:06:33
5#

能把关键启单个高亮起来吗?不要全亮单个可以不
回复 使用道具 举报
二麻子
中级会员   /  发表于:2024-12-10 13:37:01
6#
本帖最后由 二麻子 于 2024-12-10 13:53 编辑
mfkpie8 发表于 2024-12-10 13:06
能把关键启单个高亮起来吗?不要全亮单个可以不

这段代码添加到原先的代码中,这里提供了一个参数,由数组控制亮起的列。将原先控制高亮的方法注释掉,启用这个新方法。
  1. // 高亮指定单列或者多列中的匹配行
  2. function highlightRows(sheet, foundRows, targetColumns) {
  3.     let highlightStyle = new GC.Spread.Sheets.Style();
  4.     highlightStyle.font = "bold 14px Arial";
  5.     highlightStyle.foreColor = "white";  
  6.     highlightStyle.backColor = "green";  

  7.     if (foundRows.length > 0) {
  8.         foundRows.forEach(rowIndex => {
  9.             targetColumns.forEach(colIndex => {
  10.                 // 获取当前列的单元格
  11.                 sheet.getRange(rowIndex, colIndex, 1, 1).setStyle(highlightStyle);
  12.             });
  13.         });
  14.     }
  15. }
复制代码

EL表格的则将代码修改为下面的
  1. const wrapper = document.querySelector("div[fgcname='elTable']");
  2. const searchValue = Forguncy.Page.getCell("target").getValue(); // 要查找的值
  3. const columnIndex = 1; // 要查找的列索引(第2列)
  4. const targetColumns = [0, 2]; // 高亮第1列和第3列
  5. highlightRowsInTable(wrapper, searchValue, columnIndex, targetColumns);



  6. // 高亮某列或整行的单元格
  7. function highlightRowsInTable(wrapper, searchValue, columnIndex, targetColumns = null) {
  8.     const tables = wrapper.querySelectorAll("table");

  9.     // 记录高亮的行
  10.     let highlightedRows =  Forguncy.Page.getCell("cache_page").getValue() || [];

  11.      // 在查询新值之前,先恢复之前高亮的行样式
  12.     highlightedRows.forEach(row => {
  13.             const cells = row.querySelectorAll("td, th");
  14.             cells.forEach(cell => {
  15.                 cell.style.backgroundColor = "";
  16.                 cell.style.color = "";
  17.             });
  18.         });

  19.      // 清空已高亮的行记录
  20.     highlightedRows = [];

  21.     tables.forEach(table => {
  22.         const rows = table.querySelectorAll("tr");

  23.         rows.forEach(row => {
  24.             const cells = row.querySelectorAll("td, th");

  25.             // 如果当前列的单元格内容与搜索值匹配
  26.             if (cells[columnIndex] && cells[columnIndex].textContent.trim() === searchValue) {
  27.                 // 判断是否高亮特定列
  28.                 if (targetColumns) {
  29.                     targetColumns.forEach(colIndex => {
  30.                         if (cells[colIndex]) {
  31.                             cells[colIndex].style.backgroundColor = "blue";
  32.                             cells[colIndex].style.color = "white";
  33.                         }
  34.                     });
  35.                 } else {
  36.                     // 如果没有指定列,则高亮整行
  37.                     cells.forEach(cell => {
  38.                         cell.style.backgroundColor = "blue";
  39.                         cell.style.color = "white";
  40.                     });
  41.                 }
  42.                 highlightedRows.push(row);
  43.             }
  44.         }
  45.     );}
  46.    
  47.     );
  48.     Forguncy.Page.getCell("cache_page").setValue(highlightedRows);
  49.     console.log(`查询值 "${searchValue}" 的行已成功高亮。`);
  50. }
复制代码




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
mfkpie8
论坛元老   /  发表于:2024-12-10 15:36:00
7#


模糊查询 的逻辑可以吗?整个表格任意字。js模糊匹配字符串 亮符的逻辑

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
二麻子
中级会员   /  发表于:2024-12-10 17:21:29
8#
mfkpie8 发表于 2024-12-10 15:36
模糊查询 的逻辑可以吗?整个表格任意字。js模糊匹配字符串 亮符的逻辑

修改后的文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
mfkpie8
论坛元老   /  发表于:2024-12-11 13:52:00
9#

非常感谢您 大佬。我想全表格就是普通的表格。我再看一下您 的代码,是所有的列,好比ctrl+f查找的逻辑,
整个表格高亮可以不,在哪一个列里面。
回复 使用道具 举报
二麻子
中级会员   /  发表于:2024-12-11 14:17:23
10#
你的意思是对所有列进行搜索?需要通过双重循环遍历每一个单元格,这个性能就没法保证了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部