如何使用 poi 更新 Excel 工作表链接

2024-01-04

我试图在使用 setForceFormulaRecal 方法后获取更新的单元格值。但我仍然保留旧价值观。这不是实际结果。如果我通过单击打开原始文件,它将询问更新链接对话框。如果我单击“确定”按钮,则它会更新所有单元格公式结果。所以我想在打开之前使用 poi 更新 Excel 工作表链接。请在这种情况下提供帮助。

//设置值之前

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

//评估工作簿公式后,我尝试如下

 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());

我也尝试过公式评估器,但它显示错误如下

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

好的,尝试回答:

首先:当前稳定版本 3.10 中不包含对外部工作簿链接的支持。因此,使用此版本无法直接评估此类链接。这就是为什么evaluateAll()对于包含外部工作簿链接的工作簿将失败。

在 3.11 版本中将可以做到这一点。但前提是所有工作簿都已打开并且所有工作簿的评估者都在场。看:http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/FormulaEvaluator.html#setupReferencedWorkbooks%28java.util.Map%29 http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/FormulaEvaluator.html#setupReferencedWorkbooks%28java.util.Map%29

我们可以使用稳定版本 3.10 做的是评估包含没有链接到外部工作簿的公式的所有单元格。

Example:

The workbook "workbook.xlsx" contains a formula with a link to an external workbook in 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) {
  }
 }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 poi 更新 Excel 工作表链接 的相关文章

随机推荐

  • 如何在JavaFX中仅设置顶部填充[重复]

    这个问题在这里已经有答案了 我只想在 JavaFX 中使用 CSS 指定一个 或多个 填充值 我已阅读此处的文档http docs oracle com javase 8 javafx api javafx scene doc files
  • 加载 Google 网站后自动运行 Google 应用程序脚本?

    我编写了一个 Apps 脚本 它采用电子表格并将其转换为 Google 表单 我想在我的谷歌网站上显示表单 但是 我希望表单在每次打开网站时自动刷新 这样如果电子表格发生更改 表单在显示时也会更新 本质上 我希望脚本在打开 Google 网
  • 如何让github在重命名后遵循目录历史记录?

    一旦目录被重命名 git log 就不再显示其历史记录 除非您使用 git log follow 强制它显示 有没有办法强制 GitHub Web UI 上的 历史记录 功能使用 follow 或者 有吗any如何在 GitHub 上查看预
  • 将.bak文件恢复到远程数据库

    我有一个test bak文件在我的本地机器上 我需要将此文件恢复到远程计算机的数据库 我怎么做 当我尝试此操作时 远程数据库会抛出无法找到的错误test bak在本地文件系统上 Query RESTORE DATABASE TESTPROJ
  • 从嵌套字典列表中获取 pandas 数据框

    我是 Python 新手 所以这可能非常简单 但在寻找一段时间后我还没有找到解决我的问题的好答案 我正在尝试从字典列表创建 Pandas 数据框 我的嵌套字典列表如下 my list 0 a 23 b 15 c 5 d 1 1 a 5 b
  • 如何禁用 DEP

    我们有一个应用程序 其中堆的某些部分作为汇编指令执行 用于测试目的 我们将程序下载到 PLC 但允许用户在下载到 PLC 之前通过执行代码来模拟运行其应用程序 之前我们总是从存储指令的堆中执行这些程序 这工作得很好 但现在我们已经转换到 V
  • vtk中顶点和点的区别

    顶点和点之间的主要区别是什么VTK http www vtk org 好吧 我正在将一些计算点分配给vtkPolyData http www vtk org doc nightly html classvtkPolyData html ou
  • 在 unix 中将行转置为列

    我有下面给出的输入文件 输入文件 10 9 11 61432568509 118 1 20130810014023 46 440 4 GTEL 10 9 11 61432568509 118 1 20130810014023 46 440
  • 在 mac 10.9 中安装 libgd 时出错

    我正在尝试按照此处的说明在我的 mac OSX 10 9 上安装 libgd https mikewest org 2007 04 installing libgd from source on os x https mikewest or
  • IIO(字符)设备输出无输出 - IIO 缓冲区

    我正在为 ADC ADS1243 开发 Linux 驱动程序并使用 IIO 框架 我想添加一个功能来读取 ADC 数据并将其存储到 IIO 缓冲区 我添加了 iio triggered buffer setup 来探测驱动程序的功能 ret
  • 自动 vlookup 并将系数与 R 相乘

    我正在尝试用 R 统计编程语言 编写一个函数 该函数允许我自动计算线性回归 lm 问题 回归是通过 step 函数计算的 因此无法提前知道所选择的系数 问题 自动识别阶跃函数选择的系数 Vlookup 和交叉乘以结果的第二列 例如 View
  • AWS DAX 集群具有零缓存命中和缓存未命中

    我使用的是包含 3 个 dax r4 xlarge 节点类型节点的 AWS DAX 集群 当我从 EMR 集群运行 Spark 应用程序时 它始终从 dynamodb 表中获取值 即使我在同一组密钥上运行相同的应用程序 它也会查询 dyna
  • 当类使用泛型和泛型类型参数时如何获取正确的 MethodInfo 对象

    我想知道是否有人能够演示如何使用 Type 的 GetMethod 方法来检索以下签名的 MethodInfo 对象 Class StaticMethod
  • pycharm 无法识别 Git

    我正在尝试使用 pyCharm 从 bitbucket 中提取 github 存储库 我在版本控制 Git 下添加了 git 可执行文件的路径并安装了 bitbucket 插件 如果我测试两者 它表示测试运行良好 但是 当我现在打开终端并尝
  • MongoDB 中是否有命名集合的约定?

    我想知道数据库集合是否有约定 例如 PageVisit or page visit 这些符号有什么优点 缺点吗 一般约定是 小写名称 这可以避免区分大小写的问题 因为 MongoDB 集合名称是区分大小写 Plural 将某物的集合标记为复
  • Angular 4 不活动后重定向

    每当您在页面上处于非活动状态时 我都需要设置超时 假设您在页面上呆了 20 秒而没有点击任何内容 它会将您重定向到主屏幕 当前的代码不适用于不活动状态 我不知道如何使其工作 ngOnInit do init at here for curr
  • Laravel 4 中无法切换语言

    我尝试通过路由切换语言 但没有任何变化 请你帮帮我好吗 Route get lang lang function lang App setLocale lang return Redirect to App setLocale 不是持久性的
  • 为什么 django 中的大型查询(或一系列查询)后内存没有释放到系统?

    首先 DEBUG False在settings py中 所以不 connections default queries不会不断增长 直到耗尽所有内存 让我们从我已经加载的事实开始User表来自django contrib auth mode
  • 如何将类型“byte[]”转换为“System.Data.Linq.Binary”

    我的数据库中有一个 WorkflowInstances 表 其中包含以下字段 ID int Name nvarchar 50 WorkflowID int 文档 varbinary MAX 我想插入一个新的 WorkflowInstance
  • 如何使用 poi 更新 Excel 工作表链接

    我试图在使用 setForceFormulaRecal 方法后获取更新的单元格值 但我仍然保留旧价值观 这不是实际结果 如果我通过单击打开原始文件 它将询问更新链接对话框 如果我单击 确定 按钮 则它会更新所有单元格公式结果 所以我想在打开