我正在尝试使用java和Apache POI自动创建报告。我差不多了,但找不到如何在XSSFChart中设置轴标签。
我已经找到了如何设置图表的标题( Apache POI set Excel chart title)。也许有类似的方法可以解决它,但我不是开发人员,也不知道如何开始。
有人可以帮忙吗?
我的代码到目前为止:
public void grafico(String nomeplanilhadados, String nomeplanilhagrafico, Date datainicial, Date datafinal, String[] nomesmarcos, String titulo){
if (datainicial.after(datafinal)){
throw new IllegalArgumentException("A data inicial precisa anteceder a data final");
}
Sheet dados = this.wb.getSheet(nomeplanilhadados);
Sheet planilhagrafico = this.wb.getSheet(nomeplanilhagrafico);
Drawing drawing = planilhagrafico.createDrawingPatriarch();
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 4, 17, 20);
Chart chart = drawing.createChart(anchor);
ChartLegend legend = chart.getOrCreateLegend();
legend.setPosition(LegendPosition.TOP_RIGHT);
LineChartData data = chart.getChartDataFactory().createLineChartData();
// Use a category axis for the bottom axis.
ChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM);
bottomAxis.setNumberFormat("MMM/yyyy");
ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT);
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
//retrieve the data
int linhainicial=-1;
int linhafinal=-1;
Iterator<Row> rowIterator = dados.iterator();
while(rowIterator.hasNext()){
Row row = rowIterator.next();
Cell cell = row.getCell(0);
if(cell!=null){
SimpleDateFormat formatodata = new SimpleDateFormat("dd-MM-yyyy");
Date date=cell.getDateCellValue();
if (linhainicial==-1 && date.compareTo(datainicial)>=0){
linhainicial=cell.getRowIndex();
}
if( date.compareTo(datafinal)<=0){
linhafinal=cell.getRowIndex();
}
}
}
ChartDataSource<Number> xs = DataSources.fromNumericCellRange(dados, new CellRangeAddress(linhainicial, linhafinal, 0, 0));
Row primeiralinha = dados.getRow(0);
Iterator<Cell> cellIterator = primeiralinha.iterator();
while(cellIterator.hasNext()){
Cell cell=cellIterator.next();
if(cell!=null && Arrays.asList(nomesmarcos).contains(cell.getStringCellValue())){
ChartDataSource<Number> ys1 = DataSources.fromNumericCellRange(dados, new CellRangeAddress(linhainicial, linhafinal, cell.getColumnIndex(), cell.getColumnIndex()));
//data.addSerie(xs, ys1);
LineChartSerie chartSerie = data.addSerie(xs, ys1);
chartSerie.setTitle(cell.getStringCellValue());
}
}
XSSFChart xchart = (XSSFChart) chart;
CTChart ctChart = xchart.getCTChart();
CTTitle title = ctChart.addNewTitle();
CTTx tx = title.addNewTx();
CTTextBody rich = tx.addNewRich();
rich.addNewBodyPr(); // body properties must exist, but can be empty
CTTextParagraph para = rich.addNewP();
CTRegularTextRun r = para.addNewR();
r.setT(titulo);
chart.plot(data, bottomAxis, leftAxis);
}
答案 0 :(得分:0)
我不确定你是否得到了答案。我不确定你的问题是什么。 我猜你想要设置轴标签,以便你的x轴从最低/最高点开始。你可以用这个
bottomAxis.setCrosses(AxisCrosses.MIN)
或
bottomAxis.setCrosses(AxisCrosses.MAX)
您已在代码中使用过此代码:
bottomAxis.setCrosses(AxisCrosses.AUTO_ZERO)
答案 1 :(得分:0)
АлександрКушнир的答案是添加轴标题的好方法,但他给出的方法需要一些修改。
//设置类别轴的标题
public static void setCatAxisTitle(XSSFChart chart, int axisIdx, String title) {
CTCatAx valAx = chart.getCTChart().getPlotArea().getCatAxArray(axisIdx);
CTTitle ctTitle = valAx.addNewTitle();
ctTitle.addNewLayout();
ctTitle.addNewOverlay().setVal(false);
CTTextBody rich = ctTitle.addNewTx().addNewRich();
rich.addNewBodyPr();
rich.addNewLstStyle();
CTTextParagraph p = rich.addNewP();
p.addNewPPr().addNewDefRPr();
p.addNewR().setT(title);
p.addNewEndParaRPr();
}
public static void setValueAxisTitle(XSSFChart chart, int axisIdx, String title) {
CTValAx valAx = chart.getCTChart().getPlotArea().getValAxArray(axisIdx);
CTTitle ctTitle = valAx.addNewTitle();
ctTitle.addNewLayout();
ctTitle.addNewOverlay().setVal(false);
CTTextBody rich = ctTitle.addNewTx().addNewRich();
rich.addNewBodyPr();
rich.addNewLstStyle();
CTTextParagraph p = rich.addNewP();
p.addNewPPr().addNewDefRPr();
p.addNewR().setT(title);
p.addNewEndParaRPr();
}
//使用底轴的类别轴。
ChartAxis bottomAxis =chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM);
ValueAxis leftAxis =chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT);
//但我找不到获得axisIdx的好方法。如果绘图区域只有一个图表,你可以像这样设置轴标题。
setValueAxisTitle(xchart,0,"title of bottom axis");
setCatAxisTitle(xchart,0, "title of left axis");