本帖最后由 Winny 于 2021-10-27 14:34 编辑
在实际的项目需求中,不少用户有需要在整个Workbook上去查找单元格上特定的内容,本文就此需求,介绍两种实现方案。
1. 遍历整个Workbook的所有单元格。
- function hitSearch(){
- let searchText = 3
- let results = []
- for(let i = 0; i<spread.getSheetCount();i++){
- let sheet = spread.getSheet(i)
- let rows = sheet.getRowCount()
- let cols = sheet.getColumnCount()
- for(let m=0; m<rows;m++){
- for(let n=0; n<cols;n++){
- let value = sheet.getValue(m,n) //如果要判断公式可以使用getFormula()
- if(value){
- let index = value.toString().indexOf(searchText) //此处也可以换成正则匹配
- index!==-1 && results.push({
- sheetIndex: i,
- row: m,
- col: n
- })
- }
- }
- }
- }
- return results
- }
复制代码 通过上述代码段,即可实现特定内容查找的需求。
2. 使用searchCondition来实现内容匹配
- let searchCondition = new GC.Spread.Sheets.Search.SearchCondition()
- searchCondition.searchString = searchText
- searchCondition.searchTarget = GC.Spread.Sheets.Search.SearchFoundFlags.cellText;
- //搜索忽略带小写,可以用通配符
- searchCondition.searchFlags = GC.Spread.Sheets.Search.SearchFlags.ignoreCase| GC.Spread.Sheets.Search.SearchFlags.useWildCards
- searchCondition.rowEnd = sheet.getRowCount() - 1
- searchCondition.columnEnd = sheet.getColumnCount() - 1
- var results = [] //搜索结果数组
- var searchResult = {} //单次搜索结果
- //循环sheet查询
- const beginTime = new Date()
- for(let i=0; i<spread.getSheetCount();i++){
- searchCondition.startSheetIndex = i
- searchCondition.endSheetIndex = i
- searchCondition.rowStart = 0
- searchCondition.columnStart = 0
- allSearch(i)
- }
- const endTime = new Date()
- console.log('searchCondition:', endTime-beginTime)
- function allSearch(i){
- searchResult = spread.search(searchCondition)
- // 扩展搜索结果加入sheet索引,原生的结果没有sheet的信息
- searchResult.sheetIndex = i
- searchResult && results.push(searchResult)
- sheet.setActiveCell(searchResult.foundRowIndex,searchResult.foundColumnIndex)
- while(searchResult.searchFoundFlag != 0){
- searchCondition.rowStart = searchResult.foundRowIndex
- searchCondition.columnStart = searchResult.foundColumnIndex+1
- searchResult = spread.search(searchCondition)
- searchResult.sheetIndex = i
- searchResult.searchFoundFlag && results.push(searchResult)
- }
- }
复制代码
既然有两种实现方法,有客户就会觉得第二中方法会比第一种高级一些。但其实并不然,实现方法并没有好坏之分,只有合适与不合适之分,大部分情况下,用第一种方法虽然代码简陋,但原理简单。当表单中含有大量空白单元格时,第一种方法的速度会更快。
以附件工程为例(测试文件见下方,测试时将引用的文件先做一下替换,替换成本地自己的产品资源),测试出来的执行时间如下,可以看出第一种方法的执行速度要远高于第二种方法:
PS: 如若想要同时实现查找替换,可以在查找时重新给单元格赋值即可,这个功能就交给大家自己探索啦~
|
|