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

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

    -- Program output:
    Formula is: C34
    1. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: 407.2521754511886
    Formula is: C34

    -- Cell values:
    Value of the cell D5 in file excelFileOrig.xlsm is: 407,25
    Value of the cell D5 in file excelFileNew.xlsm is: #DIV/0!
    Value of the cell C8 in file excelFileOrig.xlsm is: 5,0
    Value of the cell D5 in file excelFileNew.xlsm is: 15,0

    -- Code:

    ExpandedWrap disabled
      import org.apache.poi.ss.usermodel.Cell;
      import org.apache.poi.ss.usermodel.DateUtil;
      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/excelFileOrig.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, 15.0);
              fis.close();
              workbook.close();
       
              fis = new FileInputStream(excelFileNew);
              workbook = new XSSFWorkbook(fis);
              gettingCellContents(workbook, "D5");
          }
       
          private static void gettingCellContents(XSSFWorkbook workbook, String cellId) {
       
              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());
                      switch(cell.getCachedFormulaResultType()) {
                          case Cell.CELL_TYPE_NUMERIC:
                              System.out.println("1. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: " + cell.getNumericCellValue());
                              break;
                          case Cell.CELL_TYPE_STRING:
                              System.out.println("2. case Cell.CELL_TYPE_STRING --> Last evaluated as \"" + cell.getRichStringCellValue() + "\"");
                              break;
                      }
                      break;
                  case BLANK:
                      System.out.println();
                      break;
                  default:
                      System.out.println();
              }
          }
       
          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().evaluateAll();
                  OutputStream os = new FileOutputStream(excelFileNew);
                  workbook.write(os);
                  os.flush();
                  os.close();
              }
              catch (Exception e) {
                  e.printStackTrace();
              }
          }
       
      }
      Может быть можно как-то удалить кэшированные результаты из файла?
      Чтобы в новом файле все результаты пересчитались по новому, с учётом внесённых изменений...
        С помощью workbook.setForceFormulaRecalculation(true); новый файл сохраняется с новыми значениями всех ячеек.

        Проблема теперь с выводом значения ячейки в новом файле:
        -------------------------------------------------------------------------------------------------
        Formula is: C34
        cell.getCachedFormulaResultType(): 0
        0. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: 407.2521754511886
        Formula is: C34
        cell.getCachedFormulaResultType(): 5
        5. case Cell.CELL_TYPE_ERROR -->
        -------------------------------------------------------------------------------------------------

        Почему выводит CELL_TYPE_ERROR ?
        Новый файл хранит новые значениями всех ячеек.

        Что надо ещё добавить в коде?

        ExpandedWrap disabled
          import org.apache.poi.ss.usermodel.Cell;
          import org.apache.poi.ss.usermodel.DateUtil;
          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();
           
              }
           
           
              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");
                  }
              }
           
              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.getCreationHelper().createFormulaEvaluator().evaluateAll();
           
                      OutputStream os = new FileOutputStream(excelFileNew);
                      workbook.write(os);
                      os.flush();
                      os.close();
                  }
                  catch (Exception e) {
                      e.printStackTrace();
                  }
              }
           
          }
        Сообщение отредактировано: Hehabr -
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0215 ]   [ 15 queries used ]   [ Generated: 28.03.24, 23:16 GMT ]