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

如何使用Apache POI设置数据透视表字段编号格式单元格

陆绪
2023-03-14

我想将数据透视表值字段余额和的数字格式单元格设置为#

使用基于官方POI示例CreatePivotTable的代码创建的数据透视表

下面的代码可以创建和获取数据透视字段。但是如何设置它的数字格式呢?

pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 2);
CTPivotField pivotField = pivotTable
    .getCTPivotTableDefinition()
    .getPivotFields()
    .getPivotFieldArray(2);

在MS Excel中,这是按以下步骤进行的(请参见屏幕截图):

  1. 右键单击余额总和透视表值
  2. 选择字段设置
  3. 点击号码...
  4. 设置格式化单元格

请帮助决定,建议或任何想法。


共有1个答案

邢寒
2023-03-14

透视表字段的格式由CTDataField设置。setNumFmtId(长numFmtId)用于值和CTPivotField。setNumFmtId(长numFmtId)用于列

1 0    
2 0.00    
3 #,##0    
4 #,##0.00    
5 $#,##0_);($#,##0)    
6 $#,##0_);[Red]($#,##0)    
7 $#,##0.00_);($#,##0.00)    
8 $#,##0.00_);[Red]($#,##0.00)    
9 0%    
10 0.00%    
11 0.00E+00    
12 # ?/?    
13 # ??/??    
14 m/d/yyyy    
15 d-mmm-yy    
16 d-mmm    
17 mmm-yy    
18 h:mm AM/PM    
19 h:mm:ss AM/PM    
20 h:mm    
21 h:mm:ss    
22 m/d/yyyy h:mm    
37 #,##0_);(#,##0)    
38 #,##0_);[Red](#,##0)    
39 #,##0.00_);(#,##0.00)    
40 #,##0.00_);[Red](#,##0.00)    
45 mm:ss    
46 [h]:mm:ss    
47 mm:ss.0    
48 ##0.0E+0    
49 @    

MSDN NumberingFormat类中预定义格式代码的完整列表

下面是应用格式透视表字段的示例:

package ru.inkontext.poi;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.usermodel.DataConsolidateFunction;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.usermodel.XSSFPivotTable;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDataFields;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Optional;

public class CreatePivotTableSimple {

    private static void setFormatPivotField(XSSFPivotTable pivotTable,
                                                long fieldIndex,
                                                Integer numFmtId) {
        Optional.ofNullable(pivotTable
                .getCTPivotTableDefinition()
                .getPivotFields())
                .map(pivotFields -> pivotFields
                        .getPivotFieldArray((int) fieldIndex))
                .ifPresent(pivotField -> pivotField
                        .setNumFmtId(numFmtId));
    }

    private static void setFormatDataField(XSSFPivotTable pivotTable,
                                               long fieldIndex,
                                               long numFmtId) {
        Optional.ofNullable(pivotTable
                .getCTPivotTableDefinition()
                .getDataFields())
                .map(CTDataFields::getDataFieldList)
                .map(List::stream)
                .ifPresent(stream -> stream
                        .filter(dataField -> dataField.getFld() == fieldIndex)
                        .findFirst()
                        .ifPresent(dataField -> dataField.setNumFmtId(numFmtId)));
    }    

    public static void main(String[] args) throws IOException, InvalidFormatException {

        XSSFWorkbook wb = new XSSFWorkbook();
        XSSFSheet sheet = wb.createSheet();

        //Create some data to build the pivot table on
        setCellData(sheet);

        XSSFPivotTable pivotTable = sheet.createPivotTable(
                new AreaReference("A1:C6", SpreadsheetVersion.EXCEL2007),
                new CellReference("E3"));

        pivotTable.addRowLabel(1); // set second column as 1-th level of rows
        setFormatPivotField(pivotTable, 1, 9); //set format of row field numFmtId=9 0%
        pivotTable.addRowLabel(0); // set first column as 2-th level of rows
        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 2); // Sum up the second column
        setFormatDataField(pivotTable, 2, 3); //set format of value field numFmtId=3 # ##0

