<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411177&amp;view=findpost&amp;p=3735948</guid>
        <pubDate>Wed, 09 Aug 2017 12:51:11 +0000</pubDate>
        <title>Как обновить файл Excel со многими формулами, без эвалюации, в Apache POI ?</title>
        <link>https://forum.sources.ru/index.php?showtopic=411177&amp;view=findpost&amp;p=3735948</link>
        <description><![CDATA[Hehabr: Всем привет&#33;<br>
Надо обновить существующий файл Excel со многими формулами.<br>
Версия Apache POI 3.16<br>
<br>
Я знаю, что API Apache POI сам предоставляет FomulaEvаluator, но определенные формулы не поддерживаются POI Apache.<br>
Использовать функцию евалуате нельзя так-как файл Excel содержит формулы, не поддерживаемые Apache POI. <br>
<br>
Я могу удалить кэшированные результаты из файла (после обновления), но я не могу сохранить новый файл с новыми кешированными результатами.<br>
Для этого нужно открыть Excel обычным способом и только тогда кэшируются новые значения.<br>
<br>
Может ли кто-нибудь помочь получить решение без открытия Excel и без использования FormulaEvaluator ?<br>
<br>
Заранее благодарен и с уважением<br>
Hehabr<br>
<br>
–--------------------------------------------------------------------<br>
<br>
Как выглядит Excel-файл: <br>
<img class='tag-img' src='http://s16.radikal.ru/i191/1708/1a/185962665f20.jpg' alt='user posted image'><br>
<br>
<br>
Вывод программы:<br>
<br>
Formula is: C34<br>
cell.getCachedFormulaResultType(): 0<br>
0. case Cell.CELL_TYPE_NUMERIC --&#62; Last evaluated as: 6.0<br>
Formula is: C34<br>
cell.getCachedFormulaResultType(): 0<br>
0. case Cell.CELL_TYPE_NUMERIC --&#62; Last evaluated as: 0.0<br>
<br>
–--------------------------------------------------------------------<br>
<br>
Код: <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">import org.apache.poi.ss.usermodel.*;</div><div class="code_line">import org.apache.poi.ss.util.CellReference;</div><div class="code_line">import org.apache.poi.xssf.usermodel.XSSFSheet;</div><div class="code_line">import org.apache.poi.xssf.usermodel.XSSFWorkbook;</div><div class="code_line">&nbsp;</div><div class="code_line">import java.io.*;</div><div class="code_line">&nbsp;</div><div class="code_line">public class POITestRB {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;static String excelFileOrig = &quot;C:/Test/1.xlsm&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;static String excelFileNew = &quot;C:/Test/excelFileNew.xlsm&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;static FileInputStream fis;</div><div class="code_line">&nbsp;&nbsp; &nbsp;static XSSFWorkbook workbook;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public static void main(String[] args) throws IOException {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fis = new FileInputStream(excelFileOrig);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;workbook = new XSSFWorkbook(fis);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;gettingCellContents(workbook, &quot;D5&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;updateCell(workbook, 10.0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fis.close();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;workbook.close();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fis = new FileInputStream(excelFileNew);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;workbook = new XSSFWorkbook(fis);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;gettingCellContents(workbook, &quot;D5&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fis.close();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;workbook.close();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public static void updateCell(XSSFWorkbook workbook, Double newData) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;try {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;XSSFSheet sheet = workbook.getSheetAt(1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CellReference ref = new CellReference(&quot;C8&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int row = ref.getRow();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int col = ref.getCol();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Cell cell = sheet.getRow(row).getCell(col);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (cell != null) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cell.setCellValue(newData);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;workbook.getCreationHelper().createFormulaEvaluator().clearAllCachedResultValues();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;workbook.setForceFormulaRecalculation(true);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cleenCach(workbook);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;OutputStream os = new FileOutputStream(excelFileNew);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;workbook.write(os);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;os.flush();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;os.close();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;catch (Exception e) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e.printStackTrace();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public static void cleenCach(XSSFWorkbook workbook) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (Sheet sheet : workbook) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (Row r : sheet) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (Cell c : r) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (c.getCellTypeEnum() == CellType.FORMULA) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String temp = c.getCellFormula();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c.setCellType(CellType.STRING);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c.setCellType(CellType.FORMULA);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c.setCellFormula(temp);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private static void gettingCellContents(XSSFWorkbook workbook, String cellId) {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;workbook.setForceFormulaRecalculation(true);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;XSSFSheet sheet = workbook.getSheetAt(1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CellReference ref = new CellReference(cellId);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int row = ref.getRow();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int col = ref.getCol();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Cell cell = sheet.getRow(row).getCell(col);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;switch (cell.getCellTypeEnum()) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case STRING:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(cell.getRichStringCellValue().getString());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case NUMERIC:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (DateUtil.isCellDateFormatted(cell)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(cell.getDateCellValue());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(cell.getNumericCellValue());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case BOOLEAN:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(cell.getBooleanCellValue());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case FORMULA:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(&quot;Formula is: &quot; + cell.getCellFormula());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(&quot;cell.getCachedFormulaResultType(): &quot; + cell.getCachedFormulaResultType());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;switch(cell.getCachedFormulaResultType()) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case Cell.CELL_TYPE_NUMERIC:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(&quot;0. case Cell.CELL_TYPE_NUMERIC --&#62; Last evaluated as: &quot; + cell.getNumericCellValue());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case Cell.CELL_TYPE_STRING:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(&quot;4. case Cell.CELL_TYPE_STRING --&#62; Last evaluated as \&quot;&quot; + cell.getRichStringCellValue() + &quot;\&quot;&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case Cell.CELL_TYPE_ERROR:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(&quot;5. case Cell.CELL_TYPE_ERROR --&#62; &quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case BLANK:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;default:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(&quot;default&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Hehabr</author>
        <category>Java</category>
      </item>
	
      </channel>
      </rss>
	