Java - IF 函数与 OR 使用数组 - Apache POI

Java - IF Function with OR using an array - Apache POI

我有一个数组,它的长度会随着用户输入新数字而改变,并且当条件为 TRUE 时,我需要单元格的值为 0。例如,用户在数组中输入:“201”和“500”,因此公式为 =IF(OR(N2=500, N2=201),0,F2),则 =IF(OR(N3=500, N3=201),0,F3) 直到最后一行。我想出了这段代码,但第二个 OR 条件是一样的,因为 i 它仍然是一样的

    int arr[] = {500,201};
    int i;
         
        for (i = 0; i < arr.length; i++){

int cRow2 = 1;
        int b = 2;
        Row newRow2 = firstSheet.getRow(cRow2);

while (newRow2 != null) {
            Cell cell3 = newRow2.createCell(12);
            cell3.setCellFormula("IF(OR(N"+b+"="+arr[i]+", N"+b+"="+arr[i]+"),0,F"+b+")");
            b++;
            cRow2++;
            newRow2 = firstSheet.getRow(cRow2);
        }
    }

有没有一种方法可以使用 arr[0] 和 arr[1] 这两个空格,但在用户输入数字时自动执行多次?

您必须遍历数组并为数组中的每个值创建一个 'entry' (NX=Value)。 这可以通过多种方式完成。

String joined = Arrays.stream( arr )
          .mapToObj( val -> String.format( "N%d=%d", current, val ) )
          .collect( Collectors.joining(",") );

在这个例子中,我使用的流正是这样做的,并通过“,”字符连接所有结果部分。生成的字符串类似于“N6=500,N6=201,N6=501,N6=211”,然后可以轻松地将其格式化为公式:

String result = String.format( "IF(OR(%s),0,F%d)", joined, b );

完成了。现在你有一个公式来计算数组中任意数量的值。

我用于测试的完整代码块:

int[] arr = { 500, 201, 501, 211 };
int b = 2;

while( b < 10 )
{
    int current = b;
    String joined = Arrays.stream( arr )
        .mapToObj( val -> String.format( "N%d=%d", current, val ) )
        .collect( Collectors.joining(",") );
    String result = String.format( "IF(OR(%s),0,F%d)", joined, b );
    b++;
    System.out.println(result);
}

如果您不熟悉 Java-streams,您可以简单地用 foreach-loop:

替换流
StringJoiner joiner = new StringJoiner( "," );
for( int val : arr )
{
    String format = String.format( "N%d=%d", current, val );
    joiner.add( format );
}
String joined = joiner.toString();