如何使用Apache Poi在折线图中设置轴的标签

我试图自动化使用Java和Apache POI创build报告。 我快到了,但是找不到如何在XSSFChart中设置轴的标签。

我已经find了如何设置图表标题( Apache POI设置Excel图表标题 )。 也许有类似的方法来解决它,但我不是开发人员,也不知道如何开始。

谁能帮忙?

我的代码到现在:

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); } 

我不确定你是否有答案。 我不确定你的问题是什么 我猜你想要设置轴标签,以便您的X轴从最低/最高点开始。 你可以使用这个

 bottomAxis.setCrosses(AxisCrosses.MIN) 

要么

 bottomAxis.setCrosses(AxisCrosses.MAX) 

你已经在你的代码中使用了这个:

 bottomAxis.setCrosses(AxisCrosses.AUTO_ZERO) 

尝试使用这种方法。

 public static void setAxisTitle(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(); } 

АлександрКушнир的答案是添加轴标题的好方法,但是他给出的方法需要进行一些修改。

//设置类别轴的标题

 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); 

//但是我没有find获取axisIdx的好方法。如果绘图区域中只有一个图表,可以像这样设置轴标题。

 setValueAxisTitle(xchart,0,"title of bottom axis"); setCatAxisTitle(xchart,0, "title of left axis");