当前位置: 首页 > 知识库问答 >
问题:

如何使用Apache POI在SXSSFWorkbook中使用vlookup或公式?

申屠恺
2023-03-14

我是Java开发者。我正试图使用Apache POI库的SXSFWorkbook类编写一个大的xlsx文件(Excel)。

我没有选择写大文件,因为有超过200000行。但我需要使用一些公式或vlookup与外部表。当我使用:

cell.setCellFormula(formulasString);

但它不工作,返回0值。

Q-如何在SXSSFWorkbook中使用公式?

我的代码-

import java.io.FileOutputStream;
import junit.framework.Assert;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

public class Demo2 
{
    public static void main(String[] args) throws Throwable 
    {
          SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk

          FormulaEvaluator fEvaluator=wb.getCreationHelper().createFormulaEvaluator();

          Sheet sh = wb.createSheet();
          for(int rownum = 0; rownum < 100000; rownum++)
          {
               Row row = sh.createRow(rownum);
               for(int cellnum = 0; cellnum < 10; cellnum++)
               {
                  Cell cell = row.createCell(cellnum);
                  String address = new CellReference(cell).formatAsString();
                  cell.setCellValue(address);
               }

               Cell cell1 = row.createCell(12);
               cell1.setCellType(Cell.CELL_TYPE_FORMULA);
               String sF = "SUM(10,20,30)";
               cell1.setCellFormula(sF);
               fEvaluator.clearAllCachedResultValues();

               Cell cell2 = row.createCell(13);
               cell2.setCellValue("Test");
         }

         // Rows with rownum < 900 are flushed and not accessible
         for(int rownum = 0; rownum < 99900; rownum++)
         {
              Assert.assertNull(sh.getRow(rownum));
         }

         // ther last 100 rows are still in memory
         for(int rownum = 99900; rownum < 100000; rownum++)
         {
              Assert.assertNotNull(sh.getRow(rownum));
         }

         FileOutputStream out = new FileOutputStream("sxssf.xlsx");
         wb.write(out);
         out.close();

         // dispose of temporary files backing this workbook on disk
         wb.dispose();
         System.out.println("Done");
    }
}

如果可能的话,请给我建议。谢谢

共有3个答案

唐高卓
2023-03-14

wb.SetForceFormulaRecomulation(true);

执行wb之前设置此选项。写(出)温u打开文件i excel。excel重新计算,u得到计算结果

壤驷安和
2023-03-14

不幸的是,SXSSFWorkbook不支持版本3.12中的公式。我发现这在代码中也是正确的,但是,我没有看到任何关于这一点的官方POI文档。

公式计算的POI留档有一些示例代码,用于在单元格创建后计算公式。它说它适用于XSSFWorkbook和HSSFWorkbook实现,但没有提到SXSSFWorkbook。

我试图在示例代码中使用SXSSFWorkbook,但收到了一个异常。从例外情况来看,很明显,尽管在POI文档中没有明确说明,但SXSFWWorkbook无法对公式进行评估。

Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. Only XSSFCells can be evaluated.  
谷梁玺
2023-03-14

根据您的问题和评论中提供的信息,您的问题是您使用的Apache POI版本太旧。这就是为什么在评估SXSSF单元时会出现异常。如公式评估文档末尾所述,对于SXSSF公式评估,您需要使用3.13 beta 2或更高版本。

还有一个潜在问题-公式评估不仅需要包含公式的单元格在内存中,还需要它引用的任何其他单元格以及它们引用的任何单元格。这可能会导致问题,具体取决于vlookup尝试调用的区域有多宽。vlookup需要的所有单元格必须在当前窗口中可用,并且不能刷新到磁盘。因此,您可能需要简化公式和/或增加窗口大小,以确保每个vlookup单元可以在计算时找到它所依赖的所有单元的值

 类似资料:
  • 我正在尝试用android显示PPT文件。我从ApachePOI开始,bcoz我还没有找到任何免费的开源jar。我从将ppt幻灯片转换为图像开始,参考此链接将PowerPoint幻灯片导出为java。awt。图表2D 这是Java语言。我找不到Dimension、BuffereImage和Graphics2D类。我已经导入了poi-scratchpad-3.8-20120326。jar在我的构建路

  • 问题内容: 有没有一种方法可以使用VLOOKUP内部联接两个不同的Excel电子表格? 在SQL中,我可以这样进行: 工作表1: 工作表2: 结果将是: 如何在VLOOKUP中执行此操作?还是除了VLOOKUP之外还有更好的方法吗? 谢谢。 问题答案: 首先,让我们获取两个表中都存在的值的列表。如果您使用的是excel 2010或更高版本,则在工作表3 A2中输入以下公式: 如果您使用的是2007

  • 问题内容: 我想使用设置实体。 我尝试了以下操作,但结果始终是(我想是因为该列始终是): 似乎忽略了。 如何使用某实体引用实体? 问题答案: 被忽略,因为它仅可替代。而且那个不用于关系映射。 但是您可以改为使用它,它存在于集合中: 要访问原始对象,可以使用特定的吸气剂:

  • 我无法使用ApachePOI删除docx文件中的所有注释。有没有其他方法可以使用docx4j api删除注释?

  • 问题内容: 因此,我在这里已经读到,在Vue.js中,可以使用或在选择器中创建适用于子组件内部元素的样式规则。但是,无论是在SCSS还是普通的旧CSS中,尝试以我的样式使用它均无效。而是将它们原样发送到浏览器,因此无效。例如: home.vue: 生成的CSS: 我想要的是: 我与之相关的webpack配置如下所示: 所以我的问题是,如何让该操作员工作? 我已经找到了这个答案,但我确实在这样做,而

  • 我试图使用Java和Apache POI将简单的VLookup公式放入我的“.xlsx”文件中。 该公式有外部引用,但对我不起作用。 因此,为了给您提供更多细节,我使用了poi和POI-OOXML3.13版以及Excel2007。 我以这种方式将公式放入单元格(其中单元格是单元格): 2 3 问题是,它写入Excel文件,然后在计算时抛出错误: 它从来没有给我作为,它总是返回。它应该返回字符串值。