Почему логическая функция IFS () продолжает отображаться в нижнем регистре? - PullRequest
0 голосов
/ 21 января 2019

Я динамически генерирую файлы XLSX из кода Java, а также задаю формулы.Все работает нормально, за исключением функции IFS (), в то время как всегда кажется, что рендеринг выполняется с использованием строчных букв "ifs ()" и поэтому не распознается libreoffice как функция при открытии результирующего файла.Все остальные формулы, например, простой старый «IF», ​​работают нормально

Я попытался отладить исходный код 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, "да", 0, "нет")- что неверно (результат #NAME), но ячейка 1 работает нормально и имеет формулу ячейки = IF (1, «да», «нет») (результат «да»).Если я вручную изменю «ifs» на «IFS», формула будет работать нормально, а также покажет «да».

1 Ответ

0 голосов
/ 21 января 2019

Новейший LibreOffice Calc поддерживает IFS. Но если он сохраняет файл *.xlsx, он сохраняет формулы IFS с префиксом _xlfn. Обычно префикс _xlfn означает Книга Excel содержит функцию, которая не поддерживается в текущей версии Excel. . Похоже, что LibreOffice Calc пытается сохранить в Excel 2016 совместимом режиме. Функция IFS только от Office 365 и выше. И поскольку он сохраняет этот префикс, он, похоже, ожидает этот префикс и при чтении *.xlsx.

И даже Office 365 Excel сохраняет _xlfn.IFS в файле *.xlsx вместо только IFS (протестировано сегодня, 21 января 2019 г.). Так что LibreOffice Calc является правильным, ожидая, что префикс тоже.

Следующее работает для меня, используя apache poi 4.0.1 для создания *.xlsx и используя LibreOffice Calc (Версия: 6.0.7.3 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); 
  }
 }
}
...