我想将数据透视表值字段余额和的数字格式单元格设置为#
使用基于官方POI示例CreatePivotTable的代码创建的数据透视表
下面的代码可以创建和获取数据透视字段。但是如何设置它的数字格式呢?
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 2);
CTPivotField pivotField = pivotTable
.getCTPivotTableDefinition()
.getPivotFields()
.getPivotFieldArray(2);
在MS Excel中,这是按以下步骤进行的(请参见屏幕截图):
右键单击余额总和透视表值
- 选择字段设置
- 点击号码...
- 设置格式化单元格
请帮助决定,建议或任何想法。
透视表字段的格式由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 键并点按列,然后选择“设置列宽”或从“查看”菜单选择。然后,在“设置全部列宽”对话框输入列宽。 【提示】结果应用到所有列。 设置行高
使用以下的方法来设置表的格式: 【提示】表单视图仅支持显示或隐藏列。 移动列 用滑鼠的左键按住列标题。 移动鼠标到所需的位置。 释放滑鼠,列将会移动。 冻结已选择的列 如果表中有很多列,而你想冻结一或多个列来识别记录,只需简单地右击你想冻结的列并选择“显示”->“冻结已选择的列”或从“查看”菜单选择。 已冻结的列会移动到表网格的最左侧。这个动作会锁定已冻结的列,防止它们被编辑。 若要解除已冻结的列