我正试图添加一个Excel公式来计算升级工作量的基础上,将参考其他列在同一Excel工作表的某些条件.

下面是我的公式

=@IFERROR(@IFS(C3="css", IFS(D3>0.5, "High",
 D3>0.3, "Medium", D3>0.2, "Low",D3>0,"Very Low", 
 D3=0, "None")),
 IFS(D3>0.5,"High",D3>0.3,"Medium",D3>0.2,"Low",D3>0,
 "Very Low",D3=0,"None"))

不计算公式单元格的值.当您 Select 一个单元格并按Enter键时,会出现一个弹出警告,并正确计算公式.

示例代码


import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class CreateExcekFormula {

    public static void main(String[] args) throws Exception {

        try (Workbook workbook = new XSSFWorkbook();
                FileOutputStream fileout = new FileOutputStream("ItemFilter.xlsx")) {

            Sheet dataSheet = workbook.createSheet("Data");

            Row row;
            Cell cell;
            String strFormula = "IFERROR(IFS(%s=\"css\", IFS(%s>0.5, \"High\", %s>0.3, \"Medium\", %s>0.2, \"Low\", %s>0, \"Very Low\", %s=0, \"None\")),IFS(%s>0.5, \"High\", %s>0.3, \"Medium\", %s>0.2, \"Low\", %s>0, \"Very Low\", %s=0, \"None\"))\r\n"
                    + "";
            Object[][] data = new Object[][]
                { new Object[]
                            { "Header", "Complexity", "Type of File", "Change", "Upgrade Effort" },
                  new Object[]
                  { "A", "High", "css", "1" },
                  new Object[]
                  { "A", "Low", "txt", "0.4" },
                  new Object[]
                  { "C", "Moderate", "css", "0.4" },
                  new Object[]
                  { "D", "High", "txt", "0.7" },
                  new Object[]
                  { "A", "High", "css", "0.8" },
                  new Object[]
                  { "B", "Low", "css", "0.2" },
                  new Object[]
                  { "G", "Low", "css", "0.1" },
                  new Object[]
                  { "G", "High", "properties", "0.4" },
                  new Object[]
                  { "G", "High", "css", "1" },
                  new Object[]
                  { "G", "High", "css", "0.2" },
                  new Object[]
                  { "G", "Low", "jsp", "0.8" },
                  new Object[]
                  { "H", "Low", "jsp", "0.6" },
                  new Object[]
                  { "H", "Low", "html", "0.4" } };
            for (int r = 0; r < data.length; r++) {
                row = dataSheet.createRow(r);
                Object[] rowData = data[r];
                for (int c = 0; c < rowData.length; c++) {
                    cell = row.createCell(c);
                    if (rowData[c] instanceof String) {
                        cell.setCellValue((String) rowData[c]);
                    } else if (rowData[c] instanceof Number) {
                        cell.setCellValue(((Number) rowData[c]).doubleValue());
                    }
                }
                if (rowData.length < 5) {
                    cell = row.createCell(4);
                    String fileTypeCol = "C" + (r + 1);
                    String changeCol = "D" + (r + 1);
                    String formula = String.format(strFormula, fileTypeCol, changeCol, changeCol,
                            changeCol, changeCol, changeCol, changeCol, changeCol, changeCol,
                            changeCol, changeCol);
                    System.out.println("Formula ====== " + formula);
                    cell.setCellFormula(formula);
                }
            }

            XSSFFormulaEvaluator.evaluateAllFormulaCells(workbook);

            workbook.write(fileout);
            fileout.close();
            Desktop.getDesktop().open(new File("ItemFilter.xlsx"));

        }

    }
}

收到的结果:

enter image description here

推荐答案

Excel函数IFS是在2007年发布Office Open XML文件系统后引入的.因此,并不是所有的Electron 表格应用程序都支持此功能.为了标记这一点,这些函数在文件存储中以_xlfn.为前缀.这是在/xl/worksheets/sheet*.xml中使用Office Open XML*.xlsx.

由于该前缀,Electron 表格应用程序可以检测到当前运行的Open Office XML版本不支持的函数.参见:Issue: An _xlfn. prefix is displayed in front of a formula

由于ApachePOI直接写入文件存储/xl/worksheets/sheet*.xml,因此必须使用Cell.setCellFormula设置前缀.错的是setCellFormula("...IFS(...").正确的数字是setCellFormula("..._xlfn.IFS(...").

但是,您的代码应该为数字而不是字符串设置数值.错:...new Object[] { "A", "High", "css", "1" }, new Object[] { "A", "Low", "txt", "0.4" },....正确...new Object[] { "A", "High", "css", 1 }, new Object[] { "A", "Low", "txt", 0.4 },....

