找回密码
 立即注册

QQ登录

只需一步,快速开始

nutstore
金牌服务用户   /  发表于:2022-10-13 19:35  /   查看:1033  /  回复:6
1金币
找不到range.zip (47.51 KB, 下载次数: 43)

最佳答案

查看完整内容

你所谓的找得到那个经过测试也同样拿不到range 所以不存在一个找得到一个找不到的情况 之所以找不到的原因是因为您的公式中设置的是R1C1引用而非a1这种引用方式 将其改为A1的引用方式后即可正常拿到 另外,看了一下expression.getRange 确实是内部方法,那么你不用的话也是对的。

6 个回复

倒序浏览
最佳答案
最佳答案
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-10-13 19:35:17
来自 7#
本帖最后由 Clark.Pan 于 2022-10-14 11:05 编辑


你所谓的找得到那个经过测试也同样拿不到range
image.png177920531.png
所以不存在一个找得到一个找不到的情况
之所以找不到的原因是因为您的公式中设置的是R1C1引用而非a1这种引用方式
image.png262152709.png
image.png756820373.png
将其改为A1的引用方式后即可正常拿到
image.png978518981.png


另外,看了一下expression.getRange 确实是内部方法,那么你不用的话也是对的。
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-10-14 09:13:39
2#
经测试,可以拿到range以及对应的sheet名称
image.png707332458.png
回复 使用道具 举报
nutstore
金牌服务用户   /  发表于:2022-10-14 09:32:47
3#
本帖最后由 nutstore 于 2022-10-14 09:38 编辑
Clark.Pan 发表于 2022-10-14 09:13
经测试,可以拿到range以及对应的sheet名称

为啥转换成 formula之后就无法拿到,且 Expression 的类型声明并没有暴露 getRange source 这些方法的 typescript代码中是无法正常使用的
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-10-14 09:56:00
4#
你是如何转换成formula操作的?相关代码发来看看

且 Expression 的类型声明并没有暴露 getRange source 这些方法的 typescript代码中是无法正常使用的
这个自己可以在SpreadJS安装目录下的definition文件夹中的ts.d文件中自行添加
回复 使用道具 举报
nutstore
金牌服务用户   /  发表于:2022-10-14 10:35:34
5#
Clark.Pan 发表于 2022-10-14 09:56
你是如何转换成formula操作的?相关代码发来看看

且 Expression 的类型声明并没有暴露 getRange source  ...

就像是在demo中的操作一样

具体代码

export function getNameInfo(
  workbook: GCWorkbook,
  customName: string,
): Spread.Sheets.NameInfo | undefined {
  return workbook
    .getCustomNames()
    .find(nameinfo => nameinfo.getName() === customName)
}

// 这个函数可能不是必要的,看起来和直接调用 `getRangeFromFormula(workbook, customName)`
// 的返回值一样
export function getCellRangeByCustomName(
  workbook: GCWorkbook,
  customName: string,
): GCCellRange | null {
  const nameinfo = getNameInfo(workbook, customName)
  if (!nameinfo || nameinfo instanceof Spread.CalcEngine.CalcError)
    return null

  const formula = Spread.Sheets.CalcEngine.expressionToFormula(
    workbook.getActiveSheet(),
    nameinfo.getExpression(),
  )

  return Workbook.getRangeFromFormula(workbook, formula)
}
export function getRangeFromFormula(
  workbook: GCWorkbook,
  formula: string,
): GCCellRange | null {
  const formulaRanges = formulaToRanges(workbook.getActiveSheet(), formula)

  const [formulaRange] = formulaRanges
  if (!formulaRange) return null
  const [range] = formulaRange.ranges
  if (!range) return null

  return workbook
    .getSheetFromName(formulaRange.sheetName)
    ?.getRange(range.row, range.col, range.rowCount, range.colCount)
}
export function formulaToRanges(
  ...args: Parameters<typeof Spread.Sheets.CalcEngine.formulaToRanges>
): {
  sheetName: string
  ranges: Spread.Sheets.Range[]
}[] {
  return Spread.Sheets.CalcEngine.formulaToRanges(...args) as any
}
回复 使用道具 举报
nutstore
金牌服务用户   /  发表于:2022-10-14 10:43:58
6#
Clark.Pan 发表于 2022-10-14 09:56
你是如何转换成formula操作的?相关代码发来看看

且 Expression 的类型声明并没有暴露 getRange source  ...

没看明白在defintion下d.ts文件自行添加 这句话。
说实话没有你们官方文件中没有声明的方法,我不是很敢使用,这种私有属性万一发生变更出了问题,也不好排查
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部