gpt4 book ai didi

java - XSSF (POI) - 更改数据透视表上的字体

转载 作者:行者123 更新时间:2023-11-30 03:15:06 26 4
gpt4 key购买 nike

我正在使用 Apache POI 3.12:

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.12</version>
</dependency>

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.12</version>
</dependency>

如何更改数据透视表中的字体?将一个单元格 (I7) 的字体更改为 8pt 后检查生成的 .xlsx,显示以下更改:

styles.xml,在标签内作为第二个条目:

<font>
<sz val="8"/>
<color indexed="8"/>
<name val="Calibri"/>
<family val="2"/>
<scheme val="minor"/>
</font>

within the <cellXfs> tag as the 5th entry:
<xf numFmtId="0" fontId="1" fillId="0" borderId="0" xfId="0" applyNumberFormat="1" applyFont="1"/>

New tag: dxfs:
<dxfs count="1">
<dxf>
<font>
<sz val="8"/>
</font>
</dxf>
</dxfs>

数据透视表.xml

<formats count="1">
<format dxfId="0">
<pivotArea collapsedLevelsAreSubtotals="1" fieldPosition="0">
<references count="2">
<reference field="4294967294" count="1" selected="0">
<x v="0"/>
</reference>
<reference field="0" count="1">
<x v="0"/>
</reference>
</references>
</pivotArea>
</format>
</formats>

sheet1.xml

<c r="I7" s="4">

注意:我可能会将此作为 self 回答关闭,因为我仍在尝试自己解决它。然而,我已经这样做了将近一周了。 POI Pivot table sample

最佳答案

这是一个部分答案,因为它需要使用 excel 来设置而不是纯 poi。

一般步骤:

  1. 在 Excel 中创建带有数据透视表的电子表格或使用 sample对于 POI。
  2. 在 Excel 中打开电子表格并保存
  3. 在 poi 中打开电子表格。
  4. 创建 CTDxfs 条目。这是表格的“字体”。
  5. 使用 CTDXfs ID 创建一个 hubArea 定义。

进入代码:

private static CTFormats getFormats(XSSFPivotTable pivotTable) {
CTFormats formats = pivotTable.getCTPivotTableDefinition().getFormats();
if(formats==null)
formats=pivotTable.getCTPivotTableDefinition().addNewFormats();
return formats;
}
private static int createDXFs(XSSFWorkbook wb,int font) {
CTDxfs dxfs=wb.getStylesSource().getCTStylesheet().getDxfs();
if(dxfs==null)
dxfs=wb.getStylesSource().getCTStylesheet().addNewDxfs();
dxfs.setCount(dxfs.getCount()+1);
CTDxf dxf=dxfs.addNewDxf();
CTFontSize fontSize=dxf.addNewFont().addNewSz();
fontSize.setVal(font);
return (int) dxfs.getCount()-1;
}
public static void setAxisFont(CTFormats pivotTableFormats,int dxfId) {
CTFormat format=pivotTableFormats.addNewFormat();
format.setDxfId(dxfId);
CTPivotArea pivotArea = format.addNewPivotArea();
pivotArea.setDataOnly(false);
pivotArea.setLabelOnly(true);
pivotArea.setOutline(false);
pivotArea.setFieldPosition(0L);
pivotArea.setAxis(STAxis.AXIS_ROW);
pivotArea.setType(STPivotAreaType.BUTTON);
}
public static void setColHeaderFont(CTFormats pivotTableFormats,int dxfId,int colInd) {
CTFormat format=pivotTableFormats.addNewFormat();
format.setDxfId(dxfId);
CTPivotArea pivotArea = format.addNewPivotArea();
pivotArea.setDataOnly(false);
pivotArea.setLabelOnly(true);
pivotArea.setOutline(false);
CTPivotAreaReferences references = pivotArea.addNewReferences();
CTPivotAreaReference reference = references.addNewReference();

reference.setField(new Long(Integer.MAX_VALUE)*2);
CTIndex x = reference.addNewX();
x.setV(colInd); //Column
}
public static void setLabelFont(CTFormats pivotTableFormats,int dxfId, int rowInd) {
CTFormat format=pivotTableFormats.addNewFormat();
format.setDxfId(dxfId);
CTPivotArea pivotArea = format.addNewPivotArea();
pivotArea.setDataOnly(false);
pivotArea.setLabelOnly(true);
pivotArea.setFieldPosition(0L);
CTPivotAreaReferences references = pivotArea.addNewReferences();
CTPivotAreaReference reference = references.addNewReference();

reference.setField(0L);
CTIndex x = reference.addNewX();
x.setV(rowInd); //Row
}
public static void setDataElementFont(CTFormats pivotTableFormats,int dxfId,int col,int row) {
CTFormat format=pivotTableFormats.addNewFormat();
format.setDxfId(dxfId);
CTPivotArea pivotArea = format.addNewPivotArea();
//Default values, don't need to explicitly define.
//pivotArea.setDataOnly(true);
//pivotArea.setLabelOnly(false);
CTPivotAreaReferences references = pivotArea.addNewReferences();
CTPivotAreaReference reference = references.addNewReference();

reference.setField(new Long(Integer.MAX_VALUE)*2);
CTIndex x = reference.addNewX();
x.setV(col); //Column
reference = references.addNewReference();
reference.setField(0L);
x = reference.addNewX();
x.setV(row); //Row
}

注释:

  • 需要setOutline(false)才能访问列标题。
  • setDataOnly(false) 允许更改影响标签和数据。
  • setLabelOnly(true) 仅限制对标签值的更改。如果您想更改整个列/行,请设置为 false。
  • unsigned int max 值的引用字段值将引用定义为列,另一个有效值为 0,将引用定义为行。
  • 如果列/行引用未定义,例如在 setColHeaderFont/setLabel 字体中,它会影响整个列/行。这对于格式化特定列可能是理想的。

警告 poi 3.12 的 maven 使用的 poi-ooxml-schemas 不包括 CTFormat。这可以通过排除它并包含 1.1 版本来覆盖:

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.1</version>
</dependency>

关于java - XSSF (POI) - 更改数据透视表上的字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32828574/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com