java:如何使用 apache poi 创建数据透视表?

2023-12-20

我正在尝试使用 apache poi 创建 Excel Pivot,但我不太明白如何创建我想要的格式。我使用此代码进行创建,但得到空值:

XSSFPivotTable pivotTable = sheet.createPivotTable(aref, pos);
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 2, colNames[2]);
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 3, colNames[3]);
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 0, colNames[0]);
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 1, colNames[1]);

我的数据如下所示:

我希望它看起来像这样:

我该如何实现这一目标?


Apache poi仅对创建数据透视表提供基本支持。它仅创建默认的数据透视表,但无法在不回退到底层的情况下创建特殊设置ooxml-schemas类。

对于您的数据源,以下代码创建什么apache poi默认支持:

import java.io.FileOutputStream;
import java.io.FileInputStream;

import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.usermodel.*;

class CreatePivotTableDefault {

 public static void main(String[] args) throws Exception {

  try (XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("ExcelSource.xlsx")); 
       FileOutputStream fileout = new FileOutputStream("ExcelResult.xlsx") ) {

   XSSFSheet dataSheet = workbook.getSheetAt(0);
   XSSFSheet pivotSheet = workbook.createSheet("Pivot");

   AreaReference areaReference = new AreaReference("A1:D5", SpreadsheetVersion.EXCEL2007);

   XSSFPivotTable pivotTable = pivotSheet.createPivotTable(areaReference, new CellReference("A1"), dataSheet);

   pivotTable.addRowLabel(2);
   pivotTable.addRowLabel(3);
   pivotTable.addRowLabel(0);
   pivotTable.addRowLabel(1);

   workbook.write(fileout);

  }

 }
}

这将创建一个大纲格式的数据透视表,这是默认的。

如果您想创建一个不是大纲格式并且不显示每个字段的小计的数据透视表,我们需要使用底层ooxml-schemas类。我们需要创建正确的数据透视表字段项。我们需要构建一个缓存定义,其中包含这些项目的共享元素。也可以看看Apache POI XSSFPivotTable setDefaultSubtotal https://stackoverflow.com/questions/37305976/apache-poi-xssfpivottable-setdefaultsubtotal/40480654#40480654.

以下代码应从数据源创建您想要的数据透视表:

import java.io.FileOutputStream;
import java.io.FileInputStream;

import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellReference;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotField;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.xssf.usermodel.*;

class CreatePivotTable {

 static void addRowLabel(XSSFPivotTable pivotTable, XSSFSheet dataSheet, AreaReference areaReference, int column) { 

  DataFormatter formatter = new DataFormatter(java.util.Locale.US);
  //create row label - apache poi creates as much fields for each as rows are in the pivot table data range
  pivotTable.addRowLabel(column);

  //determine unique labels in column
  java.util.TreeSet<String> uniqueItems = new java.util.TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
  for (int r = areaReference.getFirstCell().getRow()+1; r < areaReference.getLastCell().getRow()+1; r++) {
   uniqueItems.add(formatter.formatCellValue(dataSheet.getRow(r).getCell(column)));
  }
  //System.out.println(uniqueItems);

  //build pivot table and cache
  CTPivotField ctPivotField = pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(column);
  int i = 0;
  for (String item : uniqueItems) {
   //take the items as numbered items: <item x="0"/><item x="1"/>
   ctPivotField.getItems().getItemArray(i).unsetT();
   ctPivotField.getItems().getItemArray(i).setX((long)i);
   //build a cache definition which has shared elements for those items 
   pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(column)
    .getSharedItems().addNewS().setV(item);
   i++;
  }

  //set pivot field settings
  ctPivotField.setOutline(false); // no outline format
  ctPivotField.setDefaultSubtotal(false); // no subtotals for this field

  //remove further items
  if (ctPivotField.getDefaultSubtotal()) i++; //let one default item be if there shall be subtotals
  for (int k = ctPivotField.getItems().getItemList().size()-1; k >= i; k--) {
   ctPivotField.getItems().removeItem(k);
  }
  ctPivotField.getItems().setCount(i);

 }

 public static void main(String[] args) throws Exception {

  try (XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("ExcelSource.xlsx")); 
       FileOutputStream fileout = new FileOutputStream("ExcelResult.xlsx") ) {

   XSSFSheet dataSheet = workbook.getSheetAt(0);
   XSSFSheet pivotSheet = workbook.createSheet("Pivot");

   AreaReference areaReference = new AreaReference("A1:D5", SpreadsheetVersion.EXCEL2007);

   XSSFPivotTable pivotTable = pivotSheet.createPivotTable(areaReference, new CellReference("A1"), dataSheet);

   addRowLabel(pivotTable, dataSheet, areaReference, 2);
   addRowLabel(pivotTable, dataSheet, areaReference, 3);
   addRowLabel(pivotTable, dataSheet, areaReference, 0);
   addRowLabel(pivotTable, dataSheet, areaReference, 1);

   workbook.write(fileout);

  }

 }
}

此代码使用当前测试apache poi 4.1.2并需要所有模式的完整 jarooxml-schemas-1.4.jar(旧版本的较低版本)如中所述apache poi 常见问题解答-N10025 https://poi.apache.org/help/faq.html#faq-N10025.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java:如何使用 apache poi 创建数据透视表? 的相关文章

