本帖最后由 二麻子 于 2024-12-10 11:06 编辑
原生表格
缓存:缓存表格对象和上次查询结果以提升执行和渲染性能
获取原生表格操作对象并缓存
- // 找到带有 fgcname 的父级 DIV
- const con = document.querySelector("div[fgcname='表格1']");
- let spreadInstance;
- if (con) {
- console.log("找到父级 DIV:", con);
- spreadParent = con.querySelector(".spreadDiv[gcuielement='gcSpread']");
- // 获取绑定的 SpreadJS 实例
- spreadInstance = GC.Spread.Sheets.findControl(spreadParent);
- }
- // 获取工作表
- const sheet = spreadInstance.getActiveSheet();
- Forguncy.Page.getCell("obj_page").setValue(sheet);
复制代码
搜索对应列中的值后进行渲染
- // 上一次查询的结果
- let cachedRows = Forguncy.Page.getCell("row_page").getValue() || [];
- const sheet = Forguncy.Page.getCell("obj_page").getValue();
- var columnIndex = 0; // 查找列
- var searchValue = Forguncy.CommandHelper.getVariableValue("target"); // 查找的值
- var rowCount = sheet.getRowCount();
- var foundRows = []; // 用于保存当前查询匹配的行号
- clearPreviousHighlights(sheet, cachedRows);
- // 遍历列,查找模糊匹配值
- for (var row = 0; row < rowCount; row++) {
- var cellValue = sheet.getValue(row, columnIndex);
- if (cellValue && cellValue.indexOf(searchValue) !== -1) {
- foundRows.push(row);
- }
- }
- // 打印结果
- if (foundRows.length > 0) {
- console.log("值 '" + searchValue + "' 在以下行找到: " + foundRows.map(row => row + 1).join(", "));
- } else {
- console.log("未找到值 '" + searchValue + "'。");
- }
- highlightRows(sheet, foundRows);
- // 更新缓存为当前查询结果
- cachedRows = foundRows.slice();
- Forguncy.Page.getCell("row_page").setValue(cachedRows);
- // 清除上一次高亮函数
- function clearPreviousHighlights(sheet, cachedRows) {
- if (cachedRows.length > 0) {
- cachedRows.forEach(rowIndex => {
- let defaultStyle = new GC.Spread.Sheets.Style();
- sheet.getRange(rowIndex, 0, 1, sheet.getColumnCount()).setStyle(defaultStyle);
- });
- }
- }
- // 高亮当前查询匹配的行
- function highlightRows(sheet, foundRows) {
- let highlightStyle = new GC.Spread.Sheets.Style();
- highlightStyle.font = "bold 14px Arial";
- highlightStyle.foreColor = "white";
- highlightStyle.backColor = "green";
- if (foundRows.length > 0) {
- foundRows.forEach(rowIndex => {
- sheet.getRange(rowIndex, 0, 1, sheet.getColumnCount()).setStyle(highlightStyle);
- });
- }
- }
复制代码 EL表格
- const wrapper = document.querySelector("div[fgcname='elTable']");
- let highlightedRows = Forguncy.Page.getCell("cache_page").getValue() || []; // 用于存储已高亮的行
- if (wrapper) {
- const tables = wrapper.querySelectorAll("table");
- tables.forEach(table => {
- const rows = table.querySelectorAll("tr"); // 获取所有行
- const columnIndex = 1; // 查询第2列(索引从0开始)
- const searchValue = Forguncy.Page.getCell("target").getValue(); // 要查询的特定值
- // 在查询新值之前,先恢复之前高亮的行样式
- highlightedRows.forEach(row => {
- const cells = row.querySelectorAll("td, th");
- cells.forEach(cell => {
- cell.style.backgroundColor = ""; // 恢复背景色
- cell.style.color = ""; // 恢复字体颜色
- });
- });
- // 清空已高亮的行记录
- highlightedRows = [];
- rows.forEach(row => {
- const cells = row.querySelectorAll("td, th"); // 获取每行的单元格
- if (cells[columnIndex] && cells[columnIndex].textContent.trim() === searchValue) {
- // 高亮整行
- cells.forEach(cell => {
- cell.style.backgroundColor = "blue"; // 设置每个单元格的背景色
- cell.style.color = "white"; // 设置每个单元格的字体颜色
- });
- highlightedRows.push(row); // 记录已高亮的行
- }
- });
- // 更新已高亮的行数据
- Forguncy.Page.getCell("cache_page").setValue(highlightedRows);
- });
- } else {
- console.warn("未找到具有 fgcname='elTable' 的div元素。");
- }
复制代码
写在末尾,因为是直接对页面上的数据查询,所以应该适用于数据源为数据库和JSON两种类型,这里是通过循环进行匹配查询的。
|