我XSSF
用来在 Excel 中制作图表。
这些图表在 Microsoft Excel 中看起来非常好。
问题:
当我将图表导入 Google 表格时,图表不显示。
有没有办法来解决这个问题?
我注意到如果我在 Microsoft Excel 中制作图表并导入 Google 表格,它工作正常,我可以看到图表。当图表是通过 Apache POI 制作时,似乎会出现问题。
这是代码:
void createChart(
XSSFSheet sheet, String chartName, double max,
XDDFDataSource<String> cat, XDDFNumericalDataSource<Double> val
) {
try {
final int graphRow1 = 6;
final int graphRow2 = 33;
final int graphCol1 = 4;
final int graphCol2 = 22;
final int logoRow1 = 30;
final int logoRow2 = 33;
final int logoCol1 = 19;
final int logoCol2 = 21;
XSSFDrawing drawing = sheet.createDrawingPatriarch();
XSSFClientAnchor anchor = drawing.createAnchor(
0, 0, 0, 0, graphCol1, graphRow1, graphCol2, graphRow2
);
XSSFChart chart = drawing.createChart(anchor);
chart.setTitleText(chartName);
chart.setTitleOverlay(false);
chart.getCTChart().getTitle()
.getTx()
.getRich()
.getPArray(0)
.getRArray(0)
.getRPr().setSz(1400);
CTRegularTextRun secondText = chart.getCTChart().getTitle()
.getTx()
.getRich()
.addNewP()
.addNewR();
secondText.setT("Net Analysis");
secondText.addNewRPr().setSz(1050);
secondText.getRPr().setI(true);
chart.getFormattedTitle().getParagraph(0).setTextAlignment(TextAlignment.CENTER);
chart.getFormattedTitle().getParagraph(1).setTextAlignment(TextAlignment.CENTER);
XDDFCategoryAxis leftAxis = chart.createCategoryAxis(AxisPosition.LEFT);
XDDFValueAxis bottomAxis = chart.createValueAxis(AxisPosition.BOTTOM);
bottomAxis.setTitle("Volume");
bottomAxis.setCrossBetween(AxisCrossBetween.BETWEEN);
XDDFBarChartData data =
(XDDFBarChartData) chart.createData(ChartTypes.BAR, leftAxis, bottomAxis);
data.setBarDirection(BarDirection.BAR);
data.setVaryColors(true);
XDDFChartData.Series series = data.addSeries(cat, val);
series.setTitle("", null);
chart.plot(data);
chart.getCTChartSpace()
.addNewSpPr()
.addNewSolidFill()
.addNewSrgbClr()
.setVal(HexConverter.parseHexBinary("52c3ba"));
//needed for image
//allows to modify anchor otherwise the anchor will resize chart.
drawing.createGroup(anchor);
int dx = Units.EMU_PER_CHARACTER * 6;
int dy = 3 * Units.EMU_PER_CHARACTER / 2;
anchor.setDx1(dx);
anchor.setDx2(dx);
anchor.setDy1(dy);
anchor.setDy2(dy);
anchor.setCol1(logoCol1);
anchor.setCol2(logoCol2);
anchor.setRow1(logoRow1);
anchor.setRow2(logoRow2);
drawing.createPicture(anchor, 0);
double tickMarkInterval = max % 20 == 0 ? max : max + (20 - (max % 20));
double maxUnit = tickMarkInterval / 20;
chart.getCTChart().getPlotArea().getBarChartArray(0).addNewGapWidth().setVal(10);
chart.getCTChart().getPlotArea().getValAxArray(0).addNewMajorUnit().setVal(maxUnit);
double scaleMax = max % maxUnit == 0 ? max : max + (maxUnit - (max % maxUnit));
chart.getCTChart().getPlotArea().getValAxArray(0).getScaling().addNewMax().setVal(scaleMax);
} catch (Exception e) {
e.printStackTrace();
}
}
cat 和 val 在这里制作
XDDFDataSource<String> cat =
XDDFDataSourcesFactory.fromArray((String[]) categoryList.toArray());
XDDFNumericalDataSource<Double> val =
XDDFDataSourcesFactory.fromArray((Double[]) valueList.toArray());
XLSX 的布局如下:
第 1 行有类别 A。
第 2 行有子类别 A1
第 3 行有子类别 A2
第 4 行有子类别 A3
第 5 行有总 A
第 7 行具有 B 类。
第 8 行具有子类别 B1
第 9 行具有子类别 B2
第 10 行具有子类别 B3
第 11 行具有 B 总数
该图表应该包含类别 A 和 B 的名称,以及 A 和 B 的总和。所以我认为这在谷歌表格中不起作用?