随机推荐

  • 在视图控制器之间传递行选择

    使用情节提要 我目前有一个静态的 Uitableview 当用户从父表视图中选择一行时 将显示一个新的表视图 其中显示一些选项 一旦用户从新表视图中选择一行 我想关闭该表并重新显示父视图控制器 并将用户选择显示在单元格中 几乎是表单的单选
  • WCF 传输安全:套接字连接已中止

    我在让交通安全工作方面遇到问题 我有 2 个服务 A 和 B 在同一台服务器上运行 服务A将调用服务B来执行某些任务 没有任何安全保障 我也可以很好地沟通 但是当我使用以下设置打开传输安全性时 安全模式 传输 传输 ClientCreden
  • 在 Android 中按像素滚动 ListView

    我想滚动 aListView在 Android 中按像素数 例如 我想将列表向下滚动 10 个像素 以便列表中的第一项隐藏其前 10 个像素行 我以为明显可见的scrollBy or scrollToListView 上的方法可以完成这项工
  • 如何在不终止解释器的情况下中断本机扩展代码?

    我正在开发一个项目 它将用 C 编写的高性能算法与 Python 接口相结合 C 类和函数通过 Cython 编译器包装并暴露给 Python 假设我从 Python 解释器调用一个长时间运行的本机函数 我首选的是 IPython 是否有可
  • VS2010数据库项目有表设计器吗?

    我在这里错过了什么吗 似乎在 VS2010 的数据库项目中创建新表的唯一选项是 创建一个表对象作为文件 然后将所有约束 默认 创建为单独的文件 然后将每个索引创建为单独的文件 并将主键创建为单独的文件 等等 Or 使用 SSMS 中的表设计
  • Qt:字段类型不完整

    无法编译我的课程 出现错误 错误 字段 文件名 的类型不完整 如果我改变QString filename to QString filename 错误消失 但我需要QString filename 进程 h ifndef PROCESS H
  • Android 对话框中的中心消息

    我希望对话框中的消息文本居中对齐 当然 您始终可以设置原始文本视图的重力 这使您不必担心格式和填充 例如 AlertDialog Builder builder new AlertDialog Builder this builder se
  • 为什么 tqdm 打印到换行符而不是更新同一行?

    我正在用 python 开发一个小型命令行游戏 其中使用 tqdm 模块显示进度条 我使用 msvcrt 模块监听用户输入来中断进度 一旦中断 用户可以通过在命令行提示符中输入 restart 来重新启动 第二次显示进度条时 它不会用进度更
  • 可变数量的依赖嵌套循环

    给定两个整数n and d 我想构造一个所有长度非负元组的列表d总而言之n 包括所有排列 这类似于整数划分问题 https stackoverflow com questions 10035752 elegant python code f
  • ASP.NET Core 模板 3.1.5 - serviceDependencies.json

    我刚刚更新了视觉工作室 2019并指出 在新的ASP NET Core MVC 的模板 3 1 5 有服务依赖关系 json目前在 ASP NET Core 文档中没有任何关于此的内容 而且我在 google 中也找不到任何内容 我明白 以
  • 检查 current_user 是否是资源的所有者并允许编辑/删除操作

    Example User A id 10 已创建photo资源 photo id 1 user id 10 url http 现在 如果用户B id 20 转到此网址 photos 1 edit它可以编辑用户的照片A 导轨 设计默认情况下为
  • 显示谓词子句每个目标的执行时间

    我想查看谓词目标内的执行时间SICStus 序言 例子 pred goal1 time goal2 time go call pred time go go times go 预期结果 time go times go 1000ms tim
  • SQL Server 转换因算术溢出而失败

    根据 SQL Server 2008 联机丛书中关于小数和数字数据类型的条目 精度为 p 精度 可存储的小数位数的最大总数 包括小数点左侧和右侧 精度必须是 1 到最大精度 38 之间的值 默认精度为 18 但是 下面的第二个选择失败 并显
  • Composer 在每个项目上都内存不足,Mac OS X

    我尝试安装aws aws sdk php昨天在我的一个使用 Composer 的 Laravel 4 项目中 我记不清具体的事件链 但它没有安装成功 从那时起 我一直收到 Composer 内存不足的错误 Fatal error Allow
  • 如何识别 T-SQL 中每个不同成员的多个开始和结束日期范围中的第一个间隙

    我一直在进行以下工作 但没有取得任何成果 而且截止日期很快就到了 此外 还有超过一百万行 如下所示 感谢您对以下内容的帮助 目标 按成员对结果进行分组 并通过组合彼此重叠或连续运行且在范围的开始日和结束日之间没有间断的各个日期范围 为每个成
  • 应用程序关闭时的 iOS 任务

    我正在构建一个通过 ajax 将文件上传到服务器的应用程序 问题是用户有时很可能没有互联网连接 而客户端希望将 ajax 调用安排在用户恢复连接的时间 用户可能会在离线时安排文件上传并关闭应用程序 当应用程序关闭时 不在后台 是否可以进行a
  • 用简单的英语来说什么是“网络服务”?

    我一直在 SO 维基百科 谷歌等上阅读有关 网络服务 的内容 但我不太明白它们是什么 简单的英语定义 描述是什么 如果我使用 PHP 制作一个简单的网站 比如说 将一个随机整数打印到页面上 这是一个 Web 服务 吗 如果没有 为什么不呢
  • 如何将 FormWizard 包装在视图中?

    如何包装 Django表单向导 http docs djangoproject com en dev ref contrib formtools form wizard 在一个视图中 我需要这样做才能访问request 有人有这方面的示例代
  • 将不同等级的张量相乘

    我想将两个具有不同等级的张量相乘 例如 tensor A gt i x j x k x l tensor B gt l x m 得到另一个具有这个尺寸的张量 tensor C gt i x j x k x m i x j x k x l l
  • java:如何使用 apache poi 创建数据透视表?

    我正在尝试使用 apache poi 创建 Excel Pivot 但我不太明白如何创建我想要的格式 我使用此代码进行创建 但得到空值 XSSFPivotTable pivotTable sheet createPivotTable are