当前位置: 首页 > 面试题库 >

如何更改由Apache Poi生成的图表以不使用平滑线并将空白单元格显示为间隙?

公孙智
2023-03-14
问题内容

我正在使用POI
3.12-beta1,并且具有在图例中创建具有多个数据集和命名系列的折线图的代码。但是,poi中折线图的默认设置会生成一条已在数据点上平滑的线。空值也被绘制为0,但是我们希望这些行在第一行有一个空单元格处停止。

将其呈现在xlsx文件中后,我可以进入图表属性并更改这些设置,但是我们需要使用这些设置来呈现xlsx。我无法在可用的API中找到任何东西来更改这些设置。

我将此示例类用作我的代码的起点,该代码位于
http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/LineChart
.java

        Drawing drawing = sheet.createDrawingPatriarch();
        ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 17, 18, 30);
        Chart chart = drawing.createChart(anchor);
        ChartLegend legend = chart.getOrCreateLegend();
        legend.setPosition(LegendPosition.RIGHT);
        LineChartData data = chart.getChartDataFactory().createLineChartData();
        ChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM);
        ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT);
        leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);

        int row = 2;
        int startCol = 3;
        int endCol = 17;
        boolean abs = false;
        ChartDataSource<Number> xs = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(row, row, startCol, endCol));

        row = 10;
        int seriesCol = 0;
        ChartDataSource<Number> ys1 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(row, row, startCol, endCol));
        LineChartSerie ser1 = data.addSerie(xs, ys1);
        ser1.setTitle(new CellReference(sheet.getSheetName(), row, seriesCol, abs, abs));

        row = 11;
        ChartDataSource<Number> ys2 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(row, row, startCol, endCol));
        LineChartSerie ser2 = data.addSerie(xs, ys2);
        ser2.setTitle(new CellReference(sheet.getSheetName(), row, seriesCol, abs, abs));

        row = 12;
        ChartDataSource<Number> ys3 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(row, row, startCol, endCol));
        LineChartSerie ser3 = data.addSerie(xs, ys3);
        ser3.setTitle(new CellReference(sheet.getSheetName(), row, seriesCol, abs, abs));

        chart.plot(data, new ChartAxis[] { bottomAxis, leftAxis });

问题答案:

感谢Etienne提供了将空白设置为空白的代码。我从POI开发人员那里得到了帮助,这是解决原始问题中提到的两个问题的解决方案

    XSSFChart chart = (XSSFChart)drawing.createChart(anchor);

    // this will set blank values as gaps in the chart so you 
    // can accurately plot data series of different lengths
    CTDispBlanksAs disp = CTDispBlanksAs.Factory.newInstance();
    disp.setVal(STDispBlanksAs.GAP);
    chart.getCTChart().setDispBlanksAs(disp);


    // setup chart, axes, data series, etc


    chart.plot(data, new ChartAxis[] { bottomAxis, leftAxis });

    // this must occur after the call to chart.plot above
    CTPlotArea plotArea = chart.getCTChart().getPlotArea();
    for (CTLineChart ch : plotArea.getLineChartList()) {
        for (CTLineSer ser : ch.getSerList()) {
            CTBoolean ctBool = CTBoolean.Factory.newInstance();
            ctBool.setVal(false);
            ser.setSmooth(ctBool);
        }
    }


 类似资料:
  • 我正在使用Apache POI读取零件编号电子表格中的数据。我在我们的数据库中查找零件编号,如果我们有零件的计算机辅助设计图纸,我将零件编号单元格涂成绿色,如果没有,我将其涂成红色。处理完成后,将保存电子表格。我遇到的问题是那列中的每个细胞都是绿色的。我已经完成了代码,查找零件号的逻辑工作正常,确定单元格应该是什么颜色以及设置颜色和填充的逻辑似乎也工作正常。知道我做错了什么吗? 谢谢

  • 问题内容: 我这里有两个div: 有没有办法在这两个div之间分隔空间? 问题答案: 您可以使用属性: HTML: CSS: 还有其他选择吗? 好吧 ,不是真的。 为什么? 属性不适用于元素。 属性不会在单元格的边缘之间创建空间。 属性破坏了能够与其父元素一样高的元素的预期行为。

  • 我正在使用Poi.jar从excel表输入,想知道如何检查单元格是否为空。 现在我使用下面的代码。

  • 在谷歌搜索StackOverflow之后,我还没有找到与这个问题相关的地方。目前我可以将空白单元格读取为空,但一次只能读取一个单元格。所以我必须写这样的东西: 这对我来说不太好,因为我对重复感到不满。我们可以设置返回?

  • 问题内容: 我正在使用我的一个MySQL数据库表作为实际表,其中一天的时间作为每一列,而一列称为day。您猜对了,在一天中表示星期几,而在其他单元格中则说当时发生了什么。 我想做的只是显示其中具有价值的单元格。就我而言,我总是要把所有的行和2列都填满。2列是“天”和“ 19:00”,但是将来我可能会添加“ 18:00”等值。 那么,如何仅选择其中包含数据的列和行呢?某种类型的“哪里:有数据”? 谢

  • 我有一个包含列的表:firstName、lastName和emailAddress