На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Следующие правила действуют в данном разделе в дополнение к общим Правилам Форума
1. Здесь обсуждается Java, а не JavaScript! Огромная просьба, по вопросам, связанным с JavaScript, SSI и им подобным обращаться в раздел WWW Masters или, на крайний случай, в Многошум.
2. В случае, если у вас возникают сомнения, в каком разделе следует задать свой вопрос, помещайте его в корневую ветку форума Java. В случае необходимости, он будет перемещен модераторами (с сохранением ссылки в корневом разделе).

3. Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
4. Не рекомендуется создавать несколько несвязанных вопросов в одной теме. Пожалуйста, создавайте по одной теме на вопрос.
Модераторы: dark_barker, wind
  
> Как обновить файл Excel со многими формулами, без эвалюации, в Apache POI ?
    Всем привет!
    Надо обновить существующий файл Excel со многими формулами.
    Версия Apache POI 3.16

    Я знаю, что API Apache POI сам предоставляет FomulaEvаluator, но определенные формулы не поддерживаются POI Apache.
    Использовать функцию евалуате нельзя так-как файл Excel содержит формулы, не поддерживаемые Apache POI.

    Я могу удалить кэшированные результаты из файла (после обновления), но я не могу сохранить новый файл с новыми кешированными результатами.
    Для этого нужно открыть Excel обычным способом и только тогда кэшируются новые значения.

    Может ли кто-нибудь помочь получить решение без открытия Excel и без использования FormulaEvaluator ?

    Заранее благодарен и с уважением
    Hehabr

    –--------------------------------------------------------------------

    Как выглядит Excel-файл:
    user posted image


    Вывод программы:

    Formula is: C34
    cell.getCachedFormulaResultType(): 0
    0. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: 6.0
    Formula is: C34
    cell.getCachedFormulaResultType(): 0
    0. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: 0.0

    –--------------------------------------------------------------------

    Код:
    ExpandedWrap disabled
      import org.apache.poi.ss.usermodel.*;
      import org.apache.poi.ss.util.CellReference;
      import org.apache.poi.xssf.usermodel.XSSFSheet;
      import org.apache.poi.xssf.usermodel.XSSFWorkbook;
       
      import java.io.*;
       
      public class POITestRB {
       
          static String excelFileOrig = "C:/Test/1.xlsm";
          static String excelFileNew = "C:/Test/excelFileNew.xlsm";
          static FileInputStream fis;
          static XSSFWorkbook workbook;
       
          public static void main(String[] args) throws IOException {
       
              fis = new FileInputStream(excelFileOrig);
              workbook = new XSSFWorkbook(fis);
              gettingCellContents(workbook, "D5");
              updateCell(workbook, 10.0);
              fis.close();
              workbook.close();
       
              fis = new FileInputStream(excelFileNew);
              workbook = new XSSFWorkbook(fis);
              gettingCellContents(workbook, "D5");
              fis.close();
              workbook.close();
       
          }
       
          public static void updateCell(XSSFWorkbook workbook, Double newData) {
              try {
                  XSSFSheet sheet = workbook.getSheetAt(1);
                  CellReference ref = new CellReference("C8");
                  int row = ref.getRow();
                  int col = ref.getCol();
                  Cell cell = sheet.getRow(row).getCell(col);
                  if (cell != null) {
                      cell.setCellValue(newData);
                  }
       
                  workbook.getCreationHelper().createFormulaEvaluator().clearAllCachedResultValues();
                  workbook.setForceFormulaRecalculation(true);
       
                  cleenCach(workbook);
       
                  OutputStream os = new FileOutputStream(excelFileNew);
                  workbook.write(os);
                  os.flush();
                  os.close();
              }
              catch (Exception e) {
                  e.printStackTrace();
              }
          }
       
       
          public static void cleenCach(XSSFWorkbook workbook) {
              for (Sheet sheet : workbook) {
                  for (Row r : sheet) {
                      for (Cell c : r) {
                          if (c.getCellTypeEnum() == CellType.FORMULA) {
                              String temp = c.getCellFormula();
                              c.setCellType(CellType.STRING);
                              c.setCellType(CellType.FORMULA);
                              c.setCellFormula(temp);
                          }
                      }
                  }
              }
          }
       
       
          private static void gettingCellContents(XSSFWorkbook workbook, String cellId) {
       
              workbook.setForceFormulaRecalculation(true);
       
              XSSFSheet sheet = workbook.getSheetAt(1);
              CellReference ref = new CellReference(cellId);
              int row = ref.getRow();
              int col = ref.getCol();
              Cell cell = sheet.getRow(row).getCell(col);
       
              switch (cell.getCellTypeEnum()) {
                  case STRING:
                      System.out.println(cell.getRichStringCellValue().getString());
                      break;
                  case NUMERIC:
                      if (DateUtil.isCellDateFormatted(cell)) {
                          System.out.println(cell.getDateCellValue());
                      } else {
                          System.out.println(cell.getNumericCellValue());
                      }
                      break;
                  case BOOLEAN:
                      System.out.println(cell.getBooleanCellValue());
                      break;
                  case FORMULA:
                      System.out.println("Formula is: " + cell.getCellFormula());
                      System.out.println("cell.getCachedFormulaResultType(): " + cell.getCachedFormulaResultType());
       
                      switch(cell.getCachedFormulaResultType()) {
                          case Cell.CELL_TYPE_NUMERIC:
                              System.out.println("0. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: " + cell.getNumericCellValue());
                              break;
                          case Cell.CELL_TYPE_STRING:
                              System.out.println("4. case Cell.CELL_TYPE_STRING --> Last evaluated as \"" + cell.getRichStringCellValue() + "\"");
                              break;
                          case Cell.CELL_TYPE_ERROR:
                              System.out.println("5. case Cell.CELL_TYPE_ERROR --> ");
                              break;
                      }
                      break;
                  case BLANK:
                      System.out.println();
                      break;
                  default:
                      System.out.println("default");
              }
          }
       
      }
    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script Execution time: 0,0630 ]   [ 14 queries used ]   [ Generated: 20.09.17, 16:37 GMT ]