[]
您可以通过以下任务修改工作表中添加的透视表的设置:
数据透视表的字段可以使用 IPivotCaches 接口和 IPivotTables 接口的方法进行配置,如下面的示例代码所示。
Object sourceData = new Object[][] { { "Order ID", "Product", "Category", "Amount", "Date", "Country" },
{ 1, "Carrots", "Vegetables", 4270, new GregorianCalendar(2018, 0, 6), "United States" },
{ 2, "Broccoli", "Vegetables", 8239, new GregorianCalendar(2018, 0, 7), "United Kingdom" },
{ 3, "Banana", "Fruit", 617, new GregorianCalendar(2018, 0, 8), "United States" },
{ 4, "Banana", "Fruit", 8384, new GregorianCalendar(2018, 0, 10), "Canada" },
{ 5, "Beans", "Vegetables", 2626, new GregorianCalendar(2018, 0, 10), "Germany" },
{ 6, "Orange", "Fruit", 3610, new GregorianCalendar(2018, 0, 11), "United States" },
{ 7, "Broccoli", "Vegetables", 9062, new GregorianCalendar(2018, 0, 11), "Australia" },
{ 8, "Banana", "Fruit", 6906, new GregorianCalendar(2018, 0, 16), "New Zealand" },
{ 9, "Apple", "Fruit", 2417, new GregorianCalendar(2018, 0, 16), "France" },
{ 10, "Apple", "Fruit", 7431, new GregorianCalendar(2018, 0, 16), "Canada" },
{ 11, "Banana", "Fruit", 8250, new GregorianCalendar(2018, 0, 16), "Germany" },
{ 12, "Broccoli", "Vegetables", 7012, new GregorianCalendar(2018, 0, 18), "United States" },
{ 13, "Carrots", "Vegetables", 1903, new GregorianCalendar(2018, 0, 20), "Germany" },
{ 14, "Broccoli", "Vegetables", 2824, new GregorianCalendar(2018, 0, 22), "Canada" },
{ 15, "Apple", "Fruit", 6946, new GregorianCalendar(2018, 0, 24), "France" }, };
IWorksheet worksheet = workbook.getWorksheets().get(0);
worksheet.getRange("A1:F16").setValue(sourceData);
worksheet.getRange("A:F").setColumnWidth(15);
IPivotCache pivotcache = workbook.getPivotCaches().create(worksheet.getRange("A1:F16"));
IPivotTable pivottable = worksheet.getPivotTables().add(pivotcache, worksheet.getRange("H7"), "pivottable1");
worksheet.getRange("D2:D16").setNumberFormat("$#,##0.00");
worksheet.getRange("I9:O11").setNumberFormat("$#,##0.00");
worksheet.getRange("H:O").setColumnWidth(12);
// config pivot table's fields
IPivotField field_Category = pivottable.getPivotFields().get("Category");
field_Category.setOrientation(PivotFieldOrientation.RowField);
IPivotField field_Product = pivottable.getPivotFields().get("Product");
field_Product.setOrientation(PivotFieldOrientation.ColumnField);
IPivotField field_Amount = pivottable.getPivotFields().get("Amount");
field_Amount.setOrientation(PivotFieldOrientation.DataField);
IPivotField field_Country = pivottable.getPivotFields().get("Country");
field_Country.setOrientation(PivotFieldOrientation.PageField);
为了在数据透视表中添加字段函数,请参考下面的示例代码。
// Change or set data field's summarize function.
field_Amount.setFunction(ConsolidationFunction.Average);
为了管理透视表的字段级别,请参考下面的示例代码。
// Product in level 1.
IPivotField field_product = pivottable.getPivotFields().get("Product");
field_product.setOrientation(PivotFieldOrientation.RowField);
// Category in level 2.
IPivotField field_category = pivottable.getPivotFields().get("Category");
field_category.setOrientation(PivotFieldOrientation.RowField);
IPivotField field_Amount = pivottable.getPivotFields().get(3);
field_Amount.setOrientation(PivotFieldOrientation.DataField);
// Category will be in level 1 and product will be in level 2.
field_product.setPosition(1);
field_category.setPosition(0);
数据透视表中的总计有助于分析数据透视表中的数据的总计。通过设置IPivotTable接口的ColumnGrand和RowGrand属性的可见性,您可以显示或隐藏行或列字段的总计。这些属性接受布尔值,并在默认情况下设置为true。例如,如果希望只显示行的总计,则将RowGrand方法设置为true,将ColumnGrand设置为false。
请参阅以下示例代码,以管理总计字段的可见性设置。
// Set the PivotTable report to show grand totals for columns & rows
pivottable.setColumnGrand(true);
pivottable.setRowGrand(true);
透视表的显示可以使用LayoutRowType枚举更改为任何所需的布局。以下选项由此枚举提供:
CompactRow (默认布局)
OutlineRow
TabularRow
**注意:**如果LayoutRowType设置为TabularRow,则SubtotalLocationType枚举只能设置为Bottom。
参考下面的示例代码,将透视表的行轴布局设置为TabularRow。
// Set the PivotTable LayoutRowType to Tabular Row
pivottable.setRowAxisLayout(LayoutRowType.TabularRow);
数据透视表的不同布局使它在分析数据时更加灵活和方便。GcExcel支持以下数据透视表布局:
Compact form
Outline form
Tabular form
除此之外,您还可以选择插入空白行、设置小计的位置、显示所有项目或在透视表布局中重复任何项目。
参考下面的示例代码来设置透视表的布局和其他选项。
// Set pivot table layout
field_Category.setLayoutForm(LayoutFormType.Tabular);
field_Category.setLayoutBlankLine(true);
field_Country.setLayoutForm(LayoutFormType.Outline);
field_Country.setLayoutCompactRow(false);
// Set subtotal location
field_Country.setLayoutSubtotalLocation(SubtotalLocationType.Bottom);
field_Country.setShowAllItems(true);
有时,数据透视表字段不容易理解,因此可以重命名为有意义和容易理解的名称。参考下面的示例代码重命名透视表字段。
参考下面的示例代码重命名透视表字段。
// config pivot table's fields
IPivotField field_Date = pivottable.getPivotFields().get("Date");
field_Date.setOrientation(PivotFieldOrientation.PageField);
IPivotField field_Category = pivottable.getPivotFields().get("Category");
field_Category.setOrientation(PivotFieldOrientation.RowField);
IPivotField field_Product = pivottable.getPivotFields().get("Product");
field_Product.setOrientation(PivotFieldOrientation.ColumnField);
IPivotField field_Amount = pivottable.getPivotFields().get("Amount");
field_Amount.setOrientation(PivotFieldOrientation.DataField);
field_Amount.setNumberFormat("$#,##0.00");
IPivotField field_Country = pivottable.getPivotFields().get("Country");
field_Country.setOrientation(PivotFieldOrientation.RowField);
// Renaming DataField "Sum of Amount" to "Amount Total"
pivottable.getDataFields().get(0).setName("Amount Total");
为了刷新数据透视表,请参考以下示例代码。
IPivotField field_Product = pivottable.getPivotFields().get("Product");
field_Product.setOrientation(PivotFieldOrientation.RowField);
IPivotField field_Amount = pivottable.getPivotFields().get(3);
field_Amount.setOrientation(PivotFieldOrientation.DataField);
// change pivot cache's source data.
worksheet.getRange("D8").setValue(3000);
// sync cache's data to pivot table.
worksheet.getPivotTables().get(0).refresh();
要修改透视表,请参考下面的示例代码。
// Defining source data
Object sourceData = new Object[][]
{
{ "Order ID", "Product", "Category", "Amount", "Date", "Country" },
{ 1, "Carrots", "Vegetables", 4270, new GregorianCalendar(2018, 0, 6),"United States" },
{ 2, "Broccoli", "Vegetables", 8239, new GregorianCalendar(2018, 0, 7),"United Kingdom" },
{ 3, "Banana", "Fruit", 617, new GregorianCalendar(2018, 0, 8),"United States" },
{ 4, "Banana", "Fruit", 8384, new GregorianCalendar(2018, 0, 10),"Canada" },
{ 5, "Beans", "Vegetables", 2626, new GregorianCalendar(2018, 0, 10),"Germany" },
{ 6, "Orange", "Fruit", 3610, new GregorianCalendar(2018, 0, 11),"United States" },
{ 7, "Broccoli", "Vegetables", 9062, new GregorianCalendar(2018, 0, 11),"Australia" },
{ 8, "Banana", "Fruit", 6906, new GregorianCalendar(2018, 0, 16),"New Zealand" },
{ 9, "Apple", "Fruit", 2417, new GregorianCalendar(2018, 0, 16),"France" },
{ 10, "Apple", "Fruit", 7431, new GregorianCalendar(2018, 0, 16),"Canada" },
{ 11, "Banana", "Fruit", 8250, new GregorianCalendar(2018, 0, 16),"Germany" },
{ 12, "Broccoli", "Vegetables", 7012, new GregorianCalendar(2018, 0, 18),"United States" },
{ 13, "Carrots", "Vegetables", 1903, new GregorianCalendar(2018, 0, 20),"Germany" },
{ 14, "Broccoli", "Vegetables", 2824, new GregorianCalendar(2018, 0, 22),"Canada" },
{ 15, "Apple", "Fruit", 6946, new GregorianCalendar(2018, 0, 24),"France" },
};
// Initialize workbook and fetch the default worksheet
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getWorksheets().get(0);
// Assigning data to the range
worksheet.getRange("A1:F16").setValue(sourceData);
// Creating pivot table and modifying it
IPivotCache pivotcache = workbook.getPivotCaches().create(worksheet.getRange("A1:F16"));
IPivotTable pivottable = worksheet.getPivotTables().add(pivotcache,
worksheet.getRange("I2"), "pivottable1");
worksheet.getRange("D2:D16").setNumberFormat("$#,##0.00");
worksheet.getRange("J4:J17, J9:J33").setNumberFormat("$#,##0.00");
// Configure pivot table's fields
IPivotField field_Product = pivottable.getPivotFields().get(1);
field_Product.setOrientation(PivotFieldOrientation.RowField);
IPivotField field_Category = pivottable.getPivotFields().get(2);
field_Category.setOrientation(PivotFieldOrientation.RowField);
IPivotField field_Amount = pivottable.getPivotFields().get(3);
field_Amount.setOrientation(PivotFieldOrientation.DataField);
// Modify subtotals for pivot field.
field_Category.setSubtotals(EnumSet.of(SubtotalType.Sum, SubtotalType.Count,
SubtotalType.Average,SubtotalType.Max, SubtotalType.Min, SubtotalType.CountNums,
SubtotalType.StdDev, SubtotalType.StdDevP,SubtotalType.Var, SubtotalType.VarP));
worksheet.getRange("E:E").setColumnWidth(12);
worksheet.getRange("J:J").setColumnWidth(20);
在GcExcel中,您可以通过对数据透视表应用各种计算函数多次向数据透视表中添加数据透视表字段。这些函数包括sum, average, min, max, count等。最终的透视表输出将基于应用于透视表字段的计算包含多个数据字段。
参考下面的示例代码,通过应用不同的计算函数将透视表字段添加为多个数据字段。
// Config pivot table's fields
IPivotField field_Category = pivottable.getPivotFields().get("Category");
field_Category.setOrientation(PivotFieldOrientation.RowField);
IPivotField field_Product = pivottable.getPivotFields().get("Product");
field_Product.setOrientation(PivotFieldOrientation.RowField);
// Sum function on Amount field
IPivotField field_Amount = pivottable.getPivotFields().get("Amount");
pivottable.addDataField(field_Amount, "sum amount", ConsolidationFunction.Sum);
// Count function on Amount field
IPivotField field_Amount2 = pivottable.getPivotFields().get("Amount");
pivottable.addDataField(field_Amount2, "count amount", ConsolidationFunction.Count);
以上示例代码在Excel中显示的结果如下:
数据透视表中的计算字段是指通过对基础数据源的现有数据字段应用附加逻辑或公式而创建的数据字段。当函数集计和自定义计算无法生成所需的输出时,这些字段尤其有用。例如,一家公司的员工数据库保存着关于每个员工现有工资和绩效评级的数据。年终时,通过使用薪资和评级字段创建计算字段,可以轻松计算员工的加薪。
在GcExcel中,getCalculatedFields 方法表示特定数据透视表中所有计算字段的集合。可以使用 ICalculatedFields 接口的add方法在数据透视表中创建新的计算字段。Add方法接受字段名和公式的字符串参数来生成计算字段。要从集合中删除计算字段,可以使用 remove 方法,该方法将目标字段名作为其参数。
请参考以下代码在数据透视表中创建计算字段:
IWorksheet calculatedFieldSheet = workbook.getWorksheets().add();
calculatedFieldSheet.setName("CalculatedField");
// Add pivot table.
IPivotCache pivotCache = workbook.getPivotCaches().create(worksheet.getRange("A1:F71"));
IPivotTable calculatedFieldTable = calculatedFieldSheet.getPivotTables().add(pivotCache, calculatedFieldSheet.getRange("A1"));
calculatedFieldTable.getPivotFields().get("Product").setOrientation(PivotFieldOrientation.RowField);
calculatedFieldTable.getPivotFields().get("Amount").setOrientation(PivotFieldOrientation.DataField);
// Add calculated field.
calculatedFieldTable.getCalculatedFields().add("Tax", "=IF(Amount > 1000, 3% * Amount, 0)");
// Set calculated field as data field.
calculatedFieldTable.getPivotFields().get("Tax").setOrientation(PivotFieldOrientation.DataField);
calculatedFieldTable.getDataFields().get("Sum of Amount").setNumberFormat("$#,##0_);($#,##0)");
calculatedFieldTable.getDataFields().get("Sum of Tax").setNumberFormat("$#,##0_);($#,##0)");
计算项是数据透视表项,使用包含常量的自定义公式或引用数据透视表中的其他项。这些项可以添加到数据透视表的行或列字段区域,但在源数据中不存在。
在GcExcel中,ICalculatedItems接口表示特定数据透视表中计算项的集合。您可以使用 IPivotField.getCalculatedItems 获取此数据透视项集合。ICalculatedItems 接口提供了 add 方法将计算项目添加到数据透视表中,该方法接受项的名称和公式作为参数。您也可以使用 IPivotItem.setFormula 方法设置计算项的公式。要从 ICalculatedItems 集合中删除计算项可以使用 remove 方法,该方法接受目标字段的名称作为参数。透视缓存管理所有计算项,因此更改计算项会影响当前工作簿中使用相同缓存的所有透视表。此外,计算项中的任何类型的添加、删除或更改都会触发透视表更新。
注意: 以下行为会抛出异常:
当数据透视表中存在计算项时,将相同字段添加到数据字段部分。
当数据字段具有两个或多个相同字段时,添加计算项。
添加具有已用名称的计算项。计算项的名称参数不区分大小写。因此,透视表认为 “Formula” 和 “formula” 名称相同。
请参考以下代码在数据透视表中创建计算项:
// Get the calculated item for the specified field
ICalculatedItems countryCalcItems = calculatedItemTable.getPivotFields().get("Country").getCalculatedItems();
ICalculatedItems productCalcItems = calculatedItemTable.getPivotFields().get("Product").getCalculatedItems();
// add some calculated items using formulas
countryCalcItems.add("Oceania", "=Australia+NewZealand");
countryCalcItems.add("America", "=Canada");
IPivotItem myPivotItem = countryCalcItems.add("Europe", "=France");
// Change the formula of the calculated item
myPivotItem.setFormula("=France+Germany");
// Add calculated item using constant value
productCalcItems.add("IPhone 13", "=2500");
// Get the calculatedItems count
System.out.println("Calculated Items count: " + countryCalcItems.getCount());
// Remove a calculated item
countryCalcItems.remove("America");
在分析电子表格数据时,您可能希望比较集计的结果,而不是比较原始数据中精确的值。例如,有很多方法可以评估销售员工的绩效。您可以将他的销售额与目标、销售额占总销售额的百分比或销售额与上个月的销售额等进行比较。为了方便地实现这些计算,GcExcel提供了“显示值为...”选项,允许您使用多个预定义公式(如母公司总销售额的百分比或总销售额的百分比)在数据透视表中执行自定义计算。
GcExcel Java 提供 IPivotField 接口的setCalculation 方法,该接口接受来自 PivotFieldCalculation 枚举的值,用于设置预定义的计算。还可以设置“基本字段”和“基本字段”项,以分别使用 setBaseField 和 setBaseItem 方法执行这些计算。
请参考以下示例代码,该代码以澳大利亚字段的百分比表示值。
IPivotTable percentOfTable = percentOfSheet.getPivotTables().add(pivotCache, percentOfSheet.getRange("A1"));
percentOfTable.getPivotFields().get("Category").setOrientation(PivotFieldOrientation.RowField);
percentOfTable.getPivotFields().get("Product").setOrientation(PivotFieldOrientation.RowField);
percentOfTable.getPivotFields().get("Country").setOrientation(PivotFieldOrientation.ColumnField);
percentOfTable.getPivotFields().get("Amount").setOrientation(PivotFieldOrientation.DataField);
// set show value as, base field, base item.
IPivotField percentOfTableDataField = percentOfTable.getDataFields().get("Sum of Amount");
percentOfTableDataField.setCalculation(PivotFieldCalculation.PercentOf);
percentOfTableDataField.setBaseField("Country");
percentOfTableDataField.setBaseItem("Australia");
percentOfSheet.getRange("A:I").autoFit();
在数据量巨大的情况下,通过在数据透视表的不同区域添加或移动字段来更新其布局时,数据透视表的性能可能会受到影响。
GcExcel提供了,setdeferlayouupdate方法,通过延迟布局更新来提高数据透视表的性能。当设置为true时,pivot表只有在所有字段被添加或移动后才重新计算,而不是在每次更改后重新计算。您可以选择在进行所有更改后通过调用update方法更新透视表输出。
请参阅下面的示例代码来推迟布局更新。
// Defer layout update
pivottable.setDeferLayoutUpdate(true);
// Config pivot table's fields
IPivotField field_Category = pivottable.getPivotFields().get("Category");
field_Category.setOrientation(PivotFieldOrientation.RowField);
IPivotField field_Product = pivottable.getPivotFields().get("Product");
field_Product.setOrientation(PivotFieldOrientation.ColumnField);
IPivotField field_Amount = pivottable.getPivotFields().get("Amount");
field_Amount.setOrientation(PivotFieldOrientation.DataField);
// Update the pivottable.
pivottable.update();
在数据透视表中,GcExcel支持以下布局和格式选项:
合并带有外行项、列项、小计和总计标签的单元格
设置紧凑行布局形式时数据透视表项的缩进
在数据透视表布局中排序页面字段。它可以是DownThenOver(默认值)或OverThenDown。.
定义透视表输出中每个列或行中页面字段的数量
在包含错误的单元格中显示自定义字符串
在包含空值的单元格中显示自定义字符串
参考下面的示例代码,在数据透视表中设置各种布局和格式选项。
pivottable.setPageFieldOrder(Order.OverThenDown);
pivottable.setPageFieldWrapCount(2);
pivottable.setCompactRowIndent(2);
pivottable.setErrorString("Error");
pivottable.setNullString("Empty");
pivottable.setDisplayErrorString(true);
pivottable.setDisplayNullString(true);
GcExcel支持使用自动排序方法对数据透视表中的数据字段进行排序,并定义升序或降序作为排序顺序。
还可以通过autoSortField方法获取用于对指定数据透视表字段进行排序的数据字段名,并通过autoSortOrder方法获取其排序顺序。项目在其字段中的位置也可以通过IPivotItem接口的setPosition或getPosition方法来设置或检索。
参考下面的示例代码对数据透视表中的“Product”字段进行排序。
// Sort the product items
field_Product.autoSort(SortOrder.Descending);
透视表报告的结构由不同的区域组成。为了检索特定范围的数据透视表,了解数据透视表的结构是很重要的。
从上面的截图可以看出,数据透视表的结构可以解释为:
PivotRowAxis: 数据透视表的行轴区域包含按行对表数据进行分组的字段
PivotColumnAxis: 数据透视表的列轴区域包含一些字段,这些字段将表中的数据按列划分为不同的类别。
Pivot Cell: 数据透视表中的任何单元格
Row PivotLine: 数据透视表行轴区域内的任何一行
**Column PivotLine:**数据透视表的列轴区域内的任何列
GcExcel提供了API来检索数据透视表的详细范围,从而对数据透视表应用任何操作或样式,使结果更易于阅读和区分。可以检索的详细数据透视表范围是:
不同类型的枢轴单元格,如小计、总计、数据字段、枢轴字段、值、空白单元格
不同类型的轴心线,如小计,总计,规则或空白行
整行或整列轴
整个页面区域
整个数据透视表报告,包括页面字段
任意数据透视表区域内的值
任意元素或枢轴线的位置
参考下面的示例代码,在透视表报告中获取特定的区域并设置其样式。
// Get detail range and set style.
for (IPivotLine item : pivottable.getPivotRowAxis().getPivotLines()) {
if (item.getLineType() == PivotLineType.Subtotal) {
item.getPivotLineCells().get(0).getRange().getInterior().setColor(Color.GetGreenYellow());
}
}
上面代码示例的输出在Excel中查看,如下所示:
**注意:**如果以任何方式更改了数据透视表,则应用于数据透视表的样式将丢失。
GcExcel Java提供了 GETPIVOTDATA 函数,该函数查询数据透视表以根据指定参数获取数据。使用此函数的主要优点是,它确保返回正确的数据,即使数据透视表布局已更改。
语法
=GETPIVOTDATA(data_field, pivot_table, [field1, item1, field2, item2],…)
GETPIVOTDATA 函数可以实现为返回单个单元格值或动态数组,具体取决于我们传递的参数。若要检索单个单元格值,数据字段的名称和数据透视表是必需参数。而第三个参数是字段名和项目名的组合,是可选的。然而,为了检索动态数组,所有三个参数都是必需的,并且项名称支持 {"Canada","US","France"} 等数组或A1:A3等范围引用。此外,您必须使用 IRange.setFormula2 用于 GETPIVOTDATA 函数,以返回在范围内溢出的动态数组。为了便于使用,您还可以使用 IRange.generateGetPivotDataFunction 方法自动生成 GETPIVOTDATA 函数。但是,当 IRange 对象不是单个单元格时,generateGetPivotDataFunction 方法返回 null。
返回单个单元格的 GETPIVOTDATA 函数的示例代码如下:
IWorksheet worksheet2 = workbook.getWorksheets().add();
worksheet.getRange("H25").setFormula(worksheet.getRange("G6").generateGetPivotDataFunction(worksheet2.getRange("A1")));
worksheet2.getRange("H24").setFormula("=GETPIVOTDATA(\"Amount\",Sheet1!$A$1,\"Category\",\"Mobile\",\"Country\",\"Australia\")");
Refer to the following example code for GETPIVOTDATA function returning a dynamic array:
// Here, Formula2 is used along with GETPIVOTDATA to fetch the multiple values
worksheet.getRange("H10").setFormula2("=GETPIVOTDATA(\"Amount\",$A$1,\"Category\",\"Consumer Electronics\",\"Country\",{\"Canada\",\"Germany\",\"France\"})");
请参考以下示例代码,通过设置单元格颜色,在数据透视表报表的最后一行中设置条件格式。
// set condional format to the last row
int rowCount = pivottable.getDataBodyRange().getRowCount();
IAboveAverage averageCondition = pivottable.getDataBodyRange().getRows().get(rowCount - 1).getFormatConditions()
.addAboveAverage();
averageCondition.setAboveBelow(AboveBelow.AboveAverage);
averageCondition.getInterior().setColor(Color.GetPink());
// save to an excel file
workbook.save("PTConditionalFormat.xlsx");
注意: 如果数据透视表以任何方式更改,则应用于数据透视表的条件格式将丢失。
默认情况下,数据透视表中的日期/时间列被分组在一起。GcExcel允许在创建数据透视表时,在创建数据透视缓存之前将setAutomaticGroupDateTimeInPivotTable方法设置为false来禁用此分组。
When AutomaticGroupDateTimeInPivotTable = False | When AutomaticGroupDateTimeInPivotTable = True (default) |
---|---|
请参考以下示例代码,以禁用日期/时间列的自动分组。
// Set false to group date/time fields in PivotTable automatically
workbook.getOptions().getData().setAutomaticGroupDateTimeInPivotTable(false);
GcExcel在IPivotItem接口中提供setShowDetail 方法,该方法允许展开或折叠透视表字段的大纲,方法默认值为True, 显示数据透视表字段的展开状态,设置为False时显示折叠状态。
请参阅以下示例代码以设置两个透视表字段的折叠状态
worksheet.getRange("F1:K16").setValue(sourceData);
worksheet.getRange("F:K").setColumnWidth(15);
IPivotCache pivotcache = workbook.getPivotCaches().create(worksheet.getRange("F1:K16"));
IPivotTable pivottable = worksheet.getPivotTables().add(pivotcache, worksheet.getRange("A1"), "pivottable1");
// Config pivot table's fields
IPivotField field_Date = pivottable.getPivotFields().get("Date");
field_Date.setOrientation(PivotFieldOrientation.PageField);
IPivotField field_Category = pivottable.getPivotFields().get("Category");
field_Category.setOrientation(PivotFieldOrientation.ColumnField);
IPivotField field_Country = pivottable.getPivotFields().get("Country");
field_Country.setOrientation(PivotFieldOrientation.RowField);
IPivotField field_Product = pivottable.getPivotFields().get("Product");
field_Product.setOrientation(PivotFieldOrientation.RowField);
IPivotField field_Amount = pivottable.getPivotFields().get("Amount");
field_Amount.setOrientation(PivotFieldOrientation.DataField);
field_Amount.setNumberFormat("$#,##0.00");
// Set not to show Canandian and German details.
field_Country.getPivotItems().get("Canada").setShowDetail(false);
field_Country.getPivotItems().get("Germany").setShowDetail(false);
worksheet.getRange("A:I").getEntireColumn().autoFit();
//save to an excel file
workbook.save("SetShowDetail.xlsx");