使用您的代码样例完成示例:

import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class CreateExcelFormulaIFS {

 public static void main(String[] args) throws Exception {

  try (Workbook workbook = new XSSFWorkbook();
       FileOutputStream fileout = new FileOutputStream("./IFSFormula.xlsx")) {

   Sheet dataSheet = workbook.createSheet("Data");

   Row row;
   Cell cell;
    //String strFormula = "IFERROR(IFS(%s=\"css\", IFS(%s>0.5, \"High\", %s>0.3, \"Medium\", %s>0.2, \"Low\", %s>0, \"Very Low\", %s=0, \"None\")),IFS(%s>0.5, \"High\", %s>0.3, \"Medium\", %s>0.2, \"Low\", %s>0, \"Very Low\", %s=0, \"None\"))\r\n"
    //        + "";
   String strFormula = "IFERROR(_xlfn.IFS(%s=\"css\", _xlfn.IFS(%s>0.5, \"High\", %s>0.3, \"Medium\", %s>0.2, \"Low\", %s>0, \"Very Low\", %s=0, \"None\")),_xlfn.IFS(%s>0.5, \"High\", %s>0.3, \"Medium\", %s>0.2, \"Low\", %s>0, \"Very Low\", %s=0, \"None\"))";
   Object[][] data = new Object[][] {
    new Object[] { "Header", "Complexity", "Type of File", "Change", "Upgrade Effort" },
    new Object[] { "A", "High", "css", 1 },
    new Object[] { "A", "Low", "txt", 0.4 },
    new Object[] { "C", "Moderate", "css", 0.4 },
    new Object[] { "D", "High", "txt", 0.7 },
    new Object[] { "A", "High", "css", 0.8 },
    new Object[] { "B", "Low", "css", 0.2 },
    new Object[] { "G", "Low", "css", 0.1 },
    new Object[] { "G", "High", "properties", 0.4 },
    new Object[] { "G", "High", "css", 1 },
    new Object[] { "G", "High", "css", 0.2 },
    new Object[] { "G", "Low", "jsp", 0.8 },
    new Object[] { "H", "Low", "jsp", 0.6 },
    new Object[] { "H", "Low", "html", 0.4 }
   };
   for (int r = 0; r < data.length; r++) {
    row = dataSheet.createRow(r);
    Object[] rowData = data[r];
    for (int c = 0; c < rowData.length; c++) {
     cell = row.createCell(c);
     if (rowData[c] instanceof String) {
      cell.setCellValue((String) rowData[c]);
     } else if (rowData[c] instanceof Number) {
      cell.setCellValue(((Number) rowData[c]).doubleValue());
     }
    }
    if (rowData.length < 5) {
     cell = row.createCell(4);
     String fileTypeCol = "C" + (r + 1);
     String changeCol = "D" + (r + 1);
     String formula = String.format(strFormula, fileTypeCol, changeCol, changeCol,
                    changeCol, changeCol, changeCol, changeCol, changeCol, changeCol,
                    changeCol, changeCol);
     System.out.println("Formula ====== " + formula);
     cell.setCellFormula(formula);
    }
   }

   workbook.write(fileout);
   fileout.close();
   Desktop.getDesktop().open(new File("./IFSFormula.xlsx"));

  }
 }
}

Java相关问答推荐

为什么Java中的两个日期有差异?

Java WireMock定义存根在Cucumber并行执行的多线程测试中失败

替换com. sun. jndi. dns. DnsContextFactory Wildfly23 JDK 17

错误:在Liferay7.4中找不到符号导入com.liferay.portal.kernel.uuid.PortalUUID;";

对于几乎不涉及逻辑的请求,您是否应该使用命令模式?

在JavaFX项目中注册组合框的控件FX验证器时,模块系统出错

如何在EXCEL单元格中添加形状和文本

Java中将文本拆分为数字或十进制数字和字符串

Docker不支持弹性APM服务器

Java连接池无法正常工作

如何将Pane的图像快照保存为BMP?

Java中不兼容的泛型类型

来自外部模块的方面(对于Java+Gradle项目)不起作用

如何读取3个CSV文件并在控制台中按顺序显示?(Java)

如何使用Criteria Builder处理一对多关系中的空值?

在Eclipse中可以使用外部字体吗?

RestTemplate Bean提供OkHttp3ClientHttpRequestFactory不支持Spring Boot 3中的请求正文缓冲

Java中的发布/订阅-Long Live和Short Live Publisher,哪种方法是正确的?

TinyDB问题,无法解析符号';上下文&

当使用不同的参数类型调用时,为什么围绕Objects.equals的类型安全包装不会失败?