找回密码
 立即注册

QQ登录

只需一步,快速开始

Winny

超级版主

141

主题

261

帖子

1682

积分

超级版主

Rank: 8Rank: 8

积分
1682
Winny
超级版主   /  发表于:2021-10-27 14:32  /   查看:2772  /  回复:0
本帖最后由 Winny 于 2021-10-27 14:34 编辑

在实际的项目需求中,不少用户有需要在整个Workbook上去查找单元格上特定的内容,本文就此需求,介绍两种实现方案。

1. 遍历整个Workbook的所有单元格。
  1. function hitSearch(){
  2.                 let searchText = 3
  3.                 let results = []
  4.                 for(let i = 0; i<spread.getSheetCount();i++){
  5.                     let sheet = spread.getSheet(i)
  6.                     let rows = sheet.getRowCount()
  7.                     let cols = sheet.getColumnCount()
  8.                     for(let m=0; m<rows;m++){
  9.                         for(let n=0; n<cols;n++){
  10.                             let value = sheet.getValue(m,n)      //如果要判断公式可以使用getFormula()
  11.                             if(value){
  12.                                 let index = value.toString().indexOf(searchText)  //此处也可以换成正则匹配
  13.                                 index!==-1 && results.push({
  14.                                     sheetIndex: i,
  15.                                     row: m,
  16.                                     col: n
  17.                                 })
  18.                             }
  19.                         }
  20.                     }
  21.                 }
  22.                 return results
  23.             }
复制代码
通过上述代码段,即可实现特定内容查找的需求。

2. 使用searchCondition来实现内容匹配

  1. let searchCondition = new GC.Spread.Sheets.Search.SearchCondition()
  2.             searchCondition.searchString = searchText
  3.             searchCondition.searchTarget = GC.Spread.Sheets.Search.SearchFoundFlags.cellText;
  4.             //搜索忽略带小写,可以用通配符
  5.             searchCondition.searchFlags = GC.Spread.Sheets.Search.SearchFlags.ignoreCase| GC.Spread.Sheets.Search.SearchFlags.useWildCards
  6.             searchCondition.rowEnd = sheet.getRowCount() - 1
  7.             searchCondition.columnEnd = sheet.getColumnCount() - 1
  8.             var results = []             //搜索结果数组
  9.             var searchResult = {}        //单次搜索结果
  10.             //循环sheet查询
  11.             const beginTime = new Date()
  12.             for(let i=0; i<spread.getSheetCount();i++){
  13.                 searchCondition.startSheetIndex = i
  14.                 searchCondition.endSheetIndex = i
  15.                 searchCondition.rowStart = 0
  16.                 searchCondition.columnStart = 0
  17.                 allSearch(i)
  18.             }
  19.             const endTime = new Date()
  20.             console.log('searchCondition:', endTime-beginTime)
  21.             function allSearch(i){
  22.                 searchResult = spread.search(searchCondition)
  23.                 // 扩展搜索结果加入sheet索引,原生的结果没有sheet的信息
  24.                 searchResult.sheetIndex = i
  25.                 searchResult && results.push(searchResult)
  26.                 sheet.setActiveCell(searchResult.foundRowIndex,searchResult.foundColumnIndex)
  27.                 while(searchResult.searchFoundFlag != 0){
  28.                     searchCondition.rowStart = searchResult.foundRowIndex
  29.                     searchCondition.columnStart = searchResult.foundColumnIndex+1
  30.                     searchResult = spread.search(searchCondition)
  31.                     searchResult.sheetIndex = i
  32.                     searchResult.searchFoundFlag && results.push(searchResult)
  33.                 }
  34.             }
复制代码


既然有两种实现方法,有客户就会觉得第二中方法会比第一种高级一些。但其实并不然,实现方法并没有好坏之分,只有合适与不合适之分,大部分情况下,用第一种方法虽然代码简陋,但原理简单。当表单中含有大量空白单元格时,第一种方法的速度会更快。

以附件工程为例(测试文件见下方,测试时将引用的文件先做一下替换,替换成本地自己的产品资源),测试出来的执行时间如下,可以看出第一种方法的执行速度要远高于第二种方法:
image.png162451781.png
PS: 如若想要同时实现查找替换,可以在查找时重新给单元格赋值即可,这个功能就交给大家自己探索啦~


2.5_查找内容.html

5.57 KB, 下载次数: 63

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部