        FileOutputStream fileOut = new FileOutputStream("stackoverflow-pivottable.xlsx");
        wb.write(fileOut);
        fileOut.close();
        wb.close();
    }

    private static void setCellData(XSSFSheet sheet) {

        String[] names = {"Jane", "Tarzan", "Terk", "Kate", "Dmitry"};
        Double[] percents = {0.25, 0.5, 0.75, 0.25, 0.5};
        Integer[] balances = {107634, 554234, 10234, 22350, 15234};

        Row row = sheet.createRow(0);
        row.createCell(0).setCellValue("Name");
        row.createCell(1).setCellValue("Percents");
        row.createCell(2).setCellValue("Balance");

        for (int i = 0; i < names.length; i++) {
            row = sheet.createRow(i + 1);
            row.createCell(0).setCellValue(names[i]);
            row.createCell(1).setCellValue(percents[i]);
            row.createCell(2).setCellValue(balances[i]);
        }
    }
}

https://github.com/stolbovd/PoiSamples

 类似资料:
  • 我用来自数据源的工作表填充数据创建一个工作簿,然后用该数据的透视表视图创建第二个工作表。一切都很好,但我似乎无法更改透视表的默认外观。我试图在创建透视表时选中设置(行标签-->从列表中单击一个-->字段设置-->小计-->无和行标签-->从列表中单击一个-->字段设置-->布局和打印-->“以表格形式显示项标签”),但在POI中找不到句柄/标志。尝试在pivottable.getCTPivotta

  • 问题内容: 我想从Table1转换数据,如您在数据透视表中的第一张图片上所见。在MySQL中可以做到吗?因为数据透视表(A,B,C,D)的值是varchar数据格式,所以我不能使用MySQL的任何聚合函数(例如SUM或其他函数)。 谢谢你的帮助 问题答案: 静态查询(就Bob和Sue而言)可能看起来像这样 现在可以使用动态SQL来解释其他名称 输出: 这是 SQLFiddle 演示 您可以将其包装

  • 我正在 中使用 现在我遇到了表视图单元格高度的问题。我正在聊天屏幕上工作,所以我有文字,图像。所以我在管理屏幕的其中取了一个原型单元。现在下面是我的身高代码 因此,文本单元格没有得到我所期望的,但我不知道我的错误在哪里,还有一件事,如果我< code > returnuitableviewautomaticdimension ,它的工作很好的文本信息,而不是图像。请帮助我,先谢了。

  • 使用以下的方法来设置表的格式: 【提示】表单视图仅支持显示或隐藏列。 移动列 用滑鼠的左键按住列标题。 移动鼠标直到一条粗黑线出现在所需的位置。 释放滑鼠,列将会移动。 冻结已选择的列 如果表中有很多列,而你想冻结一或多个列来标识记录,只需简单地右击你想冻结的列并选择“显示”->“冻结已选择的列”或从“查看”菜单选择。 已冻结的列会移动到表网格的最左侧。这个动作会锁定已冻结的列,防止它们被编辑。

  • 使用以下的方法来设置表的格式: 【提示】表单视图仅支持显示或隐藏列。 移动列 用滑鼠的左键按住列标题。 移动滑鼠光标到所需的位置。 释放滑鼠,列将会移动。 设置列宽 按住列顶部的右边界并拖曳到左或右。 双击列顶部的右边界来调整为最适合列的宽度。 按住 Control 键并点按列,然后选择“设置列宽”或从“查看”菜单选择。然后,在“设置全部列宽”对话框输入列宽。 【提示】结果应用到所有列。 设置行高

  • 使用以下的方法来设置表的格式: 【提示】表单视图仅支持显示或隐藏列。 移动列 用滑鼠的左键按住列标题。 移动鼠标到所需的位置。 释放滑鼠,列将会移动。 冻结已选择的列 如果表中有很多列,而你想冻结一或多个列来识别记录,只需简单地右击你想冻结的列并选择“显示”->“冻结已选择的列”或从“查看”菜单选择。 已冻结的列会移动到表网格的最左侧。这个动作会锁定已冻结的列,防止它们被编辑。 若要解除已冻结的列