XSSF (POI) - 将“公式”列添加到数据透视表

2023-12-28

我正在使用 POI 3.12-beta1:

<!-- Apache POI (for Excel) -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.12-beta1</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.12-beta1</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>ooxml-schemas</artifactId>
    <version>1.1</version>
</dependency>

我正在尝试创建一个计算数据透视表列,其定义为:= 'Ended' / 'Generated' * 100.

我继续在 Excel 中手动编辑工作表以使其正常工作,当我反转*.xlsx将文件放入 ZIP 目录并查看它,我在中找到了以下代码\xl\pivotCache\pivotCacheDefinition1.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<pivotCacheDefinition xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" r:id="rId1" refreshOnLoad="1" refreshedBy="vyasrav" refreshedDate="42110.580247453705" createdVersion="3" refreshedVersion="3" minRefreshableVersion="3" recordCount="352">
    <cacheSource type="worksheet">
        <worksheetSource ref="A1:O353" sheet="Data"/>
    </cacheSource>
    <cacheFields count="16">
        <!-- OMITTED -->
        <cacheField name="Avg Pct Processed" numFmtId="0" formula="'Ended' / 'Generated' * 100" databaseField="0"/>
    </cacheFields>
</pivotCacheDefinition>

因此,我回到我的 java 程序并添加以下代码来自动生成它,但它没有注册数据列“15”,并且我收到 IndexOutOfBounds 错误。

// Add pivot (pivot table):
Sheet pivotSheet = workbook.createSheet("Pivot");
LOGGER.trace("Created sheet: '" + String.valueOf(pivotSheet) + "'.");

XSSFPivotTable pivotTable = ((XSSFSheet)pivotSheet).createPivotTable(new AreaReference(tableRange), new CellReference("A1"), dataSheet);
CTPivotTableDefinition ctPivotTableDefinition = pivotTable.getCTPivotTableDefinition();
CTPivotTableStyle ctPivotTableStyle = ctPivotTableDefinition.getPivotTableStyleInfo();
ctPivotTableStyle.setName("PivotStyleMedium4");

// Row Labels:
pivotTable.addRowLabel(...); // ...
...

// Add column 15 (this is a calculated column):
CTCacheFields ctCacheFields = pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields();
CTCacheField ctCacheField = ctCacheFields.addNewCacheField();
ctCacheField.setName("Avg Pct Processed");
ctCacheField.setFormula("'Ended' / 'Generated' * 100");

// Column Labels:
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 8, "Sum of Generated");
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 12, "Sum of Ended");
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 13, "Sum of Unended");
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 15, "Average of Processed Percent");
...

上面粗体行上发生的 IndexOutOfBoundsException 的 StackTrace 是:


Exception in thread "main" java.lang.IndexOutOfBoundsException
    at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTPivotFieldsImpl.setPivotFieldArray(Unknown Source)
    at org.apache.poi.xssf.usermodel.XSSFPivotTable.addDataColumn(XSSFPivotTable.java:372)
    at org.apache.poi.xssf.usermodel.XSSFPivotTable.addColumnLabel(XSSFPivotTable.java:296)
    at com...  

有谁知道如何使用 POI 生成此列?

EDIT:

我尝试同时使用:

CTPivotTableDefinition ctPivotTableDefinition = pivotTable.getCTPivotTableDefinition();

and

CTCacheField ctCacheField = ctCacheFields.insertNewCacheField(15);

在任何一种情况下,当执行此行时我都会遇到相同的异常:

pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 15, "Average of Processed Percent");

请注意,我确实尝试注释掉添加新列标签的行,当我这样做时,如果我在 Excel 2010 中打开工作簿,则会在启动时收到以下错误消息:


Removed Feature: PivotTable report from /xl/pivotTables/pivotTable1.xml part (PivotTable view)
Removed Records: Workbook properties from /xl/workbook.xml part (Workbook)  

Thanks!


我通过以下方式解决了你的问题:

//... get or create pivotTable

//Use first column as row label
    pivotTable.addRowLabel(0);
// 1. Add Formula to cache
    addFormulaToCache(pivotTable);
// 2. Add PivotField for Formula column
    addPivotFieldForNewColumn(pivotTable);
// 3. Add all column labels before our function..
    pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 1);
    //Set the third column as filter
    pivotTable.addColumnLabel(DataConsolidateFunction.AVERAGE, 2);
