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

如何在更多Apache POI Pivot之间共享Pivot缓存?

孟楷
2023-03-14

当我试图打开我的Apache POI excel文件时,我遇到了一些问题,该文件包含大量数据(600.000/700000行),为三个不同的表中生成的三个枢轴提供数据(使用流式SXSSFWorkbook)。

当我试图打开创建的Excel di MSExcel时,出现了这样的消息:“Excel无法用可用的Excel资源完成此活动...试着关闭一些东西……”。所以,为了节省资源,我尝试在前两个pivots之间共享缓存:OK!这样更好!但是,当我试图与第三个共享缓存时,MSExcel给我错误,并试图恢复,但结果是错误的。

有没有任何解决方案可以与具有相同数据源的两个以上枢轴共享缓存?还是我做错了什么?

代码如下:

XSSFWorkbook wb = new XSSFWorkbook();
XSSFPivotTable firstPivot = preparefirstPivot(...);
XSSFPivotTable secondPivot = preparesecondPivot(...);
XSSFPivotTable thirdPivot = preparethirdPivot(...);

/* START: shared cache */
/* I remove from workbook all PivotCaches except the firstPivot one */
long firstPivotCacheId = firstPivot.getCTPivotTableDefinition().getCacheId();
List<CTPivotCache> ctPivotCacheList = wb.getCTWorkbook().getPivotCaches().getPivotCacheList();
for (int i = 0; i < ctPivotCacheList.size(); i++) {
    CTPivotCache ctPivotCache = ctPivotCacheList.get(i);
    if(ctPivotCache.getCacheId() != firstPivotChaceId ) {
        wb.getCTWorkbook().getPivotCaches().removePivotCache(i);
    }
}
/* I share the firstPivot cache with the other pivots */
/* work! OK! */
secondPivot.getCTPivotTableDefinition().setCacheId(firstPivotCacheId);
secondPivot.setPivotCache(firstPivot.getPivotCache());
/* here does not work! why?!??!! */
thirdPivot.getCTPivotTableDefinition().setCacheId(firstPivotCacheId);
thirdPivot.setPivotCache(firstPivot.getPivotCache());

有什么不对劲吗?非常感谢你!!!

共有1个答案

徐飞龙
2023-03-14

已解决:

XSSFWorkbook wb = new XSSFWorkbook();
XSSFPivotTable firstPivot = preparefirstPivot(...);
XSSFPivotTable secondPivot = preparesecondPivot(...);
XSSFPivotTable thirdPivot = preparethirdPivot(...);

/* START: shared cache */
                List<CTPivotCache> ctPivotCacheList = wb.getCTWorkbook().getPivotCaches().getPivotCacheList();
                if (ctPivotCacheList != null && ctPivotCacheList.size() > 1) {
                    /* useful only with more than one PivotCache */
                    List<Long> ctPivotCacheIdList = new ArrayList<Long>();
                    for (int i = 0; i < ctPivotCacheList.size(); i++) {
                        CTPivotCache ctPivotCache = ctPivotCacheList.get(i);
                        ctPivotCacheIdList.add(new Long(ctPivotCache.getCacheId()));
                    }

                    long firstPivotCacheId = firstPivot.getCTPivotTableDefinition().getCacheId();
                    for (int i = ctPivotCacheIdList.size() - 1; i >= 0; i--) {
                        if (ctPivotCacheIdList.get(i) != firstPivotCacheId) {
                            ctPivotCacheList.remove(i);
                        }
                    }

                    secondPivot.getCTPivotTableDefinition().setCacheId(firstPivotCacheId);
                    secondPivot.setPivotCache(firstPivot.getPivotCache());
                    thirdPivot.getCTPivotTableDefinition().setCacheId(firstPivotCacheId);
                    thirdPivot.setPivotCache(firstPivot.getPivotCache());
}

谢谢大家

 类似资料:
  • 我们正在使用.NET的StackExchange Redis客户端。 PS:我们尝试使用廉价的250GB(共享基础设施),但性能非常慢。读操作在600-800ms之间是一致的。不加载(对于一个~300KB的对象)。升级到专用的1GB服务将其更改为30-40毫秒。在这里查看更多:带有Azure Redis的StackExchange.Redis速度慢或引发超时错误

  • 问题内容: 我正在评估Kubernetes作为我们新应用程序的平台。现在,一切看起来都非常令人兴奋!但是,我遇到了一个问题:我将群集托管在GCE上,并且需要某种机制在两个Pod之间共享存储(连续集成服务器和应用程序服务器)。用kubernetes做到这一点的最佳方法是什么?这些卷类型似乎都不符合我的需求,因为如果一个Pod需要写入GCE磁盘,则无法共享。NFS是完美的,但似乎需要为kubernet

  • 问题内容: 我们遇到了适用于多线程的方案。 在主线程中,执行一些逻辑操作并更新数据库,在某种程度上,它将调用另一个服务来更新数据库,该服务在另一个线程中运行。 我们希望两个线程共享同一个事务,这意味着任何一个线程中的任何一个操作都将失败,那么另一个线程中的该操作也将被回滚。 但是工作了几天,我发现一些帖子说JTA不支持多线程。当前我们使用Bitronix作为JTA提供者,有没有人知道Bitroni

  • 我很想知道Hibernate二级缓存是否可以在运行在两个不同JVM上的两个不同Hibernate会话之间共享。 我正在使用Hibernate 3.1和Ehcache来提供二级缓存,并且在Ehcache中。xml配置文件我们可以指定在磁盘上创建缓存的位置 因此,如果我现在在不同的JVM中打开两个不同的Hibernate会话,它们都指向同一个JVM,那么这将允许我在两个JVM之间共享二级缓存。 如果是

  • 问题内容: 我是Go菜鸟,无法找到在Go中打开mysql连接然后在http处理程序之间共享它的完整示例。到目前为止,这是我的代码,如何使用在HomeHandler中的main()中打开的db连接? 问题答案: 数据库/ sql程序包会自动为您管理连接池。 返回 代表连接池 而不是单个连接的句柄。如果池中的所有连接都忙,则数据库/ sql软件包会自动打开一个新连接。 将其应用于代码意味着,您只需要共

  • 问题内容: 我正在尝试在多次战争之间共享错误页面(error.xhtml)。它们都在一个大耳朵的应用程序中,并且都使用一个通用的jar库,我想在其中放置它。 错误页面应使用web.xml或更好的web-fragment.xml,并将其声明为标准的Java ee错误页面。 实际的EAR结构: 仅将错误页面放在META-INF / resources下是行不通的,因为它不是资源。 我希望在每个war文