c#中的多语言excel格式条件公式

Multilanguage excel format conditions formula in c#

这是我的第一个问题,希望一切顺利。

我正在尝试将某种格式(例如背景颜色)应用于 excel 范围的偶数行或奇数行。我正在尝试使用 FormatCondition.Add 方法。

问题是应用程序必须以不同的 excel 语言(如西班牙语)运行。当我在 Add 方法中使用公式 =MOD(ROW(),2) 将格式仅应用于偶数行或奇数行时,它会抛出一个参数异常。这里是西班牙语:

System.ArgumentException: El valor no está dentro del intervalo esperado.

这是我对异常的最佳翻译:

System.ArgumentException: The value isn't between the expected interval.

问题似乎是公式中的 , 字符。如果我使用 ;,异常就会消失,但是 excel 不会翻译公式,所以当我用西班牙语打开 excel 文件时,条件格式不起作用。我必须使用公式 =RESIDUO(FILA();2) 的西班牙语版本,但它在英语中不起作用。如果将公式放在某个随机单元格中,它会很好地工作(所以我认为公式没有错):

excelSheet.Cells[1, 1] = "=MOD(ROW(),2)";

我的问题是:如何在 FormatConditions.Add 方法中使用多语言公式?

我的代码如下所示:

excelRange = excelRange.FormatConditions.Add(Excel.XlFormatConditionType.xlExpression,
                                             Formula1: "=MOD(ROW(),2)=" + par);

"par"是一个变量,用来区分偶数或奇数。

我试过改变线程文化:

System.Globalization.CultureInfo before = System.Threading.Thread.CurrentThread.CurrentCulture;
            try
            {
                System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
                excelRange = excelRange.FormatConditions.Add(Excel.XlFormatConditionType.xlExpression, Formula1: "=MOD(ROW(),2)=" + par);
            }
            finally
            {
                System.Threading.Thread.CurrentThread.CurrentUICulture = before;
            }

并使用 Type.InvokeMember 方法定义文化信息:

Excel.FormatConditions aux = excelRange.FormatConditions;
Object[] args = { Excel.XlFormatConditionType.xlExpression, Type.Missing, "=MOD(ROW(),2)=" + par };
excelRange = aux.GetType().InvokeMember("Add",
                                        System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,
                                         null,
                                         aux,
                                         args,
                                         culture: new System.Globalization.CultureInfo("en-US"));

但结果总是一样。

如果您有一些线索可以帮助我,我们将不胜感激。感谢大家。

P.S: 对不起我的英语,我希望我解释得还不错。

我找到了解决方案(不是我认为的最佳解决方案,但无论如何...)。我的想法来自 here

基本思想是使用单个单元格将公式放入英文,然后从 Range.FormulaLocal property:

中获取翻译后的公式
Excel.Range temp = excelSheet.get_Range("a1");
dynamic tempValue = temp.Value2;
temp.Formula = "=MOD(ROW(),2)=" + par;
String formula = temp.FormulaLocal;
temp.Formula = "";
temp.Value2 = tempValue;
excelRange = excelRange.FormatConditions.Add(Excel.XlFormatConditionType.xlExpression, Formula1: formula);

我希望这对以后的人有所帮助。