2014-11-12 2 views
2

Я пытаюсь получить обновленные значения ячеек после использования метода setForceFormulaRecal. Но я все еще старую ценность. Что не является фактическим результатом. Если я открою оригинальный файл, щелкнув «Он» спросит диалоговое окно «Ссылки на обновления». Если я нажму кнопку «ОК», то он обновит все результаты формулы ячейки. Поэтому я хочу обновить ссылки на листы excel до его открытия с помощью poi. Пожалуйста, помогите в этой ситуации.Как обновить ссылки на листы Excel с помощью poi

// Перед установкой значений

HSSFCell cel2=row1.getCell(2); 
HSSFCell cel4=row1.getCell(5); 
cel2.setCellValue(690); 
cel4.setCellValue(690); 
wb.setForceFormulaRecalculation(true); 
wb.write(stream); 

// После Evaluatting трудовой книжки формулы Я пытаюсь, как следовать

HSSFWorkbook wb = HSSFReadWrite.readFile("D://workspace//ExcelProject//other.xls"); 
    HSSFSheet sheet=wb.getSheetAt(14); 
    HSSFRow row11=sheet.getRow(10); 
    System.out.println("** cell val: "+row11.getCell(3).getNumericCellValue()); 

Я также попытался с Formula оценщиком Но его ошибки показывается, как следовать

Could not resolve external workbook name '\Users\asus\Downloads\??? & ???? ?????_091230.xls'. Workbook environment has not been set up. 
    at org.apache.poi.ss.formula.OperationEvaluationContext.createExternSheetRefEvaluator(OperationEvaluationContext.java:87) 
    at org.apache.poi.ss.formula.OperationEvaluationContext.getArea3DEval(OperationEvaluationContext.java:273) 
    at org.apache.poi.ss.formula.WorkbookEvaluator.getEvalForPtg(WorkbookEvaluator.java:660) 
    at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateFormula(WorkbookEvaluator.java:527) 
    at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateAny(WorkbookEvaluator.java:288) 
    at org.apache.poi.ss.formula.WorkbookEvaluator.evaluate(WorkbookEvaluator.java:230) 
    at org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluateFormulaCellValue(HSSFFormulaEvaluator.java:351) 
    at org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluateFormulaCell(HSSFFormulaEvaluator.java:213) 
    at org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluateAllFormulaCells(HSSFFormulaEvaluator.java:324) 
    at org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluateAll(HSSFFormulaEvaluator.java:343) 
    at HSSFReadWrite.readSheetData(HSSFReadWrite.java:85) 
    at HSSFReadWrite.main(HSSFReadWrite.java:346) 
Caused by: org.apache.poi.ss.formula.CollaboratingWorkbooksEnvironment$WorkbookNotFoundException: Could not resolve external workbook name '\Users\asus\Downloads\??? & ???? ?????_091230.xls'. Workbook environment has not been set up. 
    at org.apache.poi.ss.formula.CollaboratingWorkbooksEnvironment.getWorkbookEvaluator(CollaboratingWorkbooksEnvironment.java:161) 
    at org.apache.poi.ss.formula.WorkbookEvaluator.getOtherWorkbookEvaluator(WorkbookEvaluator.java:181) 
    at org.apache.poi.ss.formula.OperationEvaluationContext.createExternSheetRefEvaluator(OperationEvaluationContext.java:85) 
    ... 11 more 
+1

Название внешней книги выглядит странно. Пожалуйста, покажите формулу, которая хранится в ячейке, которая является причиной ошибки оценщика. И, пожалуйста, покажите, как эта формула входит в эту ячейку. –

+0

Да, я тоже шокирован тем, что вижу имя этой книги на выходе консоли. Но мое имя листа excel - other.xls. – Jayaram

+0

Если я напечатаю ячейку, она покажет формулу ячейки как «D10 + D11». Но я хочу получить результат этой формулы. – Jayaram

ответ

1

OK, пытаясь ответить:

Прежде всего: поддержка ссылок на внешние книги не включена в текущую стабильную версию 3.10. Поэтому с этой версией невозможно напрямую оценить такие ссылки. Вот почему evaluateAll() не удастся получить книги с ссылками на внешние книги.

С версией 3.11 это будет возможно. Но также, даже если все книги открыты и оценщики для всех книг присутствуют. См.: http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/FormulaEvaluator.html#setupReferencedWorkbooks%28java.util.Map%29

Что мы можем сделать со стабильной версией 3.10, - это оценить все ячейки, содержащие формулы, не имеющие ссылок на внешние книги.

Пример:

Учебное пособие «workbook.xlsx» содержит формулу со ссылкой на внешнюю рабочую книгу в A2: enter image description here

import org.apache.poi.xssf.usermodel.*; 
import org.apache.poi.ss.usermodel.*; 
import org.apache.poi.ss.util.*; 
import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 

import java.io.FileOutputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.FileInputStream; 
import java.io.InputStream; 

import java.util.Map; 
import java.util.HashMap; 

class ExternalReferenceTest { 

public static void main(String[] args) { 
    try { 

    InputStream inp = new FileInputStream("workbook.xlsx"); 
    Workbook wb = WorkbookFactory.create(inp); 

    Sheet sheet = wb.getSheetAt(0); 

    Row row = sheet.getRow(0); 
    if (row == null) row = sheet.createRow(0); 

    Cell cell = row.getCell(0); 
    if (cell == null) cell = row.createCell(0); 
    cell.setCellValue(123.45); 

    cell = row.getCell(1); 
    if (cell == null) cell = row.createCell(1); 
    cell.setCellValue(678.90); 

    cell = row.getCell(2); 
    if (cell == null) cell = row.createCell(2); 
    cell.setCellFormula("A1+B1"); 

    FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator(); 
    //evaluator.evaluateAll(); //will not work because external workbook for formula in A2 is not accessable 
    System.out.println(sheet.getRow(1).getCell(0)); //[1]Sheet1!$A$1 

    //but we surely can evaluate single cells: 
    cell = wb.getSheetAt(0).getRow(0).getCell(2); 
    System.out.println(evaluator.evaluate(cell).getNumberValue()); //802.35 

    FileOutputStream fileOut = new FileOutputStream("workbook.xlsx"); 
    wb.write(fileOut); 
    fileOut.flush(); 
    fileOut.close(); 

    } catch (InvalidFormatException ifex) { 
    } catch (FileNotFoundException fnfex) { 
    } catch (IOException ioex) { 
    } 
} 
} 
Смежные вопросы