Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2017, 16:18   #1
Hehabr
Пользователь
 
Регистрация: 04.11.2013
Сообщений: 15
По умолчанию Как обновить файл Excel со многими формулами, без эвалюации, в Apache POI ?

Всем привет!
Надо обновить существующий файл Excel со многими формулами.
Версия Apache POI 3.16

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

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

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

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

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

Как выглядит Excel-файл:
http://s16.radikal.ru/i191/1708/1a/185962665f20.jpg


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

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

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

Код:
Код:
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");
        }
    }

}
Вложения
Тип файла: xlsx 1.xlsx (8.7 Кб, 16 просмотров)
Hehabr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Apache POI - Вопрос по выводу значений ячеек Hehabr Общие вопросы по Java, Java SE, Kotlin 1 27.08.2017 14:47
Apache POI : Как удалить из файла (после его обновления) кешированные результаты вычислений по формулам, перед сохранением нового файла? Hehabr Общие вопросы по Java, Java SE, Kotlin 0 09.08.2017 10:36
Apache POI:Как обновить Excel-файл со многими формулами Hehabr Общие вопросы по Java, Java SE, Kotlin 2 04.08.2017 15:10
Apache POI : Проблема с обновлением Excel Hehabr Общие вопросы по Java, Java SE, Kotlin 4 11.07.2017 00:08
Помогите с подключением библиотеки Apache POI iNataliya Общие вопросы по Java, Java SE, Kotlin 3 03.08.2016 16:07