+-
Java POI 4.0条形图示例不起作用
当我尝试apache poi4.0的项目示例时,遇到创建条形图的问题,运行代码后,我打开xlsx文件,错误为msg
Excel在“ xxx.xlsx”中发现了不可读的内容.您要恢复此工作簿的内容吗?如果您信任工作簿的来源,请单击“是”.
单击是,然后获取另一个消息
Excel能够通过修复或删除不可读的内容来打开文件.
删除的零件:/xl/drawings/drawing1.xml零件(绘图形状).
单击关闭,然后在Excel中未添加图表,但数据很好.
然后,我尝试使用lineChart和scatterChart示例,遇到同样的问题.
此错误的最可能原因是什么?如何解决此问题?
提前致谢. 🙂

enter image description here

package org.apache.poi.xssf.usermodel.examples;

import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xddf.usermodel.PresetColor;
import org.apache.poi.xddf.usermodel.XDDFColor;
import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
import org.apache.poi.xddf.usermodel.XDDFSolidFillProperties;
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
import org.apache.poi.xddf.usermodel.chart.ChartTypes;
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
import org.apache.poi.xddf.usermodel.chart.XDDFCategoryAxis;
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis;
import org.apache.poi.xssf.usermodel.XSSFChart;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


public class BarChart {

  public static void main(String[] args) throws IOException {
    try (XSSFWorkbook wb = new XSSFWorkbook()) {
      XSSFSheet sheet = wb.createSheet("barchart");
      final int NUM_OF_ROWS = 3;
      final int NUM_OF_COLUMNS = 10;

      // Create a row and put some cells in it. Rows are 0 based.
      Row row;
      Cell cell;
      for (int rowIndex = 0; rowIndex < NUM_OF_ROWS; rowIndex++) {
        row = sheet.createRow((short) rowIndex);
        for (int colIndex = 0; colIndex < NUM_OF_COLUMNS; colIndex++) {
          cell = row.createCell((short) colIndex);
          cell.setCellValue(colIndex * (rowIndex + 1));
        }
      }

      XSSFDrawing drawing = sheet.createDrawingPatriarch();
      XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);

      XSSFChart chart = drawing.createChart(anchor);
      XDDFChartLegend legend = chart.getOrAddLegend();
      legend.setPosition(LegendPosition.TOP_RIGHT);

      // Use a category axis for the bottom axis.
      XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
      XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
      leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);

      XDDFDataSource<Double> xs = XDDFDataSourcesFactory.fromNumericCellRange(sheet,
          new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
      XDDFNumericalDataSource<Double> ys1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet,
          new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
      XDDFNumericalDataSource<Double> ys2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet,
          new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));

      XDDFChartData data = chart.createData(ChartTypes.BAR, bottomAxis, leftAxis);
      data.addSeries(xs, ys1);
      data.addSeries(xs, ys2);
      chart.plot(data);

      XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.CHARTREUSE));
      XDDFChartData.Series firstSeries = data.getSeries().get(0);
      XDDFShapeProperties properties = firstSeries.getShapeProperties();
      if (properties == null) {
        properties = new XDDFShapeProperties();
      }
      properties.setFillProperties(fill);
      firstSeries.setShapeProperties(properties);

      // Write the output to a file
      try (FileOutputStream fileOut = new FileOutputStream("ooxml-bar-chart.xlsx")) {
        wb.write(fileOut);
      }
    }
  }
}
最佳答案
新的XDDF代码缺少在barChart中设置axIds的方法,以及缺少条形方向barDir的设置,条形图的方向可以是COL,条形图可以是BAR.

在/xl/charts/chart1.xml中,如下所示:

<c:barChart>
 <c:barDir val="bar"/>
 ...
 <c:axId val="0"/>
 <c:axId val="1"/>
</c:barChart>

对于条形图

<c:barChart>
 <c:barDir val="col"/>
 ...
 <c:axId val="0"/>
 <c:axId val="1"/>
</c:barChart>

柱形图.

做添加:

...
      chart.plot(data);

      chart.getCTChart().getPlotArea().getBarChartArray(0).addNewBarDir().setVal(
       //org.openxmlformats.schemas.drawingml.x2006.chart.STBarDir.COL);
       org.openxmlformats.schemas.drawingml.x2006.chart.STBarDir.BAR);
      chart.getCTChart().getPlotArea().getBarChartArray(0).addNewAxId().setVal(bottomAxis.getId());
      chart.getCTChart().getPlotArea().getBarChartArray(0).addNewAxId().setVal(leftAxis.getId());
...

而且至少会起作用.

轴设置也存在其他问题.这就是为什么我说条形图创建(仅使用高级类的Apache Poi)尚未准备好的原因.

点击查看更多相关文章

转载注明原文:Java POI 4.0条形图示例不起作用 - 乐贴网