有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何设置图表的文本方向以使用poi旋转所有文本?

在excel中,以下是我期望的结果,如下所示 enter image description here

在excel中,图表上有一个数据标签,显示的值默认为水平,我可以设置文本方向来旋转所有文本270中文本选项的格式数据标签。但是,我不知道如何用ApachePOI在代码中实现这一点?有人能帮忙吗

代码如下:

    XSSFDrawing drawing = (XSSFDrawing)sheet.createDrawingPatriarch();
    XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 4, 27, 5);
    XSSFChart chart = drawing.createChart(anchor);

    XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
    bottomAxis.setTitle("Week");
    XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
    leftAxis.setTitle("Face Amount ($MM)");
    leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN);
    leftAxis.setMaximum(10000);

    XDDFDataSource<Double> xs = XDDFDataSourcesFactory.fromNumericCellRange((XSSFSheet) sheet,
            new CellRangeAddress(299, 299, 0, NUM_OF_COLUMNS - 1));
    XDDFNumericalDataSource<Double> ys = XDDFDataSourcesFactory.fromNumericCellRange((XSSFSheet) sheet,
            new CellRangeAddress(300, 300, 0, NUM_OF_COLUMNS - 1));

    XDDFChartData data = chart.createData(ChartTypes.BAR, bottomAxis, leftAxis);
    XDDFChartData.Series series1 = data.addSeries(xs, ys);
    series1.setTitle("2x", null);

    chart.plot(data);

    XDDFBarChartData bar = (XDDFBarChartData) data;
    bar.setBarDirection(BarDirection.COL);
    bar.setGapWidth(3);
    bar.setBarGrouping(BarGrouping.STACKED);

    //set data labels
    XSSFChart xssfChart = (XSSFChart) chart;
    CTPlotArea plotArea = xssfChart.getCTChart().getPlotArea();
    CTBoolean ctBool = CTBoolean.Factory.newInstance();
    ctBool.setVal(true);
    plotArea.getBarChartArray(0).getSerArray(0).addNewDLbls().setShowVal(ctBool);
    plotArea.getBarChartArray(0).getSerArray(0).getDLbls().addNewShowLeaderLines();
    plotArea.getBarChartArray(0).getSerArray(0).getDLbls().setShowLeaderLines(ctBool);
    ctBool.setVal(false);
    plotArea.getBarChartArray(0).getSerArray(0).getDLbls().setShowSerName(ctBool);
    plotArea.getBarChartArray(0).getSerArray(0).getDLbls().setShowPercent(ctBool);
    plotArea.getBarChartArray(0).getSerArray(0).getDLbls().setShowLegendKey(ctBool);
    plotArea.getBarChartArray(0).getSerArray(0).getDLbls().setShowCatName(ctBool);
    plotArea.getBarChartArray(0).getSerArray(0).getDLbls().setShowLeaderLines(ctBool);
    plotArea.getBarChartArray(0).getSerArray(0).getDLbls().setShowBubbleSize(ctBool);

共 (1) 个答案

  1. # 1 楼答案

    正如您的代码所示,您正在使用apache poi的底层低级bean设置数据标签

    但是,如何才能与这些工作?没有关于org.openxmlformats.schemas.drawingml.x2006.chart.*公共类的文档可用。例如,我们需要从maven下载ooxml-schemas的源代码。然后我们可以使用javadoc创建API文档。现在我们可以看看如何创建和使用这些类

    但是我们还需要类正在创建的XML元素和属性的含义。为此,我们可以研究Office Open XML规范。但是我的首选方法是使用ExcelGUI创建一个简单的*.xlsx文件,该文件具有所需的设置。然后解压该*.xlsx文件并查看存储在该ZIP存档中的*.xml文件中的XML。对于第一个图表,这是/xl/charts/chart1.xml

    我们将发现:

    <c:dLbls>
     <c:txPr>
      <a:bodyPr rot="-5400000"/>
      <a:p><a:pPr><a:defRPr/></a:pPr></a:p>
     </c:txPr>
     ...
    </c:dLbls>
    

    用于设置文字旋转时的数据标签

    这是dLbls中的txPr(文本属性)元素,其bodyPr(主体属性)元素具有rot属性集。rot属性的值是旋转角度*60000。例如,-5400000是-90.00*60000。还有一个p(段落)元素,它有一个pPr(段落属性)元素,它有一个defRPr(默认运行属性),用于设置数据标签文本运行具有默认属性

    apache poi中使用的所有代码放在一起可以是:

    ...
    // text properties having rotation set
    plotArea.getBarChartArray(0).getSerArray(0).getDLbls().addNewTxPr()
     .addNewBodyPr().setRot((int)(-90.00 * 60000));
    // paragraph properties having default run properties set
    plotArea.getBarChartArray(0).getSerArray(0).getDLbls().getTxPr()
     .addNewP().addNewPPr().addNewDefRPr();
    ...
    

    其中plotArea与代码中的CTPlotArea相同。并且第一个系列必须使用addNewDLbls设置dLbls,就像您在代码中所做的那样