我正在尝试在第三个字段上创建过滤器,该字段不包含在行/列中,并且该字段是整数。对于字符串,我可以创建它并且它工作正常,但对于整数它不起作用。
下面是从一篇文章中引用的示例代码,用于创建整数值的示例:
import java.io.FileOutputStream;
import org.apache.poi.ss.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.xssf.usermodel.*;
class PivotIntegerFilter {
public static void main(String[] args) throws Exception {
try (Workbook workbook = new XSSFWorkbook();
FileOutputStream fileout = new FileOutputStream("D:\\user\\temp\\pivottable.xlsx")) {
Sheet pivotSheet = workbook.createSheet("Pivot");
Sheet dataSheet = workbook.createSheet("Data");
setCellData(dataSheet, workbook);
AreaReference areaReference = new AreaReference("A1:E5", SpreadsheetVersion.EXCEL2007);
XSSFPivotTable pivotTable = ((XSSFSheet) pivotSheet).createPivotTable(areaReference, new CellReference("A4"), dataSheet);
pivotTable.addReportFilter(1);
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 2);
DataFormat dataformat = workbook.createDataFormat();
short numFmtId = dataformat.getFormat("0");
pivotTable.getCTPivotTableDefinition().getDataFields().getDataFieldArray(1).setNumFmtId(numFmtId);
java.util.TreeSet<Integer> uniqueItems = new java.util.TreeSet<Integer>();
for (int r = areaReference.getFirstCell().getRow() + 1; r < areaReference.getLastCell().getRow() + 1; r++) {
uniqueItems.add((int) dataSheet.getRow(r).getCell(1).getNumericCellValue());
}
int i = 0;
short numFmtId1 = dataformat.getFormat("0");
pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).setNumFmtId(numFmtId1);
for (Integer item : uniqueItems) {
pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).getItems().getItemArray(i).unsetT();
pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).getItems().getItemArray(i).setX((long) i);
int y = item.intValue();
//CTNumber c = pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems().addNewN();
//c.set(XmlObject.Factory.newValue(Integer.toString((int) y)));
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems().addNewS().setV(Integer.toString(y));
if (!"3".equals(item.toString())) {
pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).getItems().getItemArray(i).setH(true);
}
// pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).setNumFmtId(numFmtId1);
i++;
}
pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).setMultipleItemSelectionAllowed(true);
workbook.write(fileout);
}
}
static void setCellData(Sheet sheet, Workbook workbook) {
XSSFRow row;
XSSFCell cell;
Object[][] data = new Object[][]{
new Object[]{"PARTY", "SNO", "VOTES", "Total Count", "Total Absent"},
new Object[]{"REPUBLICAN", 1, 10d, "?", "?"},
new Object[]{"DEMOCRAT", 3, 5d, "?", "?"},
new Object[]{"AMERICAN INDEP", 3, 10d, "?", "?"},
new Object[]{"DECLINED", 2, 10d, "?", "?"}
};
for (int r = 0; r < data.length; r++) {
row = (XSSFRow) sheet.createRow(r);
Object[] rowData = data[r];
for (int c = 0; c < rowData.length; c++) {
cell = row.createCell(c);
if (rowData[c] instanceof String) {
cell.setCellValue((String) rowData[c]);
} else if (rowData[c] instanceof Double) {
cell.setCellValue((Double) rowData[c]);
} else if (rowData[c] instanceof Integer) {
cell.setCellValue((int) rowData[c]);
DataFormat format = workbook.createDataFormat();
CellStyle integerCellStyle = workbook.createCellStyle();
integerCellStyle.setDataFormat(format.getFormat("0"));
cell.setCellStyle(integerCellStyle);
}
}
}
}
}
我正在尝试在 SNO 字段上创建过滤器,该字段不包含在行、列或值中。如果有人可以提供帮助,那就真的很有帮助了。
该示例似乎取自如何使用 poi 在数据透视表中设置行标签的默认值。我的回答解释了基础知识。
不同之处在于,该示例使用文本项进行过滤。您的示例需要数字项目进行过滤。
对于
sharedItems
中的文本项目 pivotCacheDefinition
- cacheFields
- cacheField
是 s
-项目。
对于
sharedItems
- pivotCacheDefinition
- cacheFields
中的数字项目 cacheField
是 n
项目。但是,虽然 sharedItems
具有 s
项目不需要进一步设置,但 sharedItems
具有 n
项目需要进一步设置有关数字类型的信息。例如:
<sharedItems containsSemiMixedTypes="false" containsString="false" containsNumber="true" containsInteger="true">
<n v="1"/>
<n v="2"/>
<n v="3"/>
</sharedItems>
代码差异:
对于文本项目:
for (String item : uniqueItems) {
...
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(0)
.getSharedItems().addNewS().setV(item);
...
}
对于数字项目:
for (Integer item : uniqueItems) {
...
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
.setContainsSemiMixedTypes(false);
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
.setContainsString(false);
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
.setContainsNumber(true);
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
.setContainsInteger(true);
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
.addNewN().setV(item);
...
}
完整示例:
import java.io.FileOutputStream;
import org.apache.poi.ss.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.xssf.usermodel.*;
class PivotIntegerFilter {
public static void main(String[] args) throws Exception {
try (Workbook workbook = new XSSFWorkbook();
FileOutputStream fileout = new FileOutputStream("./pivottable.xlsx")) {
Sheet pivotSheet = workbook.createSheet("Pivot");
Sheet dataSheet = workbook.createSheet("Data");
setCellData(dataSheet, workbook);
AreaReference areaReference = new AreaReference("A1:E5", SpreadsheetVersion.EXCEL2007);
XSSFPivotTable pivotTable = ((XSSFSheet) pivotSheet).createPivotTable(areaReference, new CellReference("A4"), dataSheet);
pivotTable.addRowLabel(0);
pivotTable.addReportFilter(1);
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 2);
java.util.TreeSet<Integer> uniqueItems = new java.util.TreeSet<Integer>();
for (int r = areaReference.getFirstCell().getRow() + 1; r < areaReference.getLastCell().getRow() + 1; r++) {
uniqueItems.add((int) dataSheet.getRow(r).getCell(1).getNumericCellValue());
}
int i = 0;
for (Integer item : uniqueItems) {
pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).getItems().getItemArray(i).unsetT();
pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).getItems().getItemArray(i).setX((long) i);
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
.setContainsSemiMixedTypes(false);
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
.setContainsString(false);
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
.setContainsNumber(true);
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
.setContainsInteger(true);
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
.addNewN().setV(item);
if (!(item == 3)) {
pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).getItems().getItemArray(i).setH(true);
}
i++;
}
pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).setMultipleItemSelectionAllowed(true);
workbook.write(fileout);
}
}
static void setCellData(Sheet sheet, Workbook workbook) {
Row row;
Cell cell;
Object[][] data = new Object[][]{
new Object[]{"PARTY", "SNO", "VOTES", "Total Count", "Total Absent"},
new Object[]{"REPUBLICAN", 1, 10d, "?", "?"},
new Object[]{"DEMOCRAT", 3, 5d, "?", "?"},
new Object[]{"AMERICAN INDEP", 3, 10d, "?", "?"},
new Object[]{"DECLINED", 2, 10d, "?", "?"}
};
for (int r = 0; r < data.length; r++) {
row = sheet.createRow(r);
Object[] rowData = data[r];
for (int c = 0; c < rowData.length; c++) {
cell = row.createCell(c);
if (rowData[c] instanceof String) {
cell.setCellValue((String) rowData[c]);
} else if (rowData[c] instanceof Double) {
cell.setCellValue((Double) rowData[c]);
} else if (rowData[c] instanceof Integer) {
cell.setCellValue((Integer) rowData[c]);
DataFormat format = workbook.createDataFormat();
CellStyle integerCellStyle = workbook.createCellStyle();
integerCellStyle.setDataFormat(format.getFormat("0"));
cell.setCellStyle(integerCellStyle);
}
}
}
}
}