ExcelDNA C# UDF跨工作表引用处理异常问题排查求助
ExcelDNA C# UDF跨工作表引用处理异常问题排查求助
我目前在维护一个用C#/ExcelDNA开发的Excel UDF插件,最近在清理一个叫C_Formula的UDF代码时遇到了跨工作表引用的问题,卡了好一阵,想请大家帮忙分析下。
先简单说下这个UDF的功能:用户通过=C_Formula(单元格引用)调用它,它会解析目标单元格里的公式文本,提取其中嵌套的所有单元格引用,然后把这些引用对应的显示值替换回公式里(相当于把公式展开成计算用的数值)。
目前同工作表内的单元格引用都能正常处理,但只要涉及其他工作表的引用(比如Sheet2!D27这种),要么直接导致Excel崩溃,要么返回错误值。
我排查后觉得问题应该出在跨工作表引用的解析和取值环节,下面是相关的代码片段:
处理工作表名称的核心逻辑
// 检测到跨工作表引用的分隔符"!" if (strI == "!") { int sheetEnd = i - 1; strSheet = strFormText.Substring(p1, sheetEnd - p1 + 1); // 处理带空格的工作表名称,添加单引号包裹 if (strSheet.Contains(" ")) strSheet = "'" + strSheet + "'"; strSheet += "!"; p1 = i + 1; i++; goto STARTLOOP; }
尝试获取单元格引用值的逻辑
// 验证字符串是否为有效单元格引用并取值 try { // 拼接完整的跨工作表单元格地址 strCell = strSheet + strCell; // 通过xlfIndirect获取单元格引用 ExcelReference refCell = (ExcelReference)Excel(xlfIndirect, strCell, true); object val = refCell.GetValue(); // 获取单元格的数字格式 string format = (string)Excel(xlfGetCell, 7, refCell); // 把值格式化为Excel中显示的文本形式 strCell = (string)Excel(xlfText, val, format); } // 处理无法转换的情况(空单元格、纯数字等) catch (InvalidCastException) { if (objCell is ExcelEmpty) strCell = "0"; else if (ToolsArgs.ChkStringDouble(strCell)) { // 若为纯数字则不做处理 } else if (strList.Contains(strH)) strCell = ""; } catch { strFormula = "CatchAll 3"; }
我调试时发现,当处理Sheet2!D27这种引用时,strCell确实能正确拼接成Sheet2!D27,但执行到ExcelReference refCell = (ExcelReference)Excel(xlfIndirect, strCell, true);这一行之后,要么抛出异常进入catch分支,要么直接导致Excel无响应。
我怀疑是不是xlfIndirect的使用方式有问题?或者跨工作表的引用在转换为ExcelReference时有没有什么特殊的处理我没考虑到?比如带空格的工作表名称我已经加了单引号包裹,但还是不行。
有没有遇到过类似问题的朋友,或者能帮我指出代码里的潜在问题?
内容来源于stack exchange
相关产品推荐
相关产品推荐

