Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Java > Как обновить файл Excel со многими формулами, без эвалюации, в Apache POI ?


Автор: Hehabr 09.08.17, 12:51
Всем привет!
Надо обновить существующий файл 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

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

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

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)