1

セルを参照する SUMIF を含む数式をスプレッドシートに追加しようとしています。追加しようとしている式のコードは次のとおりです。

addFormula("(100 * " + dRangeCell + " / 256) * (SUMIF(B" + (dip.start+1) + ":B" + (dip.end+1) + ",\"<\"&" + dbThresholdCell + ")) / " + profile.getImageWidth(), 
            dipAreaPercentageCol, row, sheet, highlightedFormat);

重要な部分は SUMIF の条件です。ここでは、値が別のセルの値よりも小さい場合に合計を計算しようとしています。

コードを実行すると、次のエラーが発生します。

Warning:  Lexical error:   (100 * D18 / 256) * (SUMIF(B1:B2,"<"&D21)) / 332 at char  36 when parsing formula (100 * D18 / 256) * (SUMIF(B1:B2,"<"&D21)) / 332 in cell Profile!N24

それが不平を言っている文字はアンパサンドです。ただし、その正確な数式を Excel のスプレッドシートに貼り付けると、完全に機能します。

JExcel はアンパサンドを適切に解析する方法を知りませんか? 私の状況の回避策はありますか?

4

1 に答える 1

0

a&b の代わりに concatenate(a,b) を使用すると、目的の効果が得られます。上記の例は、&and&and&and のような単一レベルの連結のみを処理します。つまり、(and&and)& をネストしたい場合は、正規表現をいじる必要があります –</p>

if (colElement.attributeValue("type").equals(CellType.STRING_FORMULA.toString())) {
  WritableCellFormat wcf = new WritableCellFormat();
  Pattern pattern = Pattern.compile("^([^&]+)&(.*)$");
  for (Matcher m = pattern.matcher(t); m.matches(); m=pattern.matcher(t)) {
    t = "CONCATENATE(" + m.group(1) +  "," + m.group(2) + ")";
  }
  sheet.addCell(new jxl.write.Formula(x, y, t));

}
于 2014-04-09T08:32:36.343 に答える