// 4. Add formula column
    addFormulaColumn(pivotTable);

下面是方法的实现:

private static void addFormulaToCache(XSSFPivotTable pivotTable) {
    CTCacheFields ctCacheFields = pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields();
    CTCacheField ctCacheField = ctCacheFields.addNewCacheField();
    ctCacheField.setName("Field1"); // Any field name
    ctCacheField.setFormula("'Ended' / 'Generated' * 100");
    ctCacheField.setDatabaseField(false);
    ctCacheField.setNumFmtId(0);
    ctCacheFields.setCount(ctCacheFields.sizeOfCacheFieldArray()); //!!! update count of fields directly
}

private static void addPivotFieldForNewColumn(XSSFPivotTable pivotTable) {
    CTPivotField pivotField = pivotTable.getCTPivotTableDefinition().getPivotFields().addNewPivotField();
    pivotField.setDataField(true);
    pivotField.setDragToCol(false);
    pivotField.setDragToPage(false);
    pivotField.setDragToRow(false);
    pivotField.setShowAll(false);
    pivotField.setDefaultSubtotal(false);
}

private static void addFormulaColumn(XSSFPivotTable pivotTable) {
    CTDataFields dataFields;
    if(pivotTable.getCTPivotTableDefinition().getDataFields() != null) {
        dataFields = pivotTable.getCTPivotTableDefinition().getDataFields();
    } else {
        // can be null if we have not added any column labels yet
        dataFields = pivotTable.getCTPivotTableDefinition().addNewDataFields();
    }
    CTDataField dataField = dataFields.addNewDataField();
    dataField.setName("Avg Pct Processed");
    // set index of cached field with formula - it is the last one!!!
    dataField.setFld(pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCount()-1);
    dataField.setBaseItem(0);
    dataField.setBaseField(0);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XSSF (POI) - 将“公式”列添加到数据透视表 的相关文章

  • JavaEE 8 教程,在 hello1 项目上部署失败

    我正在尝试学习 Java EE 8 我遵循了官方指南https javaee github io tutorial https javaee github io tutorial 但我有这个问题 cargo maven2 plugin 1
  • JPanel透明背景和显示元素[重复]

    这个问题在这里已经有答案了 我插入一个背景图e 变成 aJPanel但一些界面元素消失了 以下 Java Swing 元素不会出现 标签标题 标签 usuario 标签 密码 按钮加速器 你能否使图像透明或元素不透明 setOpaque f
  • .java 和 .scala 类之间是否可能存在循环依赖?

    假设我在 java 文件中定义了类 A 在 scala 文件中定义了类 B A 类使用 B 类 B 类使用 A 类 如果我使用 java 编译器 则会出现编译错误 因为 B 类尚未编译 如果我使用scala编译器A类将找不到 有没有可以同时
  • 使用 jdbc 程序连接到 Open Office odb 文件

    我编写了以下代码来连接到 OpenOffice db String db C Documents and Settings hkonakanchi Desktop Test odb Class forName org hsqldb jdbc
  • JUnit 使用 Mockito 测试异步方法

    我已经使用 Spring Framework 版本 5 0 5 RELEASE 在 Java 1 8 类中实现了异步方法 public class ClassToBeTested Autowired private MyComponent
  • 如何在Spring的applicationContext.xml中指定默认范围来请求范围?

    我想让所有 bean 请求默认作用域 但是 Spring 文档说默认作用域是 Singleton 第 3 4 1 和 3 4 2 节http static springsource org spring docs 2 5 x referen
  • 删除 servlet 中的 cookie 时出现问题

    我尝试使用以下代码删除 servlet 中的 cookie Cookie minIdCookie null for Cookie c req getCookies if c getName equals iPlanetDirectoryPr
  • 如何在 OpenAPI 3.0 中定义字节数组

    我正在将 API 从 Swagger 2 0 迁移到 OpenAPI 3 0 在 DTO 中 我有一个指定为字节数组的字段 Swagger 对 DTO 的定义 Job type object properties body type str
  • 如何正确配置Tomcat SSLHostConfig?

    我正在按照本教程在 tomcat 中启用 ssl https medium com raupach how to install lets encrypt with tomcat 3db8a469e3d2 https medium com
  • Java:检查给定日期是否在当前月份内

    我需要检查给定的日期是否在当前月份 我编写了以下代码 但 IDE 提醒我getMonth https docs oracle com javase 7 docs api java util Date html getMonth and ge
  • 如何在具有动态列的表中插入值 Jdbc/Mysql

    我想在具有动态列的表中添加值 我设法创建一个包含动态列的表 但我不知道如何插入数据 Create Table sql CREATE TABLE MyDB myTable level INTEGER 255 int columnNumber
  • Java 的 QP 求解器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • getClassLoader().getResource() 返回 null

    我有这个测试应用程序 import java applet import java awt import java net URL public class Test extends Applet public void init URL
  • JSP 标签+ scriptlet。如何启用脚本?

    我有一个使用标签模板的页面 我的 web xml 非常基本 我只是想在页面中运行一些代码 不 我对标签或其他替代品不感兴趣 我想使用不好的做法 scriptlet 哈哈 到目前为止 我收到了 HTTP ERROR 500 错误 Script
  • Vertx HttpClient getNow 不工作

    我的 vertx HttpClient 有问题 下面的代码显示使用 vertx 和纯 java 测试 GET Vertx vertx Vertx vertx HttpClientOptions options new HttpClientO
  • 当容器大小更改时,JTable 仅调整选定列的大小

    对于面板内的 JTable 如果面板变大 我如何将额外的空间仅分配给某些列 在我的例子中 分配给最后一列 尽管提供 第 3 4 列和8 将获得额外的空间 我想允许用户手动更改所有列的列大小 我尝试了 table setAutoResizeM
  • 是什么原因导致“对象不是声明类的实例”? [复制]

    这个问题在这里已经有答案了 可能的重复 使用反射调用方法时 为什么会出现 对象不是声明类的实例 https stackoverflow com questions 7202988 why do i get object is not an
  • 如何计算文件中单词的长度?爪哇

    我正在尝试编写一个代码来计算文件中特定长度的单词数 例如 How are you 会打印 Proportion of 3 letter words 100 3 words 我想计算长度为 1 2 3 4 5 6 7 8 9 10 11 12
  • Android 中的字符串加密

    我正在使用代码进行加密和加密 它没有给出字符串结果 字节数组未转换为字符串 我几乎尝试了所有方法将字节数组转换为字符 但没有给出结果 public class EncryptionTest extends Activity EditText
  • 防止 Firebase 中的待处理写入事务不起作用

    我的目标是在单击按钮时将名称插入 Cloud Firestore 中 但如果用户未连接到互联网 我不希望保存处于挂起状态 我不喜欢 Firebase 保存待处理写入的行为 即使互联网连接已恢复 我研究发现Firebase 开发人员建议使用事

随机推荐

  • 更改 Drupal 的主题并保留 Garland 作为管理主题?

    如何在不更改管理主题 站点的 contrib 主题和管理界面的 Garland 的情况下将 contrib 主题应用到 Drupal 6 站点 Thanks 转到管理 gt 站点配置 gt 管理主题 在那里 您可以设置管理主题 如果您想对管
  • 使用 inno setup 卸载默认图标

    我正在使用 Inno setup 将卸载图标添加到 开始 菜单文件夹 using the Inno Setup Script Wizard example My program there is a default uninstall ic
  • 无论锁定状态如何写入锁定文件

    有没有办法写入锁定的文件 无论它打开哪个程序 进程 设想 作为服务运行的商业产品会锁定日志文件 服务不能停止 因为这会影响客户 想在文件末尾插入一行作为标记 出现错误 该进程无法访问该文件 因为该文件正在被另一个进程使用 有什么方法可以在锁
  • 如何从 C 文件中获取完整的汇编代码?

    我目前正在尝试找出从相应的 C 源文件生成等效汇编代码的方法 我使用 C 语言已经好几年了 但对汇编语言的经验很少 我能够使用以下命令输出汇编代码 S海湾合作委员会中的选项 然而 生成的汇编代码包含调用指令 这些指令又跳转到另一个函数 例如
  • ActiveRecord find_each 结合 limit 和 order

    我正在尝试使用 ActiveRecord 运行大约 50 000 条记录的查询find each方法 但它似乎忽略了我的其他参数 如下所示 Thing active order created at DESC limit 50000 fin
  • 什么时候在函数外部返回值使用移动与复制?

    读完这篇文章后question https stackoverflow com questions 11914691 copy elision move constructor not called when using ternary e
  • Facebook Open Graph API - og:元标签被忽略

    我正在解决页面标题和图像未包含在 Facebook 点赞中的问题 使用 OG 调试器后 看起来没有og Facebook 正在访问元标签 它说它正在推断og url and og title页面上存在的属性 作为测试 我直接从开发人员文档的
  • 类型错误:无法读取未定义的“想要”属性:

    我一整天都在使用 firebase 成功部署功能 学习如何使用它 我试图看看如果我初始化了另一个部署到同一个项目的目录并且没有任何问题 直到我更新了我的 npm 版本 现在每当我尝试部署时都会收到 发生意外错误 我尝试通过让我自己的用户成为
  • 如何在Listview的OnClickListener中获取被点击项目的位置?

    我想在列表视图上获取选定的列表视图项目 onclick 侦听器 现在我已经实施了onItemClickListener但是当我单击某个项目文本时 它就会被提升 我想在列表视图行单击时引发它 知道如何实现这一目标吗 要获取列表 onClick
  • C# 从 IP 地址字符串中删除尾随“\0”

    我通过 TCP 套接字收到了一个字符串 这个字符串看起来像这样 str 10 100 200 200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 我应该如何将其解析为 IP 地址 如果我这样做 IPAddress TryPa
  • Spring Cloud Stream 和 RabbitMQ 健康检查

    我有一个使用 Spring Cloud Stream Rabbit 和 Eureka Discovery Client 的简单 Spring Boot 应用程序 该应用程序与 Eureka Server 一起工作正常 并且通过 Rabbit
  • 当 WKExtension.scheduleBackgroundRefresh 应该调用 ScheduledCompletion 处理程序时?

    我正在尝试用这样的行安排后台任务 WKExtension shared scheduleBackgroundRefresh withPreferredDate Date timeIntervalSinceNow TimeInterval 5
  • 我应该向 Proxy.newProxyInstance(...) 提供哪个类加载器?

    我已阅读文档 但我仍然不明白应该提供哪个类加载器作为参数 我尝试了一些选项 但这似乎对编译或代理的行为没有影响 有点令人不安的是 我可以传递任何内容作为类加载器参数 包括null 并且代码仍然可以正常工作 谁能解释一下这一点 并告诉我如果我
  • Android NDK 上“__aeabi_ul2f”的多重定义(libgcc_real.a)

    我收到此错误multiple definition of aeabi ul2f 使用 CMake 在 Android 上编译大型项目时 显然 找到定义的地方之一是 libsmoltcp cpp interface rust a compil
  • 如何将 Spring 应用程序与 Mule ESB 集成

    我想将我的 spring 3 0 应用程序与 Mule ESB Mule3 集成 并为不同的客户端 Net GWT 等 提供这些服务 为了实现这一点 我是否应该将 Spring 应用程序部署为单独的组件并在 Mule 上定义 Endpoin
  • Symfony2.3 在控制器中获取 EntityManager 的更好方法

    我在用着Symfony2 3我目前使用 EntityManager 如下所示 构造 这是使用 EntityManager 的更好方法 构造 或在每个方法中使用 如图所示公共索引Action QuazBar controller class
  • 安装后Eclipse不会显示插件

    我一直在 Ubuntu 9 10 中使用 eclipse 没有任何问题 最近我升级到了10 04 似乎我的 eclipse文件夹被覆盖了 现在我尝试再次安装以前的插件 但是当我重新启动 Eclipse 时 它 们不会出现 我可以在 已安装的
  • 使用多列唯一索引与单散列列

    我有一个表 我需要为多个列提供唯一约束 但是 我还可以基于所有必需字段的散列引入一个额外的列 而不是创建多列唯一索引 那么就数据库性能而言 哪一种会更有效呢 MySQL 建议 https dev mysql com doc refman 5
  • 我应该如何将 scipy.fftpack 输出向量相乘?

    The scipy fftpack rfft函数将 DFT 作为浮点数向量返回 在实数部分和复数部分之间交替 这意味着要与 DFT 相乘 对于卷积 我将必须 手动 进行复杂的乘法 这看起来相当棘手 这一定是人们经常做的事情 我认为 希望有一
  • XSSF (POI) - 将“公式”列添加到数据透视表

    我正在使用 POI 3 12 beta1