Я нарисовал гистограмму Excel, используя Openxml.CTChart
Apache POI.Диаграмма отлично работает под Linux (libreOffice) и Windows (MSOffice).Но диаграмма исчезает, когда файл открывается в MacOs / IOS, все остальные таблицы работают по-прежнему нормально.
Код длинный, я бы добавил его часть.Если вам нужна дополнительная информация, пожалуйста, скажите мне.
XSSFDrawing drawing = ((XSSFSheet) sheet).createDrawingPatriarch();
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, anchorRow, 15, anchorRow + 6 + 2 * dataSource.getTableNumber());
XSSFChart chart = drawing.createChart(anchor);
chart.getCTChartSpace().addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte) 0xff,
(byte) 0xff, (byte) 0xff});
// chart
CTChart ctChart = chart.getCTChart();
// plotArea
CTPlotArea ctPlotArea = ctChart.getPlotArea();
ctPlotArea.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte) 0xb3,
(byte) 0xb3, (byte) 0xb3});
// barChart
CTBarChart ctBarChart = ctPlotArea.addNewBarChart();
// barChart parameters
ctBarChart.addNewGrouping().setVal(STBarGrouping.STACKED);
ctBarChart.addNewBarDir().setVal(STBarDir.BAR);
ctBarChart.addNewVaryColors().setVal(false);
// ser (for each different component of total price)
for (int serIndex = 0; serIndex < 4; serIndex++) {
int columnIndex = serIndex + 1;
CTBarSer ctBarSer = ctBarChart.addNewSer();
// ser parameters
ctBarSer.addNewIdx().setVal(serIndex);
ctBarSer.addNewOrder().setVal(serIndex);
// tx
CTSerTx ctSerTx = ctBarSer.addNewTx();
CTStrRef ctStrRef = ctSerTx.addNewStrRef();
}
//telling the BarChart that it has axes and giving them Ids
ctBarChart.addNewAxId().setVal(123456);
ctBarChart.addNewAxId().setVal(123457);
//cat axis
CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
ctCatAx.addNewAxId().setVal(123456); //id of the cat axis
CTScaling ctScaling = ctCatAx.addNewScaling();
ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
ctCatAx.addNewDelete().setVal(false);
ctCatAx.addNewAxPos().setVal(STAxPos.B);
ctCatAx.addNewCrossAx().setVal(123457); //id of the val axis
ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
ctCatAx.addNewMajorTickMark().setVal(OUT);
ctCatAx.addNewMinorTickMark().setVal(NONE);
ctCatAx.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte) 0xb3,
(byte) 0xb3, (byte) 0xb3});
//val axis
CTValAx ctValAx = ctPlotArea.addNewValAx();
ctValAx.addNewAxId().setVal(123457); //id of the val axis
ctScaling = ctValAx.addNewScaling();
ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
ctValAx.addNewDelete().setVal(false);
ctValAx.addNewAxPos().setVal(STAxPos.L);
ctValAx.addNewCrossAx().setVal(123456); //id of the cat axis
ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
ctValAx.addNewMajorGridlines().addNewSpPr()
.addNewLn().addNewSolidFill().addNewSrgbClr()
.setVal(new byte[]{(byte) 0xb3,(byte) 0xb3, (byte) 0xb3});
ctValAx.addNewMajorTickMark().setVal(OUT);
ctValAx.addNewMinorTickMark().setVal(NONE);
ctValAx.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte) 0xb3,
(byte) 0xb3, (byte) 0xb3});
//legend
CTLegend ctLegend = ctChart.addNewLegend();
ctLegend.addNewLegendPos().setVal(STLegendPos.R);
ctLegend.addNewOverlay().setVal(false);
}
public byte[] generateExcel() {
ByteArrayOutputStream bos = null;
try {
bos = new ByteArrayOutputStream();
workbook.write(bos);
bos.close();
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
IOUtils.closeQuietly(bos);
}
return bos.toByteArray();
}
Контроллер:
@GetMapping("/generateXlsxReport")
public ResponseEntity<byte[]> generateReport() {
byte[] excel = svc.generateExcel();
HttpHeaders header = new HttpHeaders();
header.setContentType(new MediaType("application", "vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
header.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=my_file.xlsx");
header.setContentLength(excel.length);
return ResponseEntity.ok().headers(header).body(excel);
}
Что я должен сделать, чтобы сделать диаграмму совместимой на Mac?