excel - 为什么逻辑 IFS() 函数总是以小写形式呈现?

标签 excel excel-formula apache-poi libreoffice-calc

我正在从 java 代码动态生成 XLSX 文件,并设置公式。除了 IFS() 函数外,所有工作都正常,而似乎总是使用小写的“ifs()”进行渲染,因此当打开生成的文件时,libreoffice 无法将其识别为函数。所有其他公式,例如普通的旧“如果”工作得很好

我试过调试 POI ooxml 源代码,最后我能说的是单元格被正确设置为大写。我已经尝试更新到最新版本,预先格式化单元格内容......到目前为止还没有运气。此代码在 poi 4.0.1 上运行,我正在使用 libreoffice 6.1.3.2 打开文件(以防这可能是 libreoffice 问题?)。我无权访问 EXCEL 2016+ 来检查它如何处理生成的文件。

public void testIFS(){
    try {
        String IFSformula = "IFS(1,\"yes\",0,\"no\")";
        String IFformula = "IF(1,\"yes\",\"no\")";
        String outputFileName = "IFStest.xlsx";
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet poiSheet = workbook.createSheet("ifstest");
        XSSFRow row = poiSheet.createRow(0);
        XSSFCell cell0 = row.createCell(0);
        cell0.setCellFormula(IFSformula);
        XSSFCell cell1 = row.createCell(1);
        cell1.setCellFormula(IFformula);
        workbook.write(new FileOutputStream(outputFileName));
    } catch (IOException ex) {
        Logger.getLogger(IFSTest.class.getName()).log(Level.SEVERE, null, ex);
    }
}

现在,单元格 0 以 =ifs(1,"yes",0,"no") 结尾 - 这是错误的(结果是 #NAME),但单元格 1 工作得很好并且有一个单元格公式 =IF(1,"是”,“否”)(结果"is")。如果我手动将“ifs”更改为“IFS”,则公式可以正常工作并显示"is"。

最佳答案

最新 LibreOffice Calc支持IFS .但是如果它节省了*.xlsx文件然后它存储IFS使用 _xlfn 的公式字首。通常是 _xlfn前缀表示 The Excel workbook contains a function that is not supported in the version of Excel that you are currently running. .看来LibreOffice Calc尝试保存 Excel 2016兼容模式。 IFS function来自 Office 365仅向上。而且由于它使用该前缀进行存储,因此在阅读 *.xlsx 时似乎需要该前缀也。

甚至Office 365 Excel专卖店_xlfn.IFS进入*.xlsx文件,而不仅仅是 IFS (今天测试,2019 年 1 月 21 日)。所以LibreOffice Calc期望该前缀也是正确的。

以下适用于我使用 apache poi 4.0.1用于创建 *.xlsx并使用 LibreOffice Calc (版本:6.0.7.3 Build ID:1:6.0.7-0ubuntu0.18.04.2)以及使用Office 365用于打开 *.xlsx然后。

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

class TestIFS {

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

  try (XSSFWorkbook workbook = new XSSFWorkbook(); FileOutputStream out = new FileOutputStream("TestIFS.xlsx")) { 
   String formulaIFS = "_xlfn.IFS(1=0,\"first\",0=0,\"second\")";
   String formulaIF = "IF(1=0,\"yes\",\"no\")";
   Sheet sheet = workbook.createSheet("IFStest");
   Row row = sheet.createRow(0);
   Cell cell = row.createCell(0);
   cell.setCellFormula(formulaIFS);
   cell = row.createCell(1);
   cell.setCellFormula(formulaIF);
   workbook.write(out); 
  }
 }
}

关于excel - 为什么逻辑 IFS() 函数总是以小写形式呈现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54291388/

相关文章:

c# - 在 C# 中读取 Excel 数据和单元格格式

excel - 用excel中的公式检查文件是否存在

excel - 如何修复 "comparing userform textbox with cellvalue"代码

vba - 使用基于多个变量的 VBA 填充 Excel 2013 中的列

excel - VBA - 为什么 VBA UDF 与 native Excel 函数相比这么慢?

excel - 返回上一行到当前行的值

java - 如何读取 Excel 并获取多个值并使用 selenium Web 驱动程序和 testNG 中的数据提供程序连接它们

java - 导入 Google 表格时如何使用 apache poi 显示系列标签

java - POI CellStyle 似乎未应用

excel - Excel 单元格中的自动调整和 minHeight