使用Excel Interop设置含引号公式触发0x800A03EC错误求助
问题:Interop.Excel设置带引号的匈牙利语公式触发0x800A03EC错误
问题详情
- 使用Microsoft.Office.Interop.Excel库,需要给Excel单元格区域设置匈牙利语公式:
=HA(VAGY(C2="83V";C2="8U";C2="9V");"nem";"igen")(对应英文公式:=IF(OR(C2="83V";C2="8U";C2="9V");"no";"yes")) - 复制公式到Visual Studio后,字符串自动被转义为:
"=HA(VAGY(C2=\"83V\";C2=\"8U\";C2=\"9V\");\"nem\";\"igen\")" - 执行
myRange.Formula = formula时触发0x800A03EC错误,不含引号的公式可正常运行,尝试过双引号方案仍未解决
代码片段
/* Set formulas in kifiz sheet*/ string formula1 = "=HA(VAGY(C2=\"83V\";C2=\"8U\";C2=\"9V\");\"nem\";\"igen\")"; ExcelMethods.setColumnFormula(kifiz, 2, 35, lastIndexKifiz, formula1); //ExcelMethods is my class which makes me the work easier. //setColumnFormula contains these line: myRange.Formula = formula; //i get the error in this line /*---*/
完整错误信息
System.Runtime.InteropServices.COMException (0x800A03EC): 0x800A03EC at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Object[] aArgs, Boolean[] aArgsIsByRef, Int32[] aArgsWrapperTypes, Type[] aArgsTypes, Type retType) at Microsoft.Office.Interop.Excel.Range.set_Formula(Object ) at ExcelMethods.setRangeFormula(Worksheet ws, Int32 startRow, Int32 startColumn, Int32 endRow, Int32 endColumn, String formula) in C:\Users\meszaros.joshua\source\repos\KarEsTartalekLista\KarEsTartalekLista\Methods.cs:line 84 at ExcelMethods.setColumnFormula(Worksheet ws, Int32 startRow, Int32 column, Int32 endRow, String formula) in C:\Users\meszaros.joshua\source\repos\KarEsTartalekLista\KarEsTartalekLista\Methods.cs:line 89 at KarEsTartalekLista.Form1.uzsgyi_Click(Object sender, EventArgs e) in C:\Users\meszaros.joshua\source\repos\KarEsTartalekLista\KarEsTartalekLista\Form1.cs:line 103 at System.Windows.Forms.Button.OnClick(EventArgs e) at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ButtonBase.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(HWND hWnd, MessageId msg, WPARAM wparam, LPARAM lparam)
解决方案
核心问题
Interop.Excel的Formula属性有严格规则:必须使用英文函数名和逗号作为参数分隔符,同时公式中的字符串引号需要用C#的双引号转义(""),而非反斜杠转义。若想用本地语言函数和分号分隔符,需改用FormulaLocal属性。
可行方案
方案1:保留匈牙利语公式,使用FormulaLocal属性
把公式中的反斜杠转义改为双引号转义,然后赋值给FormulaLocal:
string formula1 = "=HA(VAGY(C2=""83V"";C2=""8U"";C2=""9V"");""nem"";""igen"")"; myRange.FormulaLocal = formula1;
方案2:切换为英文公式,使用Formula属性
改用英文函数名和逗号分隔符,同样用双引号转义字符串:
string formula2 = "=IF(OR(C2=""83V"",C2=""8U"",C2=""9V""),""no"",""yes"")"; myRange.Formula = formula2;
关键注意事项
- C#中表示Excel公式里的单个双引号,必须写两个连续双引号(
""),反斜杠转义仅适用于C#字符串本身,Excel无法识别。 Formula属性强制使用英文函数和逗号分隔符,不受系统区域设置影响;FormulaLocal则遵循系统区域设置的函数名和分隔符(如匈牙利语的分号)。
内容的提问来源于stack exchange,提问作者josh11
相关产品推荐
相关产品